New upstream version 0.0~git20150811.0.6afa27f
Free Ekanayaka
7 years ago
0 | language: go | |
1 | ||
2 | go: | |
3 | - 1.4.2 | |
4 | ||
5 | install: | |
6 | - go get -u github.com/golang/lint/golint | |
7 | - go get -u golang.org/x/tools/cmd/cover | |
8 | - go get -u golang.org/x/tools/cmd/vet | |
9 | - go get -u golang.org/x/text/unicode/norm | |
10 | - test -z "$(go fmt)" | |
11 | - test -z "$(golint)" | |
12 | - test -z "$(go vet)" | |
13 | ||
14 | script: go test -v -bench=. && go test -covermode=atomic && go install | |
15 | ||
16 | sudo: false |
0 | The MIT License (MIT) | |
1 | ||
2 | Copyright (c) 2015 Nebulous | |
3 | ||
4 | Permission is hereby granted, free of charge, to any person obtaining a copy | |
5 | of this software and associated documentation files (the "Software"), to deal | |
6 | in the Software without restriction, including without limitation the rights | |
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
8 | copies of the Software, and to permit persons to whom the Software is | |
9 | furnished to do so, subject to the following conditions: | |
10 | ||
11 | The above copyright notice and this permission notice shall be included in all | |
12 | copies or substantial portions of the Software. | |
13 | ||
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
20 | SOFTWARE. | |
21 |
0 | # entropy-mnemonics | |
1 | ||
2 | mnemonics is a golang package that converts byte slices into human-friendly | |
3 | phrases. The primary purpose is to assist with the generation of | |
4 | cryptographically secure passwords. The threshold for a cryptographically | |
5 | secure password is between 128 and 256 bits, which when converted to base64 is | |
6 | 22-43 random characters. Random characters are both difficult to remember and | |
7 | subject to error when spoken or written down; slurring or sloppy handwriting | |
8 | can make it difficult to recover a password. | |
9 | ||
10 | These considerations may seem strange to those who use password managers; why | |
11 | write down the password at all? The answer is: healthy paranoia. Retaining a | |
12 | physical copy of a password protects the user from disk failure and malware. | |
13 | ||
14 | mnemonics solves these problems by converting byte slices into human-intelligible | |
15 | phrases. Take the following 128 bit example: | |
16 | ||
17 | ``` | |
18 | Hex: a26a4821e36c7f7dccaa5484c080cefa | |
19 | Base64: ompIIeNsf33MqlSEwIDO+g== | |
20 | Mnemonic: austere sniff aching hiding pact damp focus tacit timber pram left wonders | |
21 | ``` | |
22 | ||
23 | Though more verbose, the mnemonic phrase is less prone to human transcription errors. | |
24 | ||
25 | The words are chosen from a dictionary of size 1626, such that a 12-word phrase | |
26 | corresponds to almost exactly 128 bits of entropy. Note that only the first few | |
27 | characters of each word need be unique; for the English dictionary, 3 characters | |
28 | are sufficient. This means that passphrases can be altered to make them more | |
29 | understandable or more easily memorized. For example, the phrase "austere sniff aching" | |
30 | could be changed to "austere sniff achoo" and the phrase would still decode correctly. | |
31 | ||
32 | Full UTF-8 support is available for dictionaries, including input normalization | |
33 | for inputs with [canonical equivalence](https://en.wikipedia.org/wiki/Unicode_equivalence). | |
34 | ||
35 | ### Supported Dictionaries ### | |
36 | ||
37 | + English (prefix size: 3) | |
38 | + German (prefix size: 4) | |
39 | + Japanese (prefix size: 3) |
0 | package mnemonics | |
1 | ||
2 | // The english dictionary was pulled from the Monero project, license included | |
3 | // below. | |
4 | ||
5 | // Copyright (c) 2014-2015, The Monero Project | |
6 | // | |
7 | // All rights reserved. | |
8 | // | |
9 | // Redistribution and use in source and binary forms, with or without modification, are | |
10 | // permitted provided that the following conditions are met: | |
11 | // | |
12 | // 1. Redistributions of source code must retain the above copyright notice, this list of | |
13 | // conditions and the following disclaimer. | |
14 | // | |
15 | // 2. Redistributions in binary form must reproduce the above copyright notice, this list | |
16 | // of conditions and the following disclaimer in the documentation and/or other | |
17 | // materials provided with the distribution. | |
18 | // | |
19 | // 3. Neither the name of the copyright holder nor the names of its contributors may be | |
20 | // used to endorse or promote products derived from this software without specific | |
21 | // prior written permission. | |
22 | // | |
23 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY | |
24 | // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
25 | // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL | |
26 | // THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
27 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
28 | // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
29 | // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |
30 | // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF | |
31 | // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
32 | ||
33 | const ( | |
34 | // English is an id pointing to the standard password dictionary for | |
35 | // english users. | |
36 | English DictionaryID = "english" | |
37 | ||
38 | // EnglishUniquePrefixLen indicates the number of letters needed to achieve | |
39 | // unique prefixes throughout the english dictionary. No two words in the | |
40 | // dictionary have the same prefix of len EnglishUniquePrefixLen. | |
41 | EnglishUniquePrefixLen = 3 | |
42 | ) | |
43 | ||
44 | var ( | |
45 | englishDictionary = Dictionary{ | |
46 | "abbey", | |
47 | "abducts", | |
48 | "ability", | |
49 | "ablaze", | |
50 | "abnormal", | |
51 | "abort", | |
52 | "abrasive", | |
53 | "absorb", | |
54 | "abyss", | |
55 | "academy", | |
56 | "aces", | |
57 | "aching", | |
58 | "acidic", | |
59 | "acoustic", | |
60 | "acquire", | |
61 | "across", | |
62 | "actress", | |
63 | "acumen", | |
64 | "adapt", | |
65 | "addicted", | |
66 | "adept", | |
67 | "adhesive", | |
68 | "adjust", | |
69 | "adopt", | |
70 | "adrenalin", | |
71 | "adult", | |
72 | "adventure", | |
73 | "aerial", | |
74 | "afar", | |
75 | "affair", | |
76 | "afield", | |
77 | "afloat", | |
78 | "afoot", | |
79 | "afraid", | |
80 | "after", | |
81 | "against", | |
82 | "agenda", | |
83 | "aggravate", | |
84 | "agile", | |
85 | "aglow", | |
86 | "agnostic", | |
87 | "agony", | |
88 | "agreed", | |
89 | "ahead", | |
90 | "aided", | |
91 | "ailments", | |
92 | "aimless", | |
93 | "airport", | |
94 | "aisle", | |
95 | "ajar", | |
96 | "akin", | |
97 | "alarms", | |
98 | "album", | |
99 | "alchemy", | |
100 | "alerts", | |
101 | "algebra", | |
102 | "alkaline", | |
103 | "alley", | |
104 | "almost", | |
105 | "aloof", | |
106 | "alpine", | |
107 | "already", | |
108 | "also", | |
109 | "altitude", | |
110 | "alumni", | |
111 | "always", | |
112 | "amaze", | |
113 | "ambush", | |
114 | "amended", | |
115 | "amidst", | |
116 | "ammo", | |
117 | "amnesty", | |
118 | "among", | |
119 | "amply", | |
120 | "amused", | |
121 | "anchor", | |
122 | "android", | |
123 | "anecdote", | |
124 | "angled", | |
125 | "ankle", | |
126 | "annoyed", | |
127 | "answers", | |
128 | "antics", | |
129 | "anvil", | |
130 | "anxiety", | |
131 | "anybody", | |
132 | "apart", | |
133 | "apex", | |
134 | "aphid", | |
135 | "aplomb", | |
136 | "apology", | |
137 | "apply", | |
138 | "apricot", | |
139 | "aptitude", | |
140 | "aquarium", | |
141 | "arbitrary", | |
142 | "archer", | |
143 | "ardent", | |
144 | "arena", | |
145 | "argue", | |
146 | "arises", | |
147 | "army", | |
148 | "around", | |
149 | "arrow", | |
150 | "arsenic", | |
151 | "artistic", | |
152 | "ascend", | |
153 | "ashtray", | |
154 | "aside", | |
155 | "asked", | |
156 | "asleep", | |
157 | "aspire", | |
158 | "assorted", | |
159 | "asylum", | |
160 | "athlete", | |
161 | "atlas", | |
162 | "atom", | |
163 | "atrium", | |
164 | "attire", | |
165 | "auburn", | |
166 | "auctions", | |
167 | "audio", | |
168 | "august", | |
169 | "aunt", | |
170 | "austere", | |
171 | "autumn", | |
172 | "avatar", | |
173 | "avidly", | |
174 | "avoid", | |
175 | "awakened", | |
176 | "awesome", | |
177 | "awful", | |
178 | "awkward", | |
179 | "awning", | |
180 | "awoken", | |
181 | "axes", | |
182 | "axis", | |
183 | "axle", | |
184 | "aztec", | |
185 | "azure", | |
186 | "baby", | |
187 | "bacon", | |
188 | "badge", | |
189 | "baffles", | |
190 | "bagpipe", | |
191 | "bailed", | |
192 | "bakery", | |
193 | "balding", | |
194 | "bamboo", | |
195 | "banjo", | |
196 | "baptism", | |
197 | "basin", | |
198 | "batch", | |
199 | "bawled", | |
200 | "bays", | |
201 | "because", | |
202 | "beer", | |
203 | "befit", | |
204 | "begun", | |
205 | "behind", | |
206 | "being", | |
207 | "below", | |
208 | "bemused", | |
209 | "benches", | |
210 | "berries", | |
211 | "bested", | |
212 | "betting", | |
213 | "bevel", | |
214 | "beware", | |
215 | "beyond", | |
216 | "bias", | |
217 | "bicycle", | |
218 | "bids", | |
219 | "bifocals", | |
220 | "biggest", | |
221 | "bikini", | |
222 | "bimonthly", | |
223 | "binocular", | |
224 | "biology", | |
225 | "biplane", | |
226 | "birth", | |
227 | "biscuit", | |
228 | "bite", | |
229 | "biweekly", | |
230 | "blender", | |
231 | "blip", | |
232 | "bluntly", | |
233 | "boat", | |
234 | "bobsled", | |
235 | "bodies", | |
236 | "bogeys", | |
237 | "boil", | |
238 | "boldly", | |
239 | "bomb", | |
240 | "border", | |
241 | "boss", | |
242 | "both", | |
243 | "bounced", | |
244 | "bovine", | |
245 | "bowling", | |
246 | "boxes", | |
247 | "boyfriend", | |
248 | "broken", | |
249 | "brunt", | |
250 | "bubble", | |
251 | "buckets", | |
252 | "budget", | |
253 | "buffet", | |
254 | "bugs", | |
255 | "building", | |
256 | "bulb", | |
257 | "bumper", | |
258 | "bunch", | |
259 | "business", | |
260 | "butter", | |
261 | "buying", | |
262 | "buzzer", | |
263 | "bygones", | |
264 | "byline", | |
265 | "bypass", | |
266 | "cabin", | |
267 | "cactus", | |
268 | "cadets", | |
269 | "cafe", | |
270 | "cage", | |
271 | "cajun", | |
272 | "cake", | |
273 | "calamity", | |
274 | "camp", | |
275 | "candy", | |
276 | "casket", | |
277 | "catch", | |
278 | "cause", | |
279 | "cavernous", | |
280 | "cease", | |
281 | "cedar", | |
282 | "ceiling", | |
283 | "cell", | |
284 | "cement", | |
285 | "cent", | |
286 | "certain", | |
287 | "chlorine", | |
288 | "chrome", | |
289 | "cider", | |
290 | "cigar", | |
291 | "cinema", | |
292 | "circle", | |
293 | "cistern", | |
294 | "citadel", | |
295 | "civilian", | |
296 | "claim", | |
297 | "click", | |
298 | "clue", | |
299 | "coal", | |
300 | "cobra", | |
301 | "cocoa", | |
302 | "code", | |
303 | "coexist", | |
304 | "coffee", | |
305 | "cogs", | |
306 | "cohesive", | |
307 | "coils", | |
308 | "colony", | |
309 | "comb", | |
310 | "cool", | |
311 | "copy", | |
312 | "corrode", | |
313 | "costume", | |
314 | "cottage", | |
315 | "cousin", | |
316 | "cowl", | |
317 | "criminal", | |
318 | "cube", | |
319 | "cucumber", | |
320 | "cuddled", | |
321 | "cuffs", | |
322 | "cuisine", | |
323 | "cunning", | |
324 | "cupcake", | |
325 | "custom", | |
326 | "cycling", | |
327 | "cylinder", | |
328 | "cynical", | |
329 | "dabbing", | |
330 | "dads", | |
331 | "daft", | |
332 | "dagger", | |
333 | "daily", | |
334 | "damp", | |
335 | "dangerous", | |
336 | "dapper", | |
337 | "darted", | |
338 | "dash", | |
339 | "dating", | |
340 | "dauntless", | |
341 | "dawn", | |
342 | "daytime", | |
343 | "dazed", | |
344 | "debut", | |
345 | "decay", | |
346 | "dedicated", | |
347 | "deepest", | |
348 | "deftly", | |
349 | "degrees", | |
350 | "dehydrate", | |
351 | "deity", | |
352 | "dejected", | |
353 | "delayed", | |
354 | "demonstrate", | |
355 | "dented", | |
356 | "deodorant", | |
357 | "depth", | |
358 | "desk", | |
359 | "devoid", | |
360 | "dewdrop", | |
361 | "dexterity", | |
362 | "dialect", | |
363 | "dice", | |
364 | "diet", | |
365 | "different", | |
366 | "digit", | |
367 | "dilute", | |
368 | "dime", | |
369 | "dinner", | |
370 | "diode", | |
371 | "diplomat", | |
372 | "directed", | |
373 | "distance", | |
374 | "ditch", | |
375 | "divers", | |
376 | "dizzy", | |
377 | "doctor", | |
378 | "dodge", | |
379 | "does", | |
380 | "dogs", | |
381 | "doing", | |
382 | "dolphin", | |
383 | "domestic", | |
384 | "donuts", | |
385 | "doorway", | |
386 | "dormant", | |
387 | "dosage", | |
388 | "dotted", | |
389 | "double", | |
390 | "dove", | |
391 | "down", | |
392 | "dozen", | |
393 | "dreams", | |
394 | "drinks", | |
395 | "drowning", | |
396 | "drunk", | |
397 | "drying", | |
398 | "dual", | |
399 | "dubbed", | |
400 | "duckling", | |
401 | "dude", | |
402 | "duets", | |
403 | "duke", | |
404 | "dullness", | |
405 | "dummy", | |
406 | "dunes", | |
407 | "duplex", | |
408 | "duration", | |
409 | "dusted", | |
410 | "duties", | |
411 | "dwarf", | |
412 | "dwelt", | |
413 | "dwindling", | |
414 | "dying", | |
415 | "dynamite", | |
416 | "dyslexic", | |
417 | "each", | |
418 | "eagle", | |
419 | "earth", | |
420 | "easy", | |
421 | "eating", | |
422 | "eavesdrop", | |
423 | "eccentric", | |
424 | "echo", | |
425 | "eclipse", | |
426 | "economics", | |
427 | "ecstatic", | |
428 | "eden", | |
429 | "edgy", | |
430 | "edited", | |
431 | "educated", | |
432 | "eels", | |
433 | "efficient", | |
434 | "eggs", | |
435 | "egotistic", | |
436 | "eight", | |
437 | "either", | |
438 | "eject", | |
439 | "elapse", | |
440 | "elbow", | |
441 | "eldest", | |
442 | "eleven", | |
443 | "elite", | |
444 | "elope", | |
445 | "else", | |
446 | "eluded", | |
447 | "emails", | |
448 | "ember", | |
449 | "emerge", | |
450 | "emit", | |
451 | "emotion", | |
452 | "empty", | |
453 | "emulate", | |
454 | "energy", | |
455 | "enforce", | |
456 | "enhanced", | |
457 | "enigma", | |
458 | "enjoy", | |
459 | "enlist", | |
460 | "enmity", | |
461 | "enough", | |
462 | "enraged", | |
463 | "ensign", | |
464 | "entrance", | |
465 | "envy", | |
466 | "epoxy", | |
467 | "equip", | |
468 | "erase", | |
469 | "erected", | |
470 | "erosion", | |
471 | "error", | |
472 | "eskimos", | |
473 | "espionage", | |
474 | "essential", | |
475 | "estate", | |
476 | "etched", | |
477 | "eternal", | |
478 | "ethics", | |
479 | "etiquette", | |
480 | "evaluate", | |
481 | "evenings", | |
482 | "evicted", | |
483 | "evolved", | |
484 | "examine", | |
485 | "excess", | |
486 | "exhale", | |
487 | "exit", | |
488 | "exotic", | |
489 | "exquisite", | |
490 | "extra", | |
491 | "exult", | |
492 | "fabrics", | |
493 | "factual", | |
494 | "fading", | |
495 | "fainted", | |
496 | "faked", | |
497 | "fall", | |
498 | "family", | |
499 | "fancy", | |
500 | "farming", | |
501 | "fatal", | |
502 | "faulty", | |
503 | "fawns", | |
504 | "faxed", | |
505 | "fazed", | |
506 | "feast", | |
507 | "february", | |
508 | "federal", | |
509 | "feel", | |
510 | "feline", | |
511 | "females", | |
512 | "fences", | |
513 | "ferry", | |
514 | "festival", | |
515 | "fetches", | |
516 | "fever", | |
517 | "fewest", | |
518 | "fiat", | |
519 | "fibula", | |
520 | "fictional", | |
521 | "fidget", | |
522 | "fierce", | |
523 | "fifteen", | |
524 | "fight", | |
525 | "films", | |
526 | "firm", | |
527 | "fishing", | |
528 | "fitting", | |
529 | "five", | |
530 | "fixate", | |
531 | "fizzle", | |
532 | "fleet", | |
533 | "flippant", | |
534 | "flying", | |
535 | "foamy", | |
536 | "focus", | |
537 | "foes", | |
538 | "foggy", | |
539 | "foiled", | |
540 | "folding", | |
541 | "fonts", | |
542 | "foolish", | |
543 | "fossil", | |
544 | "fountain", | |
545 | "fowls", | |
546 | "foxes", | |
547 | "foyer", | |
548 | "framed", | |
549 | "friendly", | |
550 | "frown", | |
551 | "fruit", | |
552 | "frying", | |
553 | "fudge", | |
554 | "fuel", | |
555 | "fugitive", | |
556 | "fully", | |
557 | "fuming", | |
558 | "fungal", | |
559 | "furnished", | |
560 | "fuselage", | |
561 | "future", | |
562 | "fuzzy", | |
563 | "gables", | |
564 | "gadget", | |
565 | "gags", | |
566 | "gained", | |
567 | "galaxy", | |
568 | "gambit", | |
569 | "gang", | |
570 | "gasp", | |
571 | "gather", | |
572 | "gauze", | |
573 | "gave", | |
574 | "gawk", | |
575 | "gaze", | |
576 | "gearbox", | |
577 | "gecko", | |
578 | "geek", | |
579 | "gels", | |
580 | "gemstone", | |
581 | "general", | |
582 | "geometry", | |
583 | "germs", | |
584 | "gesture", | |
585 | "getting", | |
586 | "geyser", | |
587 | "ghetto", | |
588 | "ghost", | |
589 | "giant", | |
590 | "giddy", | |
591 | "gifts", | |
592 | "gigantic", | |
593 | "gills", | |
594 | "gimmick", | |
595 | "ginger", | |
596 | "girth", | |
597 | "giving", | |
598 | "glass", | |
599 | "gleeful", | |
600 | "glide", | |
601 | "gnaw", | |
602 | "gnome", | |
603 | "goat", | |
604 | "goblet", | |
605 | "godfather", | |
606 | "goes", | |
607 | "goggles", | |
608 | "going", | |
609 | "goldfish", | |
610 | "gone", | |
611 | "goodbye", | |
612 | "gopher", | |
613 | "gorilla", | |
614 | "gossip", | |
615 | "gotten", | |
616 | "gourmet", | |
617 | "governing", | |
618 | "gown", | |
619 | "greater", | |
620 | "grunt", | |
621 | "guarded", | |
622 | "guest", | |
623 | "guide", | |
624 | "gulp", | |
625 | "gumball", | |
626 | "guru", | |
627 | "gusts", | |
628 | "gutter", | |
629 | "guys", | |
630 | "gymnast", | |
631 | "gypsy", | |
632 | "gyrate", | |
633 | "habitat", | |
634 | "hacksaw", | |
635 | "haggled", | |
636 | "hairy", | |
637 | "hamburger", | |
638 | "happens", | |
639 | "hashing", | |
640 | "hatchet", | |
641 | "haunted", | |
642 | "having", | |
643 | "hawk", | |
644 | "haystack", | |
645 | "hazard", | |
646 | "hectare", | |
647 | "hedgehog", | |
648 | "heels", | |
649 | "hefty", | |
650 | "height", | |
651 | "hemlock", | |
652 | "hence", | |
653 | "heron", | |
654 | "hesitate", | |
655 | "hexagon", | |
656 | "hickory", | |
657 | "hiding", | |
658 | "highway", | |
659 | "hijack", | |
660 | "hiker", | |
661 | "hills", | |
662 | "himself", | |
663 | "hinder", | |
664 | "hippo", | |
665 | "hire", | |
666 | "history", | |
667 | "hitched", | |
668 | "hive", | |
669 | "hoax", | |
670 | "hobby", | |
671 | "hockey", | |
672 | "hoisting", | |
673 | "hold", | |
674 | "honked", | |
675 | "hookup", | |
676 | "hope", | |
677 | "hornet", | |
678 | "hospital", | |
679 | "hotel", | |
680 | "hounded", | |
681 | "hover", | |
682 | "howls", | |
683 | "hubcaps", | |
684 | "huddle", | |
685 | "huge", | |
686 | "hull", | |
687 | "humid", | |
688 | "hunter", | |
689 | "hurried", | |
690 | "husband", | |
691 | "huts", | |
692 | "hybrid", | |
693 | "hydrogen", | |
694 | "hyper", | |
695 | "iceberg", | |
696 | "icing", | |
697 | "icon", | |
698 | "identity", | |
699 | "idiom", | |
700 | "idled", | |
701 | "idols", | |
702 | "igloo", | |
703 | "ignore", | |
704 | "iguana", | |
705 | "illness", | |
706 | "imagine", | |
707 | "imbalance", | |
708 | "imitate", | |
709 | "impel", | |
710 | "inactive", | |
711 | "inbound", | |
712 | "incur", | |
713 | "industrial", | |
714 | "inexact", | |
715 | "inflamed", | |
716 | "ingested", | |
717 | "initiate", | |
718 | "injury", | |
719 | "inkling", | |
720 | "inline", | |
721 | "inmate", | |
722 | "innocent", | |
723 | "inorganic", | |
724 | "input", | |
725 | "inquest", | |
726 | "inroads", | |
727 | "insult", | |
728 | "intended", | |
729 | "inundate", | |
730 | "invoke", | |
731 | "inwardly", | |
732 | "ionic", | |
733 | "irate", | |
734 | "iris", | |
735 | "irony", | |
736 | "irritate", | |
737 | "island", | |
738 | "isolated", | |
739 | "issued", | |
740 | "italics", | |
741 | "itches", | |
742 | "items", | |
743 | "itinerary", | |
744 | "itself", | |
745 | "ivory", | |
746 | "jabbed", | |
747 | "jackets", | |
748 | "jaded", | |
749 | "jagged", | |
750 | "jailed", | |
751 | "jamming", | |
752 | "january", | |
753 | "jargon", | |
754 | "jaunt", | |
755 | "javelin", | |
756 | "jaws", | |
757 | "jazz", | |
758 | "jeans", | |
759 | "jeers", | |
760 | "jellyfish", | |
761 | "jeopardy", | |
762 | "jerseys", | |
763 | "jester", | |
764 | "jetting", | |
765 | "jewels", | |
766 | "jigsaw", | |
767 | "jingle", | |
768 | "jittery", | |
769 | "jive", | |
770 | "jobs", | |
771 | "jockey", | |
772 | "jogger", | |
773 | "joining", | |
774 | "joking", | |
775 | "jolted", | |
776 | "jostle", | |
777 | "journal", | |
778 | "joyous", | |
779 | "jubilee", | |
780 | "judge", | |
781 | "juggled", | |
782 | "juicy", | |
783 | "jukebox", | |
784 | "july", | |
785 | "jump", | |
786 | "junk", | |
787 | "jury", | |
788 | "justice", | |
789 | "juvenile", | |
790 | "kangaroo", | |
791 | "karate", | |
792 | "keep", | |
793 | "kennel", | |
794 | "kept", | |
795 | "kernels", | |
796 | "kettle", | |
797 | "keyboard", | |
798 | "kickoff", | |
799 | "kidneys", | |
800 | "king", | |
801 | "kiosk", | |
802 | "kisses", | |
803 | "kitchens", | |
804 | "kiwi", | |
805 | "knapsack", | |
806 | "knee", | |
807 | "knife", | |
808 | "knowledge", | |
809 | "knuckle", | |
810 | "koala", | |
811 | "laboratory", | |
812 | "ladder", | |
813 | "lagoon", | |
814 | "lair", | |
815 | "lakes", | |
816 | "lamb", | |
817 | "language", | |
818 | "laptop", | |
819 | "large", | |
820 | "last", | |
821 | "later", | |
822 | "launching", | |
823 | "lava", | |
824 | "lawsuit", | |
825 | "layout", | |
826 | "lazy", | |
827 | "lectures", | |
828 | "ledge", | |
829 | "leech", | |
830 | "left", | |
831 | "legion", | |
832 | "leisure", | |
833 | "lemon", | |
834 | "lending", | |
835 | "leopard", | |
836 | "lesson", | |
837 | "lettuce", | |
838 | "lexicon", | |
839 | "liar", | |
840 | "library", | |
841 | "licks", | |
842 | "lids", | |
843 | "lied", | |
844 | "lifestyle", | |
845 | "light", | |
846 | "likewise", | |
847 | "lilac", | |
848 | "limits", | |
849 | "linen", | |
850 | "lion", | |
851 | "lipstick", | |
852 | "liquid", | |
853 | "listen", | |
854 | "lively", | |
855 | "loaded", | |
856 | "lobster", | |
857 | "locker", | |
858 | "lodge", | |
859 | "lofty", | |
860 | "logic", | |
861 | "loincloth", | |
862 | "long", | |
863 | "looking", | |
864 | "lopped", | |
865 | "lordship", | |
866 | "losing", | |
867 | "lottery", | |
868 | "loudly", | |
869 | "love", | |
870 | "lower", | |
871 | "loyal", | |
872 | "lucky", | |
873 | "luggage", | |
874 | "lukewarm", | |
875 | "lullaby", | |
876 | "lumber", | |
877 | "lunar", | |
878 | "lurk", | |
879 | "lush", | |
880 | "luxury", | |
881 | "lymph", | |
882 | "lynx", | |
883 | "lyrics", | |
884 | "macro", | |
885 | "madness", | |
886 | "magically", | |
887 | "mailed", | |
888 | "major", | |
889 | "makeup", | |
890 | "malady", | |
891 | "mammal", | |
892 | "maps", | |
893 | "masterful", | |
894 | "match", | |
895 | "maul", | |
896 | "maverick", | |
897 | "maximum", | |
898 | "mayor", | |
899 | "maze", | |
900 | "meant", | |
901 | "mechanic", | |
902 | "medicate", | |
903 | "meeting", | |
904 | "megabyte", | |
905 | "melting", | |
906 | "memoir", | |
907 | "menu", | |
908 | "merger", | |
909 | "mesh", | |
910 | "metro", | |
911 | "mews", | |
912 | "mice", | |
913 | "midst", | |
914 | "mighty", | |
915 | "mime", | |
916 | "mirror", | |
917 | "misery", | |
918 | "mittens", | |
919 | "mixture", | |
920 | "moat", | |
921 | "mobile", | |
922 | "mocked", | |
923 | "mohawk", | |
924 | "moisture", | |
925 | "molten", | |
926 | "moment", | |
927 | "money", | |
928 | "moon", | |
929 | "mops", | |
930 | "morsel", | |
931 | "mostly", | |
932 | "motherly", | |
933 | "mouth", | |
934 | "movement", | |
935 | "mowing", | |
936 | "much", | |
937 | "muddy", | |
938 | "muffin", | |
939 | "mugged", | |
940 | "mullet", | |
941 | "mumble", | |
942 | "mundane", | |
943 | "muppet", | |
944 | "mural", | |
945 | "musical", | |
946 | "muzzle", | |
947 | "myriad", | |
948 | "mystery", | |
949 | "myth", | |
950 | "nabbing", | |
951 | "nagged", | |
952 | "nail", | |
953 | "names", | |
954 | "nanny", | |
955 | "napkin", | |
956 | "narrate", | |
957 | "nasty", | |
958 | "natural", | |
959 | "nautical", | |
960 | "navy", | |
961 | "nearby", | |
962 | "necklace", | |
963 | "needed", | |
964 | "negative", | |
965 | "neither", | |
966 | "neon", | |
967 | "nephew", | |
968 | "nerves", | |
969 | "nestle", | |
970 | "network", | |
971 | "neutral", | |
972 | "never", | |
973 | "newt", | |
974 | "nexus", | |
975 | "nibs", | |
976 | "niche", | |
977 | "niece", | |
978 | "nifty", | |
979 | "nightly", | |
980 | "nimbly", | |
981 | "nineteen", | |
982 | "nirvana", | |
983 | "nitrogen", | |
984 | "nobody", | |
985 | "nocturnal", | |
986 | "nodes", | |
987 | "noises", | |
988 | "nomad", | |
989 | "noodles", | |
990 | "northern", | |
991 | "nostril", | |
992 | "noted", | |
993 | "nouns", | |
994 | "novelty", | |
995 | "nowhere", | |
996 | "nozzle", | |
997 | "nuance", | |
998 | "nucleus", | |
999 | "nudged", | |
1000 | "nugget", | |
1001 | "nuisance", | |
1002 | "null", | |
1003 | "number", | |
1004 | "nuns", | |
1005 | "nurse", | |
1006 | "nutshell", | |
1007 | "nylon", | |
1008 | "oaks", | |
1009 | "oars", | |
1010 | "oasis", | |
1011 | "oatmeal", | |
1012 | "obedient", | |
1013 | "object", | |
1014 | "obliged", | |
1015 | "obnoxious", | |
1016 | "observant", | |
1017 | "obtains", | |
1018 | "obvious", | |
1019 | "occur", | |
1020 | "ocean", | |
1021 | "october", | |
1022 | "odds", | |
1023 | "odometer", | |
1024 | "offend", | |
1025 | "often", | |
1026 | "oilfield", | |
1027 | "ointment", | |
1028 | "okay", | |
1029 | "older", | |
1030 | "olive", | |
1031 | "olympics", | |
1032 | "omega", | |
1033 | "omission", | |
1034 | "omnibus", | |
1035 | "onboard", | |
1036 | "oncoming", | |
1037 | "oneself", | |
1038 | "ongoing", | |
1039 | "onion", | |
1040 | "online", | |
1041 | "onslaught", | |
1042 | "onto", | |
1043 | "onward", | |
1044 | "oozed", | |
1045 | "opacity", | |
1046 | "opened", | |
1047 | "opposite", | |
1048 | "optical", | |
1049 | "opus", | |
1050 | "orange", | |
1051 | "orbit", | |
1052 | "orchid", | |
1053 | "orders", | |
1054 | "organs", | |
1055 | "origin", | |
1056 | "ornament", | |
1057 | "orphans", | |
1058 | "oscar", | |
1059 | "ostrich", | |
1060 | "otherwise", | |
1061 | "otter", | |
1062 | "ouch", | |
1063 | "ought", | |
1064 | "ounce", | |
1065 | "ourselves", | |
1066 | "oust", | |
1067 | "outbreak", | |
1068 | "oval", | |
1069 | "oven", | |
1070 | "owed", | |
1071 | "owls", | |
1072 | "owner", | |
1073 | "oxidant", | |
1074 | "oxygen", | |
1075 | "oyster", | |
1076 | "ozone", | |
1077 | "pact", | |
1078 | "paddles", | |
1079 | "pager", | |
1080 | "pairing", | |
1081 | "palace", | |
1082 | "pamphlet", | |
1083 | "pancakes", | |
1084 | "paper", | |
1085 | "paradise", | |
1086 | "pastry", | |
1087 | "patio", | |
1088 | "pause", | |
1089 | "pavements", | |
1090 | "pawnshop", | |
1091 | "payment", | |
1092 | "peaches", | |
1093 | "pebbles", | |
1094 | "peculiar", | |
1095 | "pedantic", | |
1096 | "peeled", | |
1097 | "pegs", | |
1098 | "pelican", | |
1099 | "pencil", | |
1100 | "people", | |
1101 | "pepper", | |
1102 | "perfect", | |
1103 | "pests", | |
1104 | "petals", | |
1105 | "phase", | |
1106 | "pheasants", | |
1107 | "phone", | |
1108 | "phrases", | |
1109 | "physics", | |
1110 | "piano", | |
1111 | "picked", | |
1112 | "pierce", | |
1113 | "pigment", | |
1114 | "piloted", | |
1115 | "pimple", | |
1116 | "pinched", | |
1117 | "pioneer", | |
1118 | "pipeline", | |
1119 | "pirate", | |
1120 | "pistons", | |
1121 | "pitched", | |
1122 | "pivot", | |
1123 | "pixels", | |
1124 | "pizza", | |
1125 | "playful", | |
1126 | "pledge", | |
1127 | "pliers", | |
1128 | "plotting", | |
1129 | "plus", | |
1130 | "plywood", | |
1131 | "poaching", | |
1132 | "pockets", | |
1133 | "podcast", | |
1134 | "poetry", | |
1135 | "point", | |
1136 | "poker", | |
1137 | "polar", | |
1138 | "ponies", | |
1139 | "pool", | |
1140 | "popular", | |
1141 | "portents", | |
1142 | "possible", | |
1143 | "potato", | |
1144 | "pouch", | |
1145 | "poverty", | |
1146 | "powder", | |
1147 | "pram", | |
1148 | "present", | |
1149 | "pride", | |
1150 | "problems", | |
1151 | "pruned", | |
1152 | "prying", | |
1153 | "psychic", | |
1154 | "public", | |
1155 | "puck", | |
1156 | "puddle", | |
1157 | "puffin", | |
1158 | "pulp", | |
1159 | "pumpkins", | |
1160 | "punch", | |
1161 | "puppy", | |
1162 | "purged", | |
1163 | "push", | |
1164 | "putty", | |
1165 | "puzzled", | |
1166 | "pylons", | |
1167 | "pyramid", | |
1168 | "python", | |
1169 | "queen", | |
1170 | "quick", | |
1171 | "quote", | |
1172 | "rabbits", | |
1173 | "racetrack", | |
1174 | "radar", | |
1175 | "rafts", | |
1176 | "rage", | |
1177 | "railway", | |
1178 | "raking", | |
1179 | "rally", | |
1180 | "ramped", | |
1181 | "randomly", | |
1182 | "rapid", | |
1183 | "rarest", | |
1184 | "rash", | |
1185 | "rated", | |
1186 | "ravine", | |
1187 | "rays", | |
1188 | "razor", | |
1189 | "react", | |
1190 | "rebel", | |
1191 | "recipe", | |
1192 | "reduce", | |
1193 | "reef", | |
1194 | "refer", | |
1195 | "regular", | |
1196 | "reheat", | |
1197 | "reinvest", | |
1198 | "rejoices", | |
1199 | "rekindle", | |
1200 | "relic", | |
1201 | "remedy", | |
1202 | "renting", | |
1203 | "reorder", | |
1204 | "repent", | |
1205 | "request", | |
1206 | "reruns", | |
1207 | "rest", | |
1208 | "return", | |
1209 | "reunion", | |
1210 | "revamp", | |
1211 | "rewind", | |
1212 | "rhino", | |
1213 | "rhythm", | |
1214 | "ribbon", | |
1215 | "richly", | |
1216 | "ridges", | |
1217 | "rift", | |
1218 | "rigid", | |
1219 | "rims", | |
1220 | "ringing", | |
1221 | "riots", | |
1222 | "ripped", | |
1223 | "rising", | |
1224 | "ritual", | |
1225 | "river", | |
1226 | "roared", | |
1227 | "robot", | |
1228 | "rockets", | |
1229 | "rodent", | |
1230 | "rogue", | |
1231 | "roles", | |
1232 | "romance", | |
1233 | "roomy", | |
1234 | "roped", | |
1235 | "roster", | |
1236 | "rotate", | |
1237 | "rounded", | |
1238 | "rover", | |
1239 | "rowboat", | |
1240 | "royal", | |
1241 | "ruby", | |
1242 | "rudely", | |
1243 | "ruffled", | |
1244 | "rugged", | |
1245 | "ruined", | |
1246 | "ruling", | |
1247 | "rumble", | |
1248 | "runway", | |
1249 | "rural", | |
1250 | "rustled", | |
1251 | "ruthless", | |
1252 | "sabotage", | |
1253 | "sack", | |
1254 | "sadness", | |
1255 | "safety", | |
1256 | "saga", | |
1257 | "sailor", | |
1258 | "sake", | |
1259 | "salads", | |
1260 | "sample", | |
1261 | "sanity", | |
1262 | "sapling", | |
1263 | "sarcasm", | |
1264 | "sash", | |
1265 | "satin", | |
1266 | "saucepan", | |
1267 | "saved", | |
1268 | "sawmill", | |
1269 | "saxophone", | |
1270 | "sayings", | |
1271 | "scamper", | |
1272 | "scenic", | |
1273 | "school", | |
1274 | "science", | |
1275 | "scoop", | |
1276 | "scrub", | |
1277 | "scuba", | |
1278 | "seasons", | |
1279 | "second", | |
1280 | "sedan", | |
1281 | "seeded", | |
1282 | "segments", | |
1283 | "seismic", | |
1284 | "selfish", | |
1285 | "semifinal", | |
1286 | "sensible", | |
1287 | "september", | |
1288 | "sequence", | |
1289 | "serving", | |
1290 | "session", | |
1291 | "setup", | |
1292 | "seventh", | |
1293 | "sewage", | |
1294 | "shackles", | |
1295 | "shelter", | |
1296 | "shipped", | |
1297 | "shocking", | |
1298 | "shrugged", | |
1299 | "shuffled", | |
1300 | "shyness", | |
1301 | "siblings", | |
1302 | "sickness", | |
1303 | "sidekick", | |
1304 | "sieve", | |
1305 | "sifting", | |
1306 | "sighting", | |
1307 | "silk", | |
1308 | "simplest", | |
1309 | "sincerely", | |
1310 | "sipped", | |
1311 | "siren", | |
1312 | "situated", | |
1313 | "sixteen", | |
1314 | "sizes", | |
1315 | "skater", | |
1316 | "skew", | |
1317 | "skirting", | |
1318 | "skulls", | |
1319 | "skydive", | |
1320 | "slackens", | |
1321 | "sleepless", | |
1322 | "slid", | |
1323 | "slower", | |
1324 | "slug", | |
1325 | "smash", | |
1326 | "smelting", | |
1327 | "smidgen", | |
1328 | "smog", | |
1329 | "smuggled", | |
1330 | "snake", | |
1331 | "sneeze", | |
1332 | "sniff", | |
1333 | "snout", | |
1334 | "snug", | |
1335 | "soapy", | |
1336 | "sober", | |
1337 | "soccer", | |
1338 | "soda", | |
1339 | "software", | |
1340 | "soggy", | |
1341 | "soil", | |
1342 | "solved", | |
1343 | "somewhere", | |
1344 | "sonic", | |
1345 | "soothe", | |
1346 | "soprano", | |
1347 | "sorry", | |
1348 | "southern", | |
1349 | "sovereign", | |
1350 | "sowed", | |
1351 | "soya", | |
1352 | "space", | |
1353 | "speedy", | |
1354 | "sphere", | |
1355 | "spiders", | |
1356 | "splendid", | |
1357 | "spout", | |
1358 | "sprig", | |
1359 | "spud", | |
1360 | "spying", | |
1361 | "square", | |
1362 | "stacking", | |
1363 | "stellar", | |
1364 | "stick", | |
1365 | "stockpile", | |
1366 | "strained", | |
1367 | "stunning", | |
1368 | "stylishly", | |
1369 | "subtly", | |
1370 | "succeed", | |
1371 | "suddenly", | |
1372 | "suede", | |
1373 | "suffice", | |
1374 | "sugar", | |
1375 | "suitcase", | |
1376 | "sulking", | |
1377 | "summon", | |
1378 | "sunken", | |
1379 | "superior", | |
1380 | "surfer", | |
1381 | "sushi", | |
1382 | "suture", | |
1383 | "swagger", | |
1384 | "swept", | |
1385 | "swiftly", | |
1386 | "sword", | |
1387 | "swung", | |
1388 | "syllabus", | |
1389 | "symptoms", | |
1390 | "syndrome", | |
1391 | "syringe", | |
1392 | "system", | |
1393 | "taboo", | |
1394 | "tacit", | |
1395 | "tadpoles", | |
1396 | "tagged", | |
1397 | "tail", | |
1398 | "taken", | |
1399 | "talent", | |
1400 | "tamper", | |
1401 | "tanks", | |
1402 | "tapestry", | |
1403 | "tarnished", | |
1404 | "tasked", | |
1405 | "tattoo", | |
1406 | "taunts", | |
1407 | "tavern", | |
1408 | "tawny", | |
1409 | "taxi", | |
1410 | "teardrop", | |
1411 | "technical", | |
1412 | "tedious", | |
1413 | "teeming", | |
1414 | "tell", | |
1415 | "template", | |
1416 | "tender", | |
1417 | "tepid", | |
1418 | "tequila", | |
1419 | "terminal", | |
1420 | "testing", | |
1421 | "tether", | |
1422 | "textbook", | |
1423 | "thaw", | |
1424 | "theatrics", | |
1425 | "thirsty", | |
1426 | "thorn", | |
1427 | "threaten", | |
1428 | "thumbs", | |
1429 | "thwart", | |
1430 | "ticket", | |
1431 | "tidy", | |
1432 | "tiers", | |
1433 | "tiger", | |
1434 | "tilt", | |
1435 | "timber", | |
1436 | "tinted", | |
1437 | "tipsy", | |
1438 | "tirade", | |
1439 | "tissue", | |
1440 | "titans", | |
1441 | "toaster", | |
1442 | "tobacco", | |
1443 | "today", | |
1444 | "toenail", | |
1445 | "toffee", | |
1446 | "together", | |
1447 | "toilet", | |
1448 | "token", | |
1449 | "tolerant", | |
1450 | "tomorrow", | |
1451 | "tonic", | |
1452 | "toolbox", | |
1453 | "topic", | |
1454 | "torch", | |
1455 | "tossed", | |
1456 | "total", | |
1457 | "touchy", | |
1458 | "towel", | |
1459 | "toxic", | |
1460 | "toyed", | |
1461 | "trash", | |
1462 | "trendy", | |
1463 | "tribal", | |
1464 | "trolling", | |
1465 | "truth", | |
1466 | "trying", | |
1467 | "tsunami", | |
1468 | "tubes", | |
1469 | "tucks", | |
1470 | "tudor", | |
1471 | "tuesday", | |
1472 | "tufts", | |
1473 | "tugs", | |
1474 | "tuition", | |
1475 | "tulips", | |
1476 | "tumbling", | |
1477 | "tunnel", | |
1478 | "turnip", | |
1479 | "tusks", | |
1480 | "tutor", | |
1481 | "tuxedo", | |
1482 | "twang", | |
1483 | "tweezers", | |
1484 | "twice", | |
1485 | "twofold", | |
1486 | "tycoon", | |
1487 | "typist", | |
1488 | "tyrant", | |
1489 | "ugly", | |
1490 | "ulcers", | |
1491 | "ultimate", | |
1492 | "umbrella", | |
1493 | "umpire", | |
1494 | "unafraid", | |
1495 | "unbending", | |
1496 | "uncle", | |
1497 | "under", | |
1498 | "uneven", | |
1499 | "unfit", | |
1500 | "ungainly", | |
1501 | "unhappy", | |
1502 | "union", | |
1503 | "unjustly", | |
1504 | "unknown", | |
1505 | "unlikely", | |
1506 | "unmask", | |
1507 | "unnoticed", | |
1508 | "unopened", | |
1509 | "unplugs", | |
1510 | "unquoted", | |
1511 | "unrest", | |
1512 | "unsafe", | |
1513 | "until", | |
1514 | "unusual", | |
1515 | "unveil", | |
1516 | "unwind", | |
1517 | "unzip", | |
1518 | "upbeat", | |
1519 | "upcoming", | |
1520 | "update", | |
1521 | "upgrade", | |
1522 | "uphill", | |
1523 | "upkeep", | |
1524 | "upload", | |
1525 | "upon", | |
1526 | "upper", | |
1527 | "upright", | |
1528 | "upstairs", | |
1529 | "uptight", | |
1530 | "upwards", | |
1531 | "urban", | |
1532 | "urchins", | |
1533 | "urgent", | |
1534 | "usage", | |
1535 | "useful", | |
1536 | "usher", | |
1537 | "using", | |
1538 | "usual", | |
1539 | "utensils", | |
1540 | "utility", | |
1541 | "utmost", | |
1542 | "utopia", | |
1543 | "uttered", | |
1544 | "vacation", | |
1545 | "vague", | |
1546 | "vain", | |
1547 | "value", | |
1548 | "vampire", | |
1549 | "vane", | |
1550 | "vapidly", | |
1551 | "vary", | |
1552 | "vastness", | |
1553 | "vats", | |
1554 | "vaults", | |
1555 | "vector", | |
1556 | "veered", | |
1557 | "vegan", | |
1558 | "vehicle", | |
1559 | "vein", | |
1560 | "velvet", | |
1561 | "venomous", | |
1562 | "verification", | |
1563 | "vessel", | |
1564 | "veteran", | |
1565 | "vexed", | |
1566 | "vials", | |
1567 | "vibrate", | |
1568 | "victim", | |
1569 | "video", | |
1570 | "viewpoint", | |
1571 | "vigilant", | |
1572 | "viking", | |
1573 | "village", | |
1574 | "vinegar", | |
1575 | "violin", | |
1576 | "vipers", | |
1577 | "virtual", | |
1578 | "visited", | |
1579 | "vitals", | |
1580 | "vivid", | |
1581 | "vixen", | |
1582 | "vocal", | |
1583 | "vogue", | |
1584 | "voice", | |
1585 | "volcano", | |
1586 | "vortex", | |
1587 | "voted", | |
1588 | "voucher", | |
1589 | "vowels", | |
1590 | "voyage", | |
1591 | "vulture", | |
1592 | "wade", | |
1593 | "waffle", | |
1594 | "wagtail", | |
1595 | "waist", | |
1596 | "waking", | |
1597 | "wallets", | |
1598 | "wanted", | |
1599 | "warped", | |
1600 | "washing", | |
1601 | "water", | |
1602 | "waveform", | |
1603 | "waxing", | |
1604 | "wayside", | |
1605 | "weavers", | |
1606 | "website", | |
1607 | "wedge", | |
1608 | "weekday", | |
1609 | "weird", | |
1610 | "welders", | |
1611 | "went", | |
1612 | "wept", | |
1613 | "were", | |
1614 | "western", | |
1615 | "wetsuit", | |
1616 | "whale", | |
1617 | "when", | |
1618 | "whipped", | |
1619 | "whole", | |
1620 | "wickets", | |
1621 | "width", | |
1622 | "wield", | |
1623 | "wife", | |
1624 | "wiggle", | |
1625 | "wildly", | |
1626 | "winter", | |
1627 | "wipeout", | |
1628 | "wiring", | |
1629 | "wise", | |
1630 | "withdrawn", | |
1631 | "wives", | |
1632 | "wizard", | |
1633 | "wobbly", | |
1634 | "woes", | |
1635 | "woken", | |
1636 | "wolf", | |
1637 | "womanly", | |
1638 | "wonders", | |
1639 | "woozy", | |
1640 | "worry", | |
1641 | "wounded", | |
1642 | "woven", | |
1643 | "wrap", | |
1644 | "wrist", | |
1645 | "wrong", | |
1646 | "yacht", | |
1647 | "yahoo", | |
1648 | "yanks", | |
1649 | "yard", | |
1650 | "yawning", | |
1651 | "yearbook", | |
1652 | "yellow", | |
1653 | "yesterday", | |
1654 | "yeti", | |
1655 | "yields", | |
1656 | "yodel", | |
1657 | "yoga", | |
1658 | "younger", | |
1659 | "yoyo", | |
1660 | "zapped", | |
1661 | "zeal", | |
1662 | "zebra", | |
1663 | "zero", | |
1664 | "zesty", | |
1665 | "zigzags", | |
1666 | "zinger", | |
1667 | "zippers", | |
1668 | "zodiac", | |
1669 | "zombie", | |
1670 | "zones", | |
1671 | "zoom", | |
1672 | } | |
1673 | ) |
0 | package mnemonics | |
1 | ||
2 | import ( | |
3 | "bytes" | |
4 | "crypto/rand" | |
5 | "testing" | |
6 | "unicode/utf8" | |
7 | ||
8 | "golang.org/x/text/unicode/norm" | |
9 | ) | |
10 | ||
11 | // TestEnglishDictionary checks that the english dictionary is well formed. | |
12 | func TestEnglishDictionary(t *testing.T) { | |
13 | // Check for sane constants. | |
14 | if English != "english" { | |
15 | t.Error("unexpected identifier for english dictionary") | |
16 | } | |
17 | if EnglishUniquePrefixLen != 3 { | |
18 | t.Error("unexpected prefix len for english dictionary") | |
19 | } | |
20 | ||
21 | // Check that the dictionary has well formed elements, and no repeats. | |
22 | engMap := make(map[string]struct{}) | |
23 | for _, word := range englishDictionary { | |
24 | // Check that the word is long enough. | |
25 | if utf8.RuneCountInString(word) < EnglishUniquePrefixLen { | |
26 | t.Fatal("found a short word:", word) | |
27 | } | |
28 | ||
29 | // Check that the word is normalized. | |
30 | newWord := norm.NFC.String(word) | |
31 | if newWord != word { | |
32 | t.Error("found a non-normalized word:", word) | |
33 | } | |
34 | ||
35 | // Fetch the prefix, composed of the first EnglishUniquePrefixLen | |
36 | // runes. | |
37 | var prefix []byte | |
38 | var runeCount int | |
39 | for _, r := range word { | |
40 | encR := make([]byte, utf8.RuneLen(r)) | |
41 | utf8.EncodeRune(encR, r) | |
42 | prefix = append(prefix, encR...) | |
43 | ||
44 | runeCount++ | |
45 | if runeCount == EnglishUniquePrefixLen { | |
46 | break | |
47 | } | |
48 | } | |
49 | ||
50 | // Check that the prefix is unique. | |
51 | str := string(prefix) | |
52 | _, exists := engMap[str] | |
53 | if exists { | |
54 | t.Error("found a prefix conflict:", word) | |
55 | } | |
56 | engMap[str] = struct{}{} | |
57 | } | |
58 | ||
59 | // Do some conversions with the english dictionary. | |
60 | for i := 1; i <= 32; i++ { | |
61 | for j := 0; j < 5; j++ { | |
62 | entropy := make([]byte, i) | |
63 | _, err := rand.Read(entropy) | |
64 | if err != nil { | |
65 | t.Fatal(err) | |
66 | } | |
67 | phrase, err := ToPhrase(entropy, English) | |
68 | if err != nil { | |
69 | t.Fatal(err) | |
70 | } | |
71 | check, err := FromPhrase(phrase, English) | |
72 | if err != nil { | |
73 | t.Fatal(err) | |
74 | } | |
75 | if bytes.Compare(entropy, check) != 0 { | |
76 | t.Error("conversion check failed for the english dictionary") | |
77 | } | |
78 | } | |
79 | } | |
80 | ||
81 | // Check that words in a phrase can be altered according to the prefix | |
82 | // rule. | |
83 | entropy := []byte{1, 2, 3, 4} | |
84 | phrase := Phrase{"chladsf", "syr", "afiezzz"} | |
85 | check, err := FromPhrase(phrase, English) | |
86 | if err != nil { | |
87 | t.Fatal(err) | |
88 | } | |
89 | if bytes.Compare(entropy, check) != 0 { | |
90 | t.Error("phrase substitution failed") | |
91 | } | |
92 | } |
0 | package mnemonics | |
1 | ||
2 | // The german wordlist was pulled from the Monero project, license included | |
3 | // below. | |
4 | ||
5 | // Word list originally created by Shrikez | |
6 | // | |
7 | // Copyright (c) 2014-2015, The Monero Project | |
8 | // | |
9 | // All rights reserved. | |
10 | // | |
11 | // Redistribution and use in source and binary forms, with or without modification, are | |
12 | // permitted provided that the following conditions are met: | |
13 | // | |
14 | // 1. Redistributions of source code must retain the above copyright notice, this list of | |
15 | // conditions and the following disclaimer. | |
16 | // | |
17 | // 2. Redistributions in binary form must reproduce the above copyright notice, this list | |
18 | // of conditions and the following disclaimer in the documentation and/or other | |
19 | // materials provided with the distribution. | |
20 | // | |
21 | // 3. Neither the name of the copyright holder nor the names of its contributors may be | |
22 | // used to endorse or promote products derived from this software without specific | |
23 | // prior written permission. | |
24 | // | |
25 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY | |
26 | // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
27 | // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL | |
28 | // THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
29 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
30 | // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
31 | // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |
32 | // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF | |
33 | // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
34 | ||
35 | const ( | |
36 | // German is an id pointing to the standard password dictionary for german | |
37 | // users. | |
38 | German DictionaryID = "german" | |
39 | ||
40 | // GermanUniquePrefixLen indicates the number of letters needed to achieve | |
41 | // unique prefixes throughout the german dictionary. No two words in the | |
42 | // dictionary have the same prefix of len GermanUniquePrefixLen. | |
43 | GermanUniquePrefixLen = 4 | |
44 | ) | |
45 | ||
46 | var ( | |
47 | germanDictionary = Dictionary{ | |
48 | "Abakus", | |
49 | "Abart", | |
50 | "abbilden", | |
51 | "Abbruch", | |
52 | "Abdrift", | |
53 | "Abendrot", | |
54 | "Abfahrt", | |
55 | "abfeuern", | |
56 | "Abflug", | |
57 | "abfragen", | |
58 | "Abglanz", | |
59 | "abhärten", | |
60 | "abheben", | |
61 | "Abhilfe", | |
62 | "Abitur", | |
63 | "Abkehr", | |
64 | "Ablauf", | |
65 | "ablecken", | |
66 | "Ablösung", | |
67 | "Abnehmer", | |
68 | "abnutzen", | |
69 | "Abonnent", | |
70 | "Abrasion", | |
71 | "Abrede", | |
72 | "abrüsten", | |
73 | "Absicht", | |
74 | "Absprung", | |
75 | "Abstand", | |
76 | "absuchen", | |
77 | "Abteil", | |
78 | "Abundanz", | |
79 | "abwarten", | |
80 | "Abwurf", | |
81 | "Abzug", | |
82 | "Achse", | |
83 | "Achtung", | |
84 | "Acker", | |
85 | "Aderlass", | |
86 | "Adler", | |
87 | "Admiral", | |
88 | "Adresse", | |
89 | "Affe", | |
90 | "Affront", | |
91 | "Afrika", | |
92 | "Aggregat", | |
93 | "Agilität", | |
94 | "ähneln", | |
95 | "Ahnung", | |
96 | "Ahorn", | |
97 | "Akazie", | |
98 | "Akkord", | |
99 | "Akrobat", | |
100 | "Aktfoto", | |
101 | "Aktivist", | |
102 | "Albatros", | |
103 | "Alchimie", | |
104 | "Alemanne", | |
105 | "Alibi", | |
106 | "Alkohol", | |
107 | "Allee", | |
108 | "Allüre", | |
109 | "Almosen", | |
110 | "Almweide", | |
111 | "Aloe", | |
112 | "Alpaka", | |
113 | "Alpental", | |
114 | "Alphabet", | |
115 | "Alpinist", | |
116 | "Alraune", | |
117 | "Altbier", | |
118 | "Alter", | |
119 | "Altflöte", | |
120 | "Altruist", | |
121 | "Alublech", | |
122 | "Aludose", | |
123 | "Amateur", | |
124 | "Amazonas", | |
125 | "Ameise", | |
126 | "Amnesie", | |
127 | "Amok", | |
128 | "Ampel", | |
129 | "Amphibie", | |
130 | "Ampulle", | |
131 | "Amsel", | |
132 | "Amulett", | |
133 | "Anakonda", | |
134 | "Analogie", | |
135 | "Ananas", | |
136 | "Anarchie", | |
137 | "Anatomie", | |
138 | "Anbau", | |
139 | "Anbeginn", | |
140 | "anbieten", | |
141 | "Anblick", | |
142 | "ändern", | |
143 | "andocken", | |
144 | "Andrang", | |
145 | "anecken", | |
146 | "Anflug", | |
147 | "Anfrage", | |
148 | "Anführer", | |
149 | "Angebot", | |
150 | "Angler", | |
151 | "Anhalter", | |
152 | "Anhöhe", | |
153 | "Animator", | |
154 | "Anis", | |
155 | "Anker", | |
156 | "ankleben", | |
157 | "Ankunft", | |
158 | "Anlage", | |
159 | "anlocken", | |
160 | "Anmut", | |
161 | "Annahme", | |
162 | "Anomalie", | |
163 | "Anonymus", | |
164 | "Anorak", | |
165 | "anpeilen", | |
166 | "Anrecht", | |
167 | "Anruf", | |
168 | "Ansage", | |
169 | "Anschein", | |
170 | "Ansicht", | |
171 | "Ansporn", | |
172 | "Anteil", | |
173 | "Antlitz", | |
174 | "Antrag", | |
175 | "Antwort", | |
176 | "Anwohner", | |
177 | "Aorta", | |
178 | "Apfel", | |
179 | "Appetit", | |
180 | "Applaus", | |
181 | "Aquarium", | |
182 | "Arbeit", | |
183 | "Arche", | |
184 | "Argument", | |
185 | "Arktis", | |
186 | "Armband", | |
187 | "Aroma", | |
188 | "Asche", | |
189 | "Askese", | |
190 | "Asphalt", | |
191 | "Asteroid", | |
192 | "Ästhetik", | |
193 | "Astronom", | |
194 | "Atelier", | |
195 | "Athlet", | |
196 | "Atlantik", | |
197 | "Atmung", | |
198 | "Audienz", | |
199 | "aufatmen", | |
200 | "Auffahrt", | |
201 | "aufholen", | |
202 | "aufregen", | |
203 | "Aufsatz", | |
204 | "Auftritt", | |
205 | "Aufwand", | |
206 | "Augapfel", | |
207 | "Auktion", | |
208 | "Ausbruch", | |
209 | "Ausflug", | |
210 | "Ausgabe", | |
211 | "Aushilfe", | |
212 | "Ausland", | |
213 | "Ausnahme", | |
214 | "Aussage", | |
215 | "Autobahn", | |
216 | "Avocado", | |
217 | "Axthieb", | |
218 | "Bach", | |
219 | "backen", | |
220 | "Badesee", | |
221 | "Bahnhof", | |
222 | "Balance", | |
223 | "Balkon", | |
224 | "Ballett", | |
225 | "Balsam", | |
226 | "Banane", | |
227 | "Bandage", | |
228 | "Bankett", | |
229 | "Barbar", | |
230 | "Barde", | |
231 | "Barett", | |
232 | "Bargeld", | |
233 | "Barkasse", | |
234 | "Barriere", | |
235 | "Bart", | |
236 | "Bass", | |
237 | "Bastler", | |
238 | "Batterie", | |
239 | "Bauch", | |
240 | "Bauer", | |
241 | "Bauholz", | |
242 | "Baujahr", | |
243 | "Baum", | |
244 | "Baustahl", | |
245 | "Bauteil", | |
246 | "Bauweise", | |
247 | "Bazar", | |
248 | "beachten", | |
249 | "Beatmung", | |
250 | "beben", | |
251 | "Becher", | |
252 | "Becken", | |
253 | "bedanken", | |
254 | "beeilen", | |
255 | "beenden", | |
256 | "Beere", | |
257 | "befinden", | |
258 | "Befreier", | |
259 | "Begabung", | |
260 | "Begierde", | |
261 | "begrüßen", | |
262 | "Beiboot", | |
263 | "Beichte", | |
264 | "Beifall", | |
265 | "Beigabe", | |
266 | "Beil", | |
267 | "Beispiel", | |
268 | "Beitrag", | |
269 | "beizen", | |
270 | "bekommen", | |
271 | "beladen", | |
272 | "Beleg", | |
273 | "bellen", | |
274 | "belohnen", | |
275 | "Bemalung", | |
276 | "Bengel", | |
277 | "Benutzer", | |
278 | "Benzin", | |
279 | "beraten", | |
280 | "Bereich", | |
281 | "Bergluft", | |
282 | "Bericht", | |
283 | "Bescheid", | |
284 | "Besitz", | |
285 | "besorgen", | |
286 | "Bestand", | |
287 | "Besuch", | |
288 | "betanken", | |
289 | "beten", | |
290 | "betören", | |
291 | "Bett", | |
292 | "Beule", | |
293 | "Beute", | |
294 | "Bewegung", | |
295 | "bewirken", | |
296 | "Bewohner", | |
297 | "bezahlen", | |
298 | "Bezug", | |
299 | "biegen", | |
300 | "Biene", | |
301 | "Bierzelt", | |
302 | "bieten", | |
303 | "Bikini", | |
304 | "Bildung", | |
305 | "Billard", | |
306 | "binden", | |
307 | "Biobauer", | |
308 | "Biologe", | |
309 | "Bionik", | |
310 | "Biotop", | |
311 | "Birke", | |
312 | "Bison", | |
313 | "Bitte", | |
314 | "Biwak", | |
315 | "Bizeps", | |
316 | "blasen", | |
317 | "Blatt", | |
318 | "Blauwal", | |
319 | "Blende", | |
320 | "Blick", | |
321 | "Blitz", | |
322 | "Blockade", | |
323 | "Blödelei", | |
324 | "Blondine", | |
325 | "Blues", | |
326 | "Blume", | |
327 | "Blut", | |
328 | "Bodensee", | |
329 | "Bogen", | |
330 | "Boje", | |
331 | "Bollwerk", | |
332 | "Bonbon", | |
333 | "Bonus", | |
334 | "Boot", | |
335 | "Bordarzt", | |
336 | "Börse", | |
337 | "Böschung", | |
338 | "Boudoir", | |
339 | "Boxkampf", | |
340 | "Boykott", | |
341 | "Brahms", | |
342 | "Brandung", | |
343 | "Brauerei", | |
344 | "Brecher", | |
345 | "Breitaxt", | |
346 | "Bremse", | |
347 | "brennen", | |
348 | "Brett", | |
349 | "Brief", | |
350 | "Brigade", | |
351 | "Brillanz", | |
352 | "bringen", | |
353 | "brodeln", | |
354 | "Brosche", | |
355 | "Brötchen", | |
356 | "Brücke", | |
357 | "Brunnen", | |
358 | "Brüste", | |
359 | "Brutofen", | |
360 | "Buch", | |
361 | "Büffel", | |
362 | "Bugwelle", | |
363 | "Bühne", | |
364 | "Buletten", | |
365 | "Bullauge", | |
366 | "Bumerang", | |
367 | "bummeln", | |
368 | "Buntglas", | |
369 | "Bürde", | |
370 | "Burgherr", | |
371 | "Bursche", | |
372 | "Busen", | |
373 | "Buslinie", | |
374 | "Bussard", | |
375 | "Butangas", | |
376 | "Butter", | |
377 | "Cabrio", | |
378 | "campen", | |
379 | "Captain", | |
380 | "Cartoon", | |
381 | "Cello", | |
382 | "Chalet", | |
383 | "Charisma", | |
384 | "Chefarzt", | |
385 | "Chiffon", | |
386 | "Chipsatz", | |
387 | "Chirurg", | |
388 | "Chor", | |
389 | "Chronik", | |
390 | "Chuzpe", | |
391 | "Clubhaus", | |
392 | "Cockpit", | |
393 | "Codewort", | |
394 | "Cognac", | |
395 | "Coladose", | |
396 | "Computer", | |
397 | "Coupon", | |
398 | "Cousin", | |
399 | "Cracking", | |
400 | "Crash", | |
401 | "Curry", | |
402 | "Dach", | |
403 | "Dackel", | |
404 | "daddeln", | |
405 | "daliegen", | |
406 | "Dame", | |
407 | "Dammbau", | |
408 | "Dämon", | |
409 | "Dampflok", | |
410 | "Dank", | |
411 | "Darm", | |
412 | "Datei", | |
413 | "Datsche", | |
414 | "Datteln", | |
415 | "Datum", | |
416 | "Dauer", | |
417 | "Daunen", | |
418 | "Deckel", | |
419 | "Decoder", | |
420 | "Defekt", | |
421 | "Degen", | |
422 | "Dehnung", | |
423 | "Deiche", | |
424 | "Dekade", | |
425 | "Dekor", | |
426 | "Delfin", | |
427 | "Demut", | |
428 | "denken", | |
429 | "Deponie", | |
430 | "Design", | |
431 | "Desktop", | |
432 | "Dessert", | |
433 | "Detail", | |
434 | "Detektiv", | |
435 | "Dezibel", | |
436 | "Diadem", | |
437 | "Diagnose", | |
438 | "Dialekt", | |
439 | "Diamant", | |
440 | "Dichter", | |
441 | "Dickicht", | |
442 | "Diesel", | |
443 | "Diktat", | |
444 | "Diplom", | |
445 | "Direktor", | |
446 | "Dirne", | |
447 | "Diskurs", | |
448 | "Distanz", | |
449 | "Docht", | |
450 | "Dohle", | |
451 | "Dolch", | |
452 | "Domäne", | |
453 | "Donner", | |
454 | "Dorade", | |
455 | "Dorf", | |
456 | "Dörrobst", | |
457 | "Dorsch", | |
458 | "Dossier", | |
459 | "Dozent", | |
460 | "Drachen", | |
461 | "Draht", | |
462 | "Drama", | |
463 | "Drang", | |
464 | "Drehbuch", | |
465 | "Dreieck", | |
466 | "Dressur", | |
467 | "Drittel", | |
468 | "Drossel", | |
469 | "Druck", | |
470 | "Duell", | |
471 | "Duft", | |
472 | "Düne", | |
473 | "Dünung", | |
474 | "dürfen", | |
475 | "Duschbad", | |
476 | "Düsenjet", | |
477 | "Dynamik", | |
478 | "Ebbe", | |
479 | "Echolot", | |
480 | "Echse", | |
481 | "Eckball", | |
482 | "Edding", | |
483 | "Edelweiß", | |
484 | "Eden", | |
485 | "Edition", | |
486 | "Efeu", | |
487 | "Effekte", | |
488 | "Egoismus", | |
489 | "Ehre", | |
490 | "Eiablage", | |
491 | "Eiche", | |
492 | "Eidechse", | |
493 | "Eidotter", | |
494 | "Eierkopf", | |
495 | "Eigelb", | |
496 | "Eiland", | |
497 | "Eilbote", | |
498 | "Eimer", | |
499 | "einatmen", | |
500 | "Einband", | |
501 | "Eindruck", | |
502 | "Einfall", | |
503 | "Eingang", | |
504 | "Einkauf", | |
505 | "einladen", | |
506 | "Einöde", | |
507 | "Einrad", | |
508 | "Eintopf", | |
509 | "Einwurf", | |
510 | "Einzug", | |
511 | "Eisbär", | |
512 | "Eisen", | |
513 | "Eishöhle", | |
514 | "Eismeer", | |
515 | "Eiweiß", | |
516 | "Ekstase", | |
517 | "Elan", | |
518 | "Elch", | |
519 | "Elefant", | |
520 | "Eleganz", | |
521 | "Element", | |
522 | "Elfe", | |
523 | "Elite", | |
524 | "Elixier", | |
525 | "Ellbogen", | |
526 | "Eloquenz", | |
527 | "Emigrant", | |
528 | "Emission", | |
529 | "Emotion", | |
530 | "Empathie", | |
531 | "Empfang", | |
532 | "Endzeit", | |
533 | "Energie", | |
534 | "Engpass", | |
535 | "Enkel", | |
536 | "Enklave", | |
537 | "Ente", | |
538 | "entheben", | |
539 | "Entität", | |
540 | "entladen", | |
541 | "Entwurf", | |
542 | "Episode", | |
543 | "Epoche", | |
544 | "erachten", | |
545 | "Erbauer", | |
546 | "erblühen", | |
547 | "Erdbeere", | |
548 | "Erde", | |
549 | "Erdgas", | |
550 | "Erdkunde", | |
551 | "Erdnuss", | |
552 | "Erdöl", | |
553 | "Erdteil", | |
554 | "Ereignis", | |
555 | "Eremit", | |
556 | "erfahren", | |
557 | "Erfolg", | |
558 | "erfreuen", | |
559 | "erfüllen", | |
560 | "Ergebnis", | |
561 | "erhitzen", | |
562 | "erkalten", | |
563 | "erkennen", | |
564 | "erleben", | |
565 | "Erlösung", | |
566 | "ernähren", | |
567 | "erneuern", | |
568 | "Ernte", | |
569 | "Eroberer", | |
570 | "eröffnen", | |
571 | "Erosion", | |
572 | "Erotik", | |
573 | "Erpel", | |
574 | "erraten", | |
575 | "Erreger", | |
576 | "erröten", | |
577 | "Ersatz", | |
578 | "Erstflug", | |
579 | "Ertrag", | |
580 | "Eruption", | |
581 | "erwarten", | |
582 | "erwidern", | |
583 | "Erzbau", | |
584 | "Erzeuger", | |
585 | "erziehen", | |
586 | "Esel", | |
587 | "Eskimo", | |
588 | "Eskorte", | |
589 | "Espe", | |
590 | "Espresso", | |
591 | "essen", | |
592 | "Etage", | |
593 | "Etappe", | |
594 | "Etat", | |
595 | "Ethik", | |
596 | "Etikett", | |
597 | "Etüde", | |
598 | "Eule", | |
599 | "Euphorie", | |
600 | "Europa", | |
601 | "Everest", | |
602 | "Examen", | |
603 | "Exil", | |
604 | "Exodus", | |
605 | "Extrakt", | |
606 | "Fabel", | |
607 | "Fabrik", | |
608 | "Fachmann", | |
609 | "Fackel", | |
610 | "Faden", | |
611 | "Fagott", | |
612 | "Fahne", | |
613 | "Faible", | |
614 | "Fairness", | |
615 | "Fakt", | |
616 | "Fakultät", | |
617 | "Falke", | |
618 | "Fallobst", | |
619 | "Fälscher", | |
620 | "Faltboot", | |
621 | "Familie", | |
622 | "Fanclub", | |
623 | "Fanfare", | |
624 | "Fangarm", | |
625 | "Fantasie", | |
626 | "Farbe", | |
627 | "Farmhaus", | |
628 | "Farn", | |
629 | "Fasan", | |
630 | "Faser", | |
631 | "Fassung", | |
632 | "fasten", | |
633 | "Faulheit", | |
634 | "Fauna", | |
635 | "Faust", | |
636 | "Favorit", | |
637 | "Faxgerät", | |
638 | "Fazit", | |
639 | "fechten", | |
640 | "Federboa", | |
641 | "Fehler", | |
642 | "Feier", | |
643 | "Feige", | |
644 | "feilen", | |
645 | "Feinripp", | |
646 | "Feldbett", | |
647 | "Felge", | |
648 | "Fellpony", | |
649 | "Felswand", | |
650 | "Ferien", | |
651 | "Ferkel", | |
652 | "Fernweh", | |
653 | "Ferse", | |
654 | "Fest", | |
655 | "Fettnapf", | |
656 | "Feuer", | |
657 | "Fiasko", | |
658 | "Fichte", | |
659 | "Fiktion", | |
660 | "Film", | |
661 | "Filter", | |
662 | "Filz", | |
663 | "Finanzen", | |
664 | "Findling", | |
665 | "Finger", | |
666 | "Fink", | |
667 | "Finnwal", | |
668 | "Fisch", | |
669 | "Fitness", | |
670 | "Fixpunkt", | |
671 | "Fixstern", | |
672 | "Fjord", | |
673 | "Flachbau", | |
674 | "Flagge", | |
675 | "Flamenco", | |
676 | "Flanke", | |
677 | "Flasche", | |
678 | "Flaute", | |
679 | "Fleck", | |
680 | "Flegel", | |
681 | "flehen", | |
682 | "Fleisch", | |
683 | "fliegen", | |
684 | "Flinte", | |
685 | "Flirt", | |
686 | "Flocke", | |
687 | "Floh", | |
688 | "Floskel", | |
689 | "Floß", | |
690 | "Flöte", | |
691 | "Flugzeug", | |
692 | "Flunder", | |
693 | "Flusstal", | |
694 | "Flutung", | |
695 | "Fockmast", | |
696 | "Fohlen", | |
697 | "Föhnlage", | |
698 | "Fokus", | |
699 | "folgen", | |
700 | "Foliant", | |
701 | "Folklore", | |
702 | "Fontäne", | |
703 | "Förde", | |
704 | "Forelle", | |
705 | "Format", | |
706 | "Forscher", | |
707 | "Fortgang", | |
708 | "Forum", | |
709 | "Fotograf", | |
710 | "Frachter", | |
711 | "Fragment", | |
712 | "Fraktion", | |
713 | "fräsen", | |
714 | "Frauenpo", | |
715 | "Freak", | |
716 | "Fregatte", | |
717 | "Freiheit", | |
718 | "Freude", | |
719 | "Frieden", | |
720 | "Frohsinn", | |
721 | "Frosch", | |
722 | "Frucht", | |
723 | "Frühjahr", | |
724 | "Fuchs", | |
725 | "Fügung", | |
726 | "fühlen", | |
727 | "Füller", | |
728 | "Fundbüro", | |
729 | "Funkboje", | |
730 | "Funzel", | |
731 | "Furnier", | |
732 | "Fürsorge", | |
733 | "Fusel", | |
734 | "Fußbad", | |
735 | "Futteral", | |
736 | "Gabelung", | |
737 | "gackern", | |
738 | "Gage", | |
739 | "gähnen", | |
740 | "Galaxie", | |
741 | "Galeere", | |
742 | "Galopp", | |
743 | "Gameboy", | |
744 | "Gamsbart", | |
745 | "Gandhi", | |
746 | "Gang", | |
747 | "Garage", | |
748 | "Gardine", | |
749 | "Garküche", | |
750 | "Garten", | |
751 | "Gasthaus", | |
752 | "Gattung", | |
753 | "gaukeln", | |
754 | "Gazelle", | |
755 | "Gebäck", | |
756 | "Gebirge", | |
757 | "Gebräu", | |
758 | "Geburt", | |
759 | "Gedanke", | |
760 | "Gedeck", | |
761 | "Gedicht", | |
762 | "Gefahr", | |
763 | "Gefieder", | |
764 | "Geflügel", | |
765 | "Gefühl", | |
766 | "Gegend", | |
767 | "Gehirn", | |
768 | "Gehöft", | |
769 | "Gehweg", | |
770 | "Geige", | |
771 | "Geist", | |
772 | "Gelage", | |
773 | "Geld", | |
774 | "Gelenk", | |
775 | "Gelübde", | |
776 | "Gemälde", | |
777 | "Gemeinde", | |
778 | "Gemüse", | |
779 | "genesen", | |
780 | "Genuss", | |
781 | "Gepäck", | |
782 | "Geranie", | |
783 | "Gericht", | |
784 | "Germane", | |
785 | "Geruch", | |
786 | "Gesang", | |
787 | "Geschenk", | |
788 | "Gesetz", | |
789 | "Gesindel", | |
790 | "Gesöff", | |
791 | "Gespan", | |
792 | "Gestade", | |
793 | "Gesuch", | |
794 | "Getier", | |
795 | "Getränk", | |
796 | "Getümmel", | |
797 | "Gewand", | |
798 | "Geweih", | |
799 | "Gewitter", | |
800 | "Gewölbe", | |
801 | "Geysir", | |
802 | "Giftzahn", | |
803 | "Gipfel", | |
804 | "Giraffe", | |
805 | "Gitarre", | |
806 | "glänzen", | |
807 | "Glasauge", | |
808 | "Glatze", | |
809 | "Gleis", | |
810 | "Globus", | |
811 | "Glück", | |
812 | "glühen", | |
813 | "Glutofen", | |
814 | "Goldzahn", | |
815 | "Gondel", | |
816 | "gönnen", | |
817 | "Gottheit", | |
818 | "graben", | |
819 | "Grafik", | |
820 | "Grashalm", | |
821 | "Graugans", | |
822 | "greifen", | |
823 | "Grenze", | |
824 | "grillen", | |
825 | "Groschen", | |
826 | "Grotte", | |
827 | "Grube", | |
828 | "Grünalge", | |
829 | "Gruppe", | |
830 | "gruseln", | |
831 | "Gulasch", | |
832 | "Gummibär", | |
833 | "Gurgel", | |
834 | "Gürtel", | |
835 | "Güterzug", | |
836 | "Haarband", | |
837 | "Habicht", | |
838 | "hacken", | |
839 | "hadern", | |
840 | "Hafen", | |
841 | "Hagel", | |
842 | "Hähnchen", | |
843 | "Haifisch", | |
844 | "Haken", | |
845 | "Halbaffe", | |
846 | "Halsader", | |
847 | "halten", | |
848 | "Halunke", | |
849 | "Handbuch", | |
850 | "Hanf", | |
851 | "Harfe", | |
852 | "Harnisch", | |
853 | "härten", | |
854 | "Harz", | |
855 | "Hasenohr", | |
856 | "Haube", | |
857 | "hauchen", | |
858 | "Haupt", | |
859 | "Haut", | |
860 | "Havarie", | |
861 | "Hebamme", | |
862 | "hecheln", | |
863 | "Heck", | |
864 | "Hedonist", | |
865 | "Heiler", | |
866 | "Heimat", | |
867 | "Heizung", | |
868 | "Hektik", | |
869 | "Held", | |
870 | "helfen", | |
871 | "Helium", | |
872 | "Hemd", | |
873 | "hemmen", | |
874 | "Hengst", | |
875 | "Herd", | |
876 | "Hering", | |
877 | "Herkunft", | |
878 | "Hermelin", | |
879 | "Herrchen", | |
880 | "Herzdame", | |
881 | "Heulboje", | |
882 | "Hexe", | |
883 | "Hilfe", | |
884 | "Himbeere", | |
885 | "Himmel", | |
886 | "Hingabe", | |
887 | "hinhören", | |
888 | "Hinweis", | |
889 | "Hirsch", | |
890 | "Hirte", | |
891 | "Hitzkopf", | |
892 | "Hobel", | |
893 | "Hochform", | |
894 | "Hocker", | |
895 | "hoffen", | |
896 | "Hofhund", | |
897 | "Hofnarr", | |
898 | "Höhenzug", | |
899 | "Hohlraum", | |
900 | "Hölle", | |
901 | "Holzboot", | |
902 | "Honig", | |
903 | "Honorar", | |
904 | "horchen", | |
905 | "Hörprobe", | |
906 | "Höschen", | |
907 | "Hotel", | |
908 | "Hubraum", | |
909 | "Hufeisen", | |
910 | "Hügel", | |
911 | "huldigen", | |
912 | "Hülle", | |
913 | "Humbug", | |
914 | "Hummer", | |
915 | "Humor", | |
916 | "Hund", | |
917 | "Hunger", | |
918 | "Hupe", | |
919 | "Hürde", | |
920 | "Hurrikan", | |
921 | "Hydrant", | |
922 | "Hypnose", | |
923 | "Ibis", | |
924 | "Idee", | |
925 | "Idiot", | |
926 | "Igel", | |
927 | "Illusion", | |
928 | "Imitat", | |
929 | "impfen", | |
930 | "Import", | |
931 | "Inferno", | |
932 | "Ingwer", | |
933 | "Inhalte", | |
934 | "Inland", | |
935 | "Insekt", | |
936 | "Ironie", | |
937 | "Irrfahrt", | |
938 | "Irrtum", | |
939 | "Isolator", | |
940 | "Istwert", | |
941 | "Jacke", | |
942 | "Jade", | |
943 | "Jagdhund", | |
944 | "Jäger", | |
945 | "Jaguar", | |
946 | "Jahr", | |
947 | "Jähzorn", | |
948 | "Jazzfest", | |
949 | "Jetpilot", | |
950 | "jobben", | |
951 | "Jochbein", | |
952 | "jodeln", | |
953 | "Jodsalz", | |
954 | "Jolle", | |
955 | "Journal", | |
956 | "Jubel", | |
957 | "Junge", | |
958 | "Junimond", | |
959 | "Jupiter", | |
960 | "Jutesack", | |
961 | "Juwel", | |
962 | "Kabarett", | |
963 | "Kabine", | |
964 | "Kabuff", | |
965 | "Käfer", | |
966 | "Kaffee", | |
967 | "Kahlkopf", | |
968 | "Kaimauer", | |
969 | "Kajüte", | |
970 | "Kaktus", | |
971 | "Kaliber", | |
972 | "Kaltluft", | |
973 | "Kamel", | |
974 | "kämmen", | |
975 | "Kampagne", | |
976 | "Kanal", | |
977 | "Känguru", | |
978 | "Kanister", | |
979 | "Kanone", | |
980 | "Kante", | |
981 | "Kanu", | |
982 | "kapern", | |
983 | "Kapitän", | |
984 | "Kapuze", | |
985 | "Karneval", | |
986 | "Karotte", | |
987 | "Käsebrot", | |
988 | "Kasper", | |
989 | "Kastanie", | |
990 | "Katalog", | |
991 | "Kathode", | |
992 | "Katze", | |
993 | "kaufen", | |
994 | "Kaugummi", | |
995 | "Kauz", | |
996 | "Kehle", | |
997 | "Keilerei", | |
998 | "Keksdose", | |
999 | "Kellner", | |
1000 | "Keramik", | |
1001 | "Kerze", | |
1002 | "Kessel", | |
1003 | "Kette", | |
1004 | "keuchen", | |
1005 | "kichern", | |
1006 | "Kielboot", | |
1007 | "Kindheit", | |
1008 | "Kinnbart", | |
1009 | "Kinosaal", | |
1010 | "Kiosk", | |
1011 | "Kissen", | |
1012 | "Klammer", | |
1013 | "Klang", | |
1014 | "Klapprad", | |
1015 | "Klartext", | |
1016 | "kleben", | |
1017 | "Klee", | |
1018 | "Kleinod", | |
1019 | "Klima", | |
1020 | "Klingel", | |
1021 | "Klippe", | |
1022 | "Klischee", | |
1023 | "Kloster", | |
1024 | "Klugheit", | |
1025 | "Klüngel", | |
1026 | "kneten", | |
1027 | "Knie", | |
1028 | "Knöchel", | |
1029 | "knüpfen", | |
1030 | "Kobold", | |
1031 | "Kochbuch", | |
1032 | "Kohlrabi", | |
1033 | "Koje", | |
1034 | "Kokosöl", | |
1035 | "Kolibri", | |
1036 | "Kolumne", | |
1037 | "Kombüse", | |
1038 | "Komiker", | |
1039 | "kommen", | |
1040 | "Konto", | |
1041 | "Konzept", | |
1042 | "Kopfkino", | |
1043 | "Kordhose", | |
1044 | "Korken", | |
1045 | "Korsett", | |
1046 | "Kosename", | |
1047 | "Krabbe", | |
1048 | "Krach", | |
1049 | "Kraft", | |
1050 | "Krähe", | |
1051 | "Kralle", | |
1052 | "Krapfen", | |
1053 | "Krater", | |
1054 | "kraulen", | |
1055 | "Kreuz", | |
1056 | "Krokodil", | |
1057 | "Kröte", | |
1058 | "Kugel", | |
1059 | "Kuhhirt", | |
1060 | "Kühnheit", | |
1061 | "Künstler", | |
1062 | "Kurort", | |
1063 | "Kurve", | |
1064 | "Kurzfilm", | |
1065 | "kuscheln", | |
1066 | "küssen", | |
1067 | "Kutter", | |
1068 | "Labor", | |
1069 | "lachen", | |
1070 | "Lackaffe", | |
1071 | "Ladeluke", | |
1072 | "Lagune", | |
1073 | "Laib", | |
1074 | "Lakritze", | |
1075 | "Lammfell", | |
1076 | "Land", | |
1077 | "Langmut", | |
1078 | "Lappalie", | |
1079 | "Last", | |
1080 | "Laterne", | |
1081 | "Latzhose", | |
1082 | "Laubsäge", | |
1083 | "laufen", | |
1084 | "Laune", | |
1085 | "Lausbub", | |
1086 | "Lavasee", | |
1087 | "Leben", | |
1088 | "Leder", | |
1089 | "Leerlauf", | |
1090 | "Lehm", | |
1091 | "Lehrer", | |
1092 | "leihen", | |
1093 | "Lektüre", | |
1094 | "Lenker", | |
1095 | "Lerche", | |
1096 | "Leseecke", | |
1097 | "Leuchter", | |
1098 | "Lexikon", | |
1099 | "Libelle", | |
1100 | "Libido", | |
1101 | "Licht", | |
1102 | "Liebe", | |
1103 | "liefern", | |
1104 | "Liftboy", | |
1105 | "Limonade", | |
1106 | "Lineal", | |
1107 | "Linoleum", | |
1108 | "List", | |
1109 | "Liveband", | |
1110 | "Lobrede", | |
1111 | "locken", | |
1112 | "Löffel", | |
1113 | "Logbuch", | |
1114 | "Logik", | |
1115 | "Lohn", | |
1116 | "Loipe", | |
1117 | "Lokal", | |
1118 | "Lorbeer", | |
1119 | "Lösung", | |
1120 | "löten", | |
1121 | "Lottofee", | |
1122 | "Löwe", | |
1123 | "Luchs", | |
1124 | "Luder", | |
1125 | "Luftpost", | |
1126 | "Luke", | |
1127 | "Lümmel", | |
1128 | "Lunge", | |
1129 | "lutschen", | |
1130 | "Luxus", | |
1131 | "Macht", | |
1132 | "Magazin", | |
1133 | "Magier", | |
1134 | "Magnet", | |
1135 | "mähen", | |
1136 | "Mahlzeit", | |
1137 | "Mahnmal", | |
1138 | "Maibaum", | |
1139 | "Maisbrei", | |
1140 | "Makel", | |
1141 | "malen", | |
1142 | "Mammut", | |
1143 | "Maniküre", | |
1144 | "Mantel", | |
1145 | "Marathon", | |
1146 | "Marder", | |
1147 | "Marine", | |
1148 | "Marke", | |
1149 | "Marmor", | |
1150 | "Märzluft", | |
1151 | "Maske", | |
1152 | "Maßanzug", | |
1153 | "Maßkrug", | |
1154 | "Mastkorb", | |
1155 | "Material", | |
1156 | "Matratze", | |
1157 | "Mauerbau", | |
1158 | "Maulkorb", | |
1159 | "Mäuschen", | |
1160 | "Mäzen", | |
1161 | "Medium", | |
1162 | "Meinung", | |
1163 | "melden", | |
1164 | "Melodie", | |
1165 | "Mensch", | |
1166 | "Merkmal", | |
1167 | "Messe", | |
1168 | "Metall", | |
1169 | "Meteor", | |
1170 | "Methode", | |
1171 | "Metzger", | |
1172 | "Mieze", | |
1173 | "Milchkuh", | |
1174 | "Mimose", | |
1175 | "Minirock", | |
1176 | "Minute", | |
1177 | "mischen", | |
1178 | "Missetat", | |
1179 | "mitgehen", | |
1180 | "Mittag", | |
1181 | "Mixtape", | |
1182 | "Möbel", | |
1183 | "Modul", | |
1184 | "mögen", | |
1185 | "Möhre", | |
1186 | "Molch", | |
1187 | "Moment", | |
1188 | "Monat", | |
1189 | "Mondflug", | |
1190 | "Monitor", | |
1191 | "Monokini", | |
1192 | "Monster", | |
1193 | "Monument", | |
1194 | "Moorhuhn", | |
1195 | "Moos", | |
1196 | "Möpse", | |
1197 | "Moral", | |
1198 | "Mörtel", | |
1199 | "Motiv", | |
1200 | "Motorrad", | |
1201 | "Möwe", | |
1202 | "Mühe", | |
1203 | "Mulatte", | |
1204 | "Müller", | |
1205 | "Mumie", | |
1206 | "Mund", | |
1207 | "Münze", | |
1208 | "Muschel", | |
1209 | "Muster", | |
1210 | "Mythos", | |
1211 | "Nabel", | |
1212 | "Nachtzug", | |
1213 | "Nackedei", | |
1214 | "Nagel", | |
1215 | "Nähe", | |
1216 | "Nähnadel", | |
1217 | "Namen", | |
1218 | "Narbe", | |
1219 | "Narwal", | |
1220 | "Nasenbär", | |
1221 | "Natur", | |
1222 | "Nebel", | |
1223 | "necken", | |
1224 | "Neffe", | |
1225 | "Neigung", | |
1226 | "Nektar", | |
1227 | "Nenner", | |
1228 | "Neptun", | |
1229 | "Nerz", | |
1230 | "Nessel", | |
1231 | "Nestbau", | |
1232 | "Netz", | |
1233 | "Neubau", | |
1234 | "Neuerung", | |
1235 | "Neugier", | |
1236 | "nicken", | |
1237 | "Niere", | |
1238 | "Nilpferd", | |
1239 | "nisten", | |
1240 | "Nocke", | |
1241 | "Nomade", | |
1242 | "Nordmeer", | |
1243 | "Notdurft", | |
1244 | "Notstand", | |
1245 | "Notwehr", | |
1246 | "Nudismus", | |
1247 | "Nuss", | |
1248 | "Nutzhanf", | |
1249 | "Oase", | |
1250 | "Obdach", | |
1251 | "Oberarzt", | |
1252 | "Objekt", | |
1253 | "Oboe", | |
1254 | "Obsthain", | |
1255 | "Ochse", | |
1256 | "Odyssee", | |
1257 | "Ofenholz", | |
1258 | "öffnen", | |
1259 | "Ohnmacht", | |
1260 | "Ohrfeige", | |
1261 | "Ohrwurm", | |
1262 | "Ökologie", | |
1263 | "Oktave", | |
1264 | "Ölberg", | |
1265 | "Olive", | |
1266 | "Ölkrise", | |
1267 | "Omelett", | |
1268 | "Onkel", | |
1269 | "Oper", | |
1270 | "Optiker", | |
1271 | "Orange", | |
1272 | "Orchidee", | |
1273 | "ordnen", | |
1274 | "Orgasmus", | |
1275 | "Orkan", | |
1276 | "Ortskern", | |
1277 | "Ortung", | |
1278 | "Ostasien", | |
1279 | "Ozean", | |
1280 | "Paarlauf", | |
1281 | "Packeis", | |
1282 | "paddeln", | |
1283 | "Paket", | |
1284 | "Palast", | |
1285 | "Pandabär", | |
1286 | "Panik", | |
1287 | "Panorama", | |
1288 | "Panther", | |
1289 | "Papagei", | |
1290 | "Papier", | |
1291 | "Paprika", | |
1292 | "Paradies", | |
1293 | "Parka", | |
1294 | "Parodie", | |
1295 | "Partner", | |
1296 | "Passant", | |
1297 | "Patent", | |
1298 | "Patzer", | |
1299 | "Pause", | |
1300 | "Pavian", | |
1301 | "Pedal", | |
1302 | "Pegel", | |
1303 | "peilen", | |
1304 | "Perle", | |
1305 | "Person", | |
1306 | "Pfad", | |
1307 | "Pfau", | |
1308 | "Pferd", | |
1309 | "Pfleger", | |
1310 | "Physik", | |
1311 | "Pier", | |
1312 | "Pilotwal", | |
1313 | "Pinzette", | |
1314 | "Piste", | |
1315 | "Plakat", | |
1316 | "Plankton", | |
1317 | "Platin", | |
1318 | "Plombe", | |
1319 | "plündern", | |
1320 | "Pobacke", | |
1321 | "Pokal", | |
1322 | "polieren", | |
1323 | "Popmusik", | |
1324 | "Porträt", | |
1325 | "Posaune", | |
1326 | "Postamt", | |
1327 | "Pottwal", | |
1328 | "Pracht", | |
1329 | "Pranke", | |
1330 | "Preis", | |
1331 | "Primat", | |
1332 | "Prinzip", | |
1333 | "Protest", | |
1334 | "Proviant", | |
1335 | "Prüfung", | |
1336 | "Pubertät", | |
1337 | "Pudding", | |
1338 | "Pullover", | |
1339 | "Pulsader", | |
1340 | "Punkt", | |
1341 | "Pute", | |
1342 | "Putsch", | |
1343 | "Puzzle", | |
1344 | "Python", | |
1345 | "quaken", | |
1346 | "Qualle", | |
1347 | "Quark", | |
1348 | "Quellsee", | |
1349 | "Querkopf", | |
1350 | "Quitte", | |
1351 | "Quote", | |
1352 | "Rabauke", | |
1353 | "Rache", | |
1354 | "Radclub", | |
1355 | "Radhose", | |
1356 | "Radio", | |
1357 | "Radtour", | |
1358 | "Rahmen", | |
1359 | "Rampe", | |
1360 | "Randlage", | |
1361 | "Ranzen", | |
1362 | "Rapsöl", | |
1363 | "Raserei", | |
1364 | "rasten", | |
1365 | "Rasur", | |
1366 | "Rätsel", | |
1367 | "Raubtier", | |
1368 | "Raumzeit", | |
1369 | "Rausch", | |
1370 | "Reaktor", | |
1371 | "Realität", | |
1372 | "Rebell", | |
1373 | "Rede", | |
1374 | "Reetdach", | |
1375 | "Regatta", | |
1376 | "Regen", | |
1377 | "Rehkitz", | |
1378 | "Reifen", | |
1379 | "Reim", | |
1380 | "Reise", | |
1381 | "Reizung", | |
1382 | "Rekord", | |
1383 | "Relevanz", | |
1384 | "Rennboot", | |
1385 | "Respekt", | |
1386 | "Restmüll", | |
1387 | "retten", | |
1388 | "Reue", | |
1389 | "Revolte", | |
1390 | "Rhetorik", | |
1391 | "Rhythmus", | |
1392 | "Richtung", | |
1393 | "Riegel", | |
1394 | "Rindvieh", | |
1395 | "Rippchen", | |
1396 | "Ritter", | |
1397 | "Robbe", | |
1398 | "Roboter", | |
1399 | "Rockband", | |
1400 | "Rohdaten", | |
1401 | "Roller", | |
1402 | "Roman", | |
1403 | "röntgen", | |
1404 | "Rose", | |
1405 | "Rosskur", | |
1406 | "Rost", | |
1407 | "Rotahorn", | |
1408 | "Rotglut", | |
1409 | "Rotznase", | |
1410 | "Rubrik", | |
1411 | "Rückweg", | |
1412 | "Rufmord", | |
1413 | "Ruhe", | |
1414 | "Ruine", | |
1415 | "Rumpf", | |
1416 | "Runde", | |
1417 | "Rüstung", | |
1418 | "rütteln", | |
1419 | "Saaltür", | |
1420 | "Saatguts", | |
1421 | "Säbel", | |
1422 | "Sachbuch", | |
1423 | "Sack", | |
1424 | "Saft", | |
1425 | "sagen", | |
1426 | "Sahneeis", | |
1427 | "Salat", | |
1428 | "Salbe", | |
1429 | "Salz", | |
1430 | "Sammlung", | |
1431 | "Samt", | |
1432 | "Sandbank", | |
1433 | "Sanftmut", | |
1434 | "Sardine", | |
1435 | "Satire", | |
1436 | "Sattel", | |
1437 | "Satzbau", | |
1438 | "Sauerei", | |
1439 | "Saum", | |
1440 | "Säure", | |
1441 | "Schall", | |
1442 | "Scheitel", | |
1443 | "Schiff", | |
1444 | "Schlager", | |
1445 | "Schmied", | |
1446 | "Schnee", | |
1447 | "Scholle", | |
1448 | "Schrank", | |
1449 | "Schulbus", | |
1450 | "Schwan", | |
1451 | "Seeadler", | |
1452 | "Seefahrt", | |
1453 | "Seehund", | |
1454 | "Seeufer", | |
1455 | "segeln", | |
1456 | "Sehnerv", | |
1457 | "Seide", | |
1458 | "Seilzug", | |
1459 | "Senf", | |
1460 | "Sessel", | |
1461 | "Seufzer", | |
1462 | "Sexgott", | |
1463 | "Sichtung", | |
1464 | "Signal", | |
1465 | "Silber", | |
1466 | "singen", | |
1467 | "Sinn", | |
1468 | "Sirup", | |
1469 | "Sitzbank", | |
1470 | "Skandal", | |
1471 | "Skikurs", | |
1472 | "Skipper", | |
1473 | "Skizze", | |
1474 | "Smaragd", | |
1475 | "Socke", | |
1476 | "Sohn", | |
1477 | "Sommer", | |
1478 | "Songtext", | |
1479 | "Sorte", | |
1480 | "Spagat", | |
1481 | "Spannung", | |
1482 | "Spargel", | |
1483 | "Specht", | |
1484 | "Speiseöl", | |
1485 | "Spiegel", | |
1486 | "Sport", | |
1487 | "spülen", | |
1488 | "Stadtbus", | |
1489 | "Stall", | |
1490 | "Stärke", | |
1491 | "Stativ", | |
1492 | "staunen", | |
1493 | "Stern", | |
1494 | "Stiftung", | |
1495 | "Stollen", | |
1496 | "Strömung", | |
1497 | "Sturm", | |
1498 | "Substanz", | |
1499 | "Südalpen", | |
1500 | "Sumpf", | |
1501 | "surfen", | |
1502 | "Tabak", | |
1503 | "Tafel", | |
1504 | "Tagebau", | |
1505 | "takeln", | |
1506 | "Taktung", | |
1507 | "Talsohle", | |
1508 | "Tand", | |
1509 | "Tanzbär", | |
1510 | "Tapir", | |
1511 | "Tarantel", | |
1512 | "Tarnname", | |
1513 | "Tasse", | |
1514 | "Tatnacht", | |
1515 | "Tatsache", | |
1516 | "Tatze", | |
1517 | "Taube", | |
1518 | "tauchen", | |
1519 | "Taufpate", | |
1520 | "Taumel", | |
1521 | "Teelicht", | |
1522 | "Teich", | |
1523 | "teilen", | |
1524 | "Tempo", | |
1525 | "Tenor", | |
1526 | "Terrasse", | |
1527 | "Testflug", | |
1528 | "Theater", | |
1529 | "Thermik", | |
1530 | "ticken", | |
1531 | "Tiefflug", | |
1532 | "Tierart", | |
1533 | "Tigerhai", | |
1534 | "Tinte", | |
1535 | "Tischler", | |
1536 | "toben", | |
1537 | "Toleranz", | |
1538 | "Tölpel", | |
1539 | "Tonband", | |
1540 | "Topf", | |
1541 | "Topmodel", | |
1542 | "Torbogen", | |
1543 | "Torlinie", | |
1544 | "Torte", | |
1545 | "Tourist", | |
1546 | "Tragesel", | |
1547 | "trampeln", | |
1548 | "Trapez", | |
1549 | "Traum", | |
1550 | "treffen", | |
1551 | "Trennung", | |
1552 | "Treue", | |
1553 | "Trick", | |
1554 | "trimmen", | |
1555 | "Trödel", | |
1556 | "Trost", | |
1557 | "Trumpf", | |
1558 | "tüfteln", | |
1559 | "Turban", | |
1560 | "Turm", | |
1561 | "Übermut", | |
1562 | "Ufer", | |
1563 | "Uhrwerk", | |
1564 | "umarmen", | |
1565 | "Umbau", | |
1566 | "Umfeld", | |
1567 | "Umgang", | |
1568 | "Umsturz", | |
1569 | "Unart", | |
1570 | "Unfug", | |
1571 | "Unimog", | |
1572 | "Unruhe", | |
1573 | "Unwucht", | |
1574 | "Uranerz", | |
1575 | "Urlaub", | |
1576 | "Urmensch", | |
1577 | "Utopie", | |
1578 | "Vakuum", | |
1579 | "Valuta", | |
1580 | "Vandale", | |
1581 | "Vase", | |
1582 | "Vektor", | |
1583 | "Ventil", | |
1584 | "Verb", | |
1585 | "Verdeck", | |
1586 | "Verfall", | |
1587 | "Vergaser", | |
1588 | "verhexen", | |
1589 | "Verlag", | |
1590 | "Vers", | |
1591 | "Vesper", | |
1592 | "Vieh", | |
1593 | "Viereck", | |
1594 | "Vinyl", | |
1595 | "Virus", | |
1596 | "Vitrine", | |
1597 | "Vollblut", | |
1598 | "Vorbote", | |
1599 | "Vorrat", | |
1600 | "Vorsicht", | |
1601 | "Vulkan", | |
1602 | "Wachstum", | |
1603 | "Wade", | |
1604 | "Wagemut", | |
1605 | "Wahlen", | |
1606 | "Wahrheit", | |
1607 | "Wald", | |
1608 | "Walhai", | |
1609 | "Wallach", | |
1610 | "Walnuss", | |
1611 | "Walzer", | |
1612 | "wandeln", | |
1613 | "Wanze", | |
1614 | "wärmen", | |
1615 | "Warnruf", | |
1616 | "Wäsche", | |
1617 | "Wasser", | |
1618 | "Weberei", | |
1619 | "wechseln", | |
1620 | "Wegegeld", | |
1621 | "wehren", | |
1622 | "Weiher", | |
1623 | "Weinglas", | |
1624 | "Weißbier", | |
1625 | "Weitwurf", | |
1626 | "Welle", | |
1627 | "Weltall", | |
1628 | "Werkbank", | |
1629 | "Werwolf", | |
1630 | "Wetter", | |
1631 | "wiehern", | |
1632 | "Wildgans", | |
1633 | "Wind", | |
1634 | "Wohl", | |
1635 | "Wohnort", | |
1636 | "Wolf", | |
1637 | "Wollust", | |
1638 | "Wortlaut", | |
1639 | "Wrack", | |
1640 | "Wunder", | |
1641 | "Wurfaxt", | |
1642 | "Wurst", | |
1643 | "Yacht", | |
1644 | "Yeti", | |
1645 | "Zacke", | |
1646 | "Zahl", | |
1647 | "zähmen", | |
1648 | "Zahnfee", | |
1649 | "Zäpfchen", | |
1650 | "Zaster", | |
1651 | "Zaumzeug", | |
1652 | "Zebra", | |
1653 | "zeigen", | |
1654 | "Zeitlupe", | |
1655 | "Zellkern", | |
1656 | "Zeltdach", | |
1657 | "Zensor", | |
1658 | "Zerfall", | |
1659 | "Zeug", | |
1660 | "Ziege", | |
1661 | "Zielfoto", | |
1662 | "Zimteis", | |
1663 | "Zobel", | |
1664 | "Zollhund", | |
1665 | "Zombie", | |
1666 | "Zöpfe", | |
1667 | "Zucht", | |
1668 | "Zufahrt", | |
1669 | "Zugfahrt", | |
1670 | "Zugvogel", | |
1671 | "Zündung", | |
1672 | "Zweck", | |
1673 | "Zyklop", | |
1674 | } | |
1675 | ) |
0 | package mnemonics | |
1 | ||
2 | import ( | |
3 | "bytes" | |
4 | "crypto/rand" | |
5 | "testing" | |
6 | "unicode/utf8" | |
7 | ||
8 | "golang.org/x/text/unicode/norm" | |
9 | ) | |
10 | ||
11 | // TestGermanDictionary checks that the german dictionary is well formed. | |
12 | func TestGermanDictionary(t *testing.T) { | |
13 | // Check for sane constants. | |
14 | if German != "german" { | |
15 | t.Error("unexpected identifier for german dictionary") | |
16 | } | |
17 | if GermanUniquePrefixLen != 4 { | |
18 | t.Error("unexpected prefix len for german dictionary") | |
19 | } | |
20 | ||
21 | // Check that the dictionary has well formed elements, and no repeats. | |
22 | gerMap := make(map[string]struct{}) | |
23 | for _, word := range germanDictionary { | |
24 | // Check that the word is long enough. | |
25 | if utf8.RuneCountInString(word) < GermanUniquePrefixLen { | |
26 | t.Fatal("found a short word:", word) | |
27 | } | |
28 | ||
29 | // Check that the word is normalized. | |
30 | newWord := norm.NFC.String(word) | |
31 | if newWord != word { | |
32 | t.Error("found a non-normalized word:", word) | |
33 | } | |
34 | ||
35 | // Fetch the prefix, composed of the first GermanUniquePrefixLen runes. | |
36 | var prefix []byte | |
37 | var runeCount int | |
38 | for _, r := range word { | |
39 | encR := make([]byte, utf8.RuneLen(r)) | |
40 | utf8.EncodeRune(encR, r) | |
41 | prefix = append(prefix, encR...) | |
42 | ||
43 | runeCount++ | |
44 | if runeCount == GermanUniquePrefixLen { | |
45 | break | |
46 | } | |
47 | } | |
48 | ||
49 | // Check that the prefix is unique. | |
50 | str := string(prefix) | |
51 | _, exists := gerMap[str] | |
52 | if exists { | |
53 | t.Error("found a prefix conflict:", word) | |
54 | } | |
55 | gerMap[str] = struct{}{} | |
56 | } | |
57 | ||
58 | // Do some conversions with the german dictionary. | |
59 | for i := 1; i <= 32; i++ { | |
60 | for j := 0; j < 5; j++ { | |
61 | entropy := make([]byte, i) | |
62 | _, err := rand.Read(entropy) | |
63 | if err != nil { | |
64 | t.Fatal(err) | |
65 | } | |
66 | phrase, err := ToPhrase(entropy, German) | |
67 | if err != nil { | |
68 | t.Fatal(err) | |
69 | } | |
70 | check, err := FromPhrase(phrase, German) | |
71 | if err != nil { | |
72 | t.Fatal(err) | |
73 | } | |
74 | if bytes.Compare(entropy, check) != 0 { | |
75 | t.Error("conversion check failed for the german dictionary") | |
76 | } | |
77 | } | |
78 | } | |
79 | ||
80 | // Check that words in a phrase can be altered according to the prefix | |
81 | // rule. | |
82 | entropy := []byte{1, 2, 3, 4} | |
83 | phrase := Phrase{"bete", "Rieglfffffzzzz", "Abundans"} | |
84 | check, err := FromPhrase(phrase, German) | |
85 | if err != nil { | |
86 | t.Fatal(err) | |
87 | } | |
88 | if bytes.Compare(entropy, check) != 0 { | |
89 | t.Error("phrase substitution failed") | |
90 | } | |
91 | } |
0 | package mnemonics | |
1 | ||
2 | // The Japanese dictionary was pulled from the Monero project, license included | |
3 | // below. | |
4 | ||
5 | // Word list originally created by dabura667 | |
6 | // | |
7 | // Copyright (c) 2014-2015, The Monero Project | |
8 | // | |
9 | // All rights reserved. | |
10 | // | |
11 | // Redistribution and use in source and binary forms, with or without modification, are | |
12 | // permitted provided that the following conditions are met: | |
13 | // | |
14 | // 1. Redistributions of source code must retain the above copyright notice, this list of | |
15 | // conditions and the following disclaimer. | |
16 | // | |
17 | // 2. Redistributions in binary form must reproduce the above copyright notice, this list | |
18 | // of conditions and the following disclaimer in the documentation and/or other | |
19 | // materials provided with the distribution. | |
20 | // | |
21 | // 3. Neither the name of the copyright holder nor the names of its contributors may be | |
22 | // used to endorse or promote products derived from this software without specific | |
23 | // prior written permission. | |
24 | // | |
25 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY | |
26 | // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
27 | // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL | |
28 | // THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
29 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
30 | // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
31 | // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |
32 | // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF | |
33 | // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
34 | ||
35 | const ( | |
36 | // Japanese is an id pointing to the standard password dictionary for | |
37 | // Japanese users. | |
38 | Japanese DictionaryID = "japanese" | |
39 | ||
40 | // JapaneseUniquePrefixLen indicates the number of letters needed to | |
41 | // achieve unique prefixes throughout the Japanese dictionary. No two | |
42 | // words in the dictionary have the same prefix of len | |
43 | // JapaneseUniquePrefixLen. | |
44 | JapaneseUniquePrefixLen = 3 | |
45 | ) | |
46 | ||
47 | var ( | |
48 | japaneseDictionary = Dictionary{ | |
49 | "あいこくしん", | |
50 | "あいさつ", | |
51 | "あいだ", | |
52 | "あおぞら", | |
53 | "あかちゃん", | |
54 | "あきる", | |
55 | "あけがた", | |
56 | "あける", | |
57 | "あこがれる", | |
58 | "あさい", | |
59 | "あさひ", | |
60 | "あしあと", | |
61 | "あじわう", | |
62 | "あずかる", | |
63 | "あずき", | |
64 | "あそぶ", | |
65 | "あたえる", | |
66 | "あたためる", | |
67 | "あたりまえ", | |
68 | "あたる", | |
69 | "あつい", | |
70 | "あつかう", | |
71 | "あっしゅく", | |
72 | "あつまり", | |
73 | "あつめる", | |
74 | "あてな", | |
75 | "あてはまる", | |
76 | "あひる", | |
77 | "あぶら", | |
78 | "あぶる", | |
79 | "あふれる", | |
80 | "あまい", | |
81 | "あまど", | |
82 | "あまやかす", | |
83 | "あまり", | |
84 | "あみもの", | |
85 | "あめりか", | |
86 | "あやまる", | |
87 | "あゆむ", | |
88 | "あらいぐま", | |
89 | "あらし", | |
90 | "あらすじ", | |
91 | "あらためる", | |
92 | "あらゆる", | |
93 | "あらわす", | |
94 | "ありがとう", | |
95 | "あわせる", | |
96 | "あわてる", | |
97 | "あんい", | |
98 | "あんがい", | |
99 | "あんこ", | |
100 | "あんぜん", | |
101 | "あんてい", | |
102 | "あんない", | |
103 | "あんまり", | |
104 | "いいだす", | |
105 | "いおん", | |
106 | "いがい", | |
107 | "いがく", | |
108 | "いきおい", | |
109 | "いきなり", | |
110 | "いきもの", | |
111 | "いきる", | |
112 | "いくじ", | |
113 | "いくぶん", | |
114 | "いけばな", | |
115 | "いけん", | |
116 | "いこう", | |
117 | "いこく", | |
118 | "いこつ", | |
119 | "いさましい", | |
120 | "いさん", | |
121 | "いしき", | |
122 | "いじゅう", | |
123 | "いじょう", | |
124 | "いじわる", | |
125 | "いずみ", | |
126 | "いずれ", | |
127 | "いせい", | |
128 | "いせえび", | |
129 | "いせかい", | |
130 | "いせき", | |
131 | "いぜん", | |
132 | "いそうろう", | |
133 | "いそがしい", | |
134 | "いだい", | |
135 | "いだく", | |
136 | "いたずら", | |
137 | "いたみ", | |
138 | "いたりあ", | |
139 | "いちおう", | |
140 | "いちじ", | |
141 | "いちど", | |
142 | "いちば", | |
143 | "いちぶ", | |
144 | "いちりゅう", | |
145 | "いつか", | |
146 | "いっしゅん", | |
147 | "いっせい", | |
148 | "いっそう", | |
149 | "いったん", | |
150 | "いっち", | |
151 | "いってい", | |
152 | "いっぽう", | |
153 | "いてざ", | |
154 | "いてん", | |
155 | "いどう", | |
156 | "いとこ", | |
157 | "いない", | |
158 | "いなか", | |
159 | "いねむり", | |
160 | "いのち", | |
161 | "いのる", | |
162 | "いはつ", | |
163 | "いばる", | |
164 | "いはん", | |
165 | "いびき", | |
166 | "いひん", | |
167 | "いふく", | |
168 | "いへん", | |
169 | "いほう", | |
170 | "いみん", | |
171 | "いもうと", | |
172 | "いもたれ", | |
173 | "いもり", | |
174 | "いやがる", | |
175 | "いやす", | |
176 | "いよかん", | |
177 | "いよく", | |
178 | "いらい", | |
179 | "いらすと", | |
180 | "いりぐち", | |
181 | "いりょう", | |
182 | "いれい", | |
183 | "いれもの", | |
184 | "いれる", | |
185 | "いろえんぴつ", | |
186 | "いわい", | |
187 | "いわう", | |
188 | "いわかん", | |
189 | "いわば", | |
190 | "いわゆる", | |
191 | "いんげんまめ", | |
192 | "いんさつ", | |
193 | "いんしょう", | |
194 | "いんよう", | |
195 | "うえき", | |
196 | "うえる", | |
197 | "うおざ", | |
198 | "うがい", | |
199 | "うかぶ", | |
200 | "うかべる", | |
201 | "うきわ", | |
202 | "うくらいな", | |
203 | "うくれれ", | |
204 | "うけたまわる", | |
205 | "うけつけ", | |
206 | "うけとる", | |
207 | "うけもつ", | |
208 | "うける", | |
209 | "うごかす", | |
210 | "うごく", | |
211 | "うこん", | |
212 | "うさぎ", | |
213 | "うしなう", | |
214 | "うしろがみ", | |
215 | "うすい", | |
216 | "うすぎ", | |
217 | "うすぐらい", | |
218 | "うすめる", | |
219 | "うせつ", | |
220 | "うちあわせ", | |
221 | "うちがわ", | |
222 | "うちき", | |
223 | "うちゅう", | |
224 | "うっかり", | |
225 | "うつくしい", | |
226 | "うったえる", | |
227 | "うつる", | |
228 | "うどん", | |
229 | "うなぎ", | |
230 | "うなじ", | |
231 | "うなずく", | |
232 | "うなる", | |
233 | "うねる", | |
234 | "うのう", | |
235 | "うぶげ", | |
236 | "うぶごえ", | |
237 | "うまれる", | |
238 | "うめる", | |
239 | "うもう", | |
240 | "うやまう", | |
241 | "うよく", | |
242 | "うらがえす", | |
243 | "うらぐち", | |
244 | "うらない", | |
245 | "うりあげ", | |
246 | "うりきれ", | |
247 | "うるさい", | |
248 | "うれしい", | |
249 | "うれゆき", | |
250 | "うれる", | |
251 | "うろこ", | |
252 | "うわき", | |
253 | "うわさ", | |
254 | "うんこう", | |
255 | "うんちん", | |
256 | "うんてん", | |
257 | "うんどう", | |
258 | "えいえん", | |
259 | "えいが", | |
260 | "えいきょう", | |
261 | "えいご", | |
262 | "えいせい", | |
263 | "えいぶん", | |
264 | "えいよう", | |
265 | "えいわ", | |
266 | "えおり", | |
267 | "えがお", | |
268 | "えがく", | |
269 | "えきたい", | |
270 | "えくせる", | |
271 | "えしゃく", | |
272 | "えすて", | |
273 | "えつらん", | |
274 | "えのぐ", | |
275 | "えほうまき", | |
276 | "えほん", | |
277 | "えまき", | |
278 | "えもじ", | |
279 | "えもの", | |
280 | "えらい", | |
281 | "えらぶ", | |
282 | "えりあ", | |
283 | "えんえん", | |
284 | "えんかい", | |
285 | "えんぎ", | |
286 | "えんげき", | |
287 | "えんしゅう", | |
288 | "えんぜつ", | |
289 | "えんそく", | |
290 | "えんちょう", | |
291 | "えんとつ", | |
292 | "おいかける", | |
293 | "おいこす", | |
294 | "おいしい", | |
295 | "おいつく", | |
296 | "おうえん", | |
297 | "おうさま", | |
298 | "おうじ", | |
299 | "おうせつ", | |
300 | "おうたい", | |
301 | "おうふく", | |
302 | "おうべい", | |
303 | "おうよう", | |
304 | "おえる", | |
305 | "おおい", | |
306 | "おおう", | |
307 | "おおどおり", | |
308 | "おおや", | |
309 | "おおよそ", | |
310 | "おかえり", | |
311 | "おかず", | |
312 | "おがむ", | |
313 | "おかわり", | |
314 | "おぎなう", | |
315 | "おきる", | |
316 | "おくさま", | |
317 | "おくじょう", | |
318 | "おくりがな", | |
319 | "おくる", | |
320 | "おくれる", | |
321 | "おこす", | |
322 | "おこなう", | |
323 | "おこる", | |
324 | "おさえる", | |
325 | "おさない", | |
326 | "おさめる", | |
327 | "おしいれ", | |
328 | "おしえる", | |
329 | "おじぎ", | |
330 | "おじさん", | |
331 | "おしゃれ", | |
332 | "おそらく", | |
333 | "おそわる", | |
334 | "おたがい", | |
335 | "おたく", | |
336 | "おだやか", | |
337 | "おちつく", | |
338 | "おっと", | |
339 | "おつり", | |
340 | "おでかけ", | |
341 | "おとしもの", | |
342 | "おとなしい", | |
343 | "おどり", | |
344 | "おどろかす", | |
345 | "おばさん", | |
346 | "おまいり", | |
347 | "おめでとう", | |
348 | "おもいで", | |
349 | "おもう", | |
350 | "おもたい", | |
351 | "おもちゃ", | |
352 | "おやつ", | |
353 | "おやゆび", | |
354 | "およぼす", | |
355 | "おらんだ", | |
356 | "おろす", | |
357 | "おんがく", | |
358 | "おんけい", | |
359 | "おんしゃ", | |
360 | "おんせん", | |
361 | "おんだん", | |
362 | "おんちゅう", | |
363 | "おんどけい", | |
364 | "かあつ", | |
365 | "かいが", | |
366 | "がいき", | |
367 | "がいけん", | |
368 | "がいこう", | |
369 | "かいさつ", | |
370 | "かいしゃ", | |
371 | "かいすいよく", | |
372 | "かいぜん", | |
373 | "かいぞうど", | |
374 | "かいつう", | |
375 | "かいてん", | |
376 | "かいとう", | |
377 | "かいふく", | |
378 | "がいへき", | |
379 | "かいほう", | |
380 | "かいよう", | |
381 | "がいらい", | |
382 | "かいわ", | |
383 | "かえる", | |
384 | "かおり", | |
385 | "かかえる", | |
386 | "かがく", | |
387 | "かがし", | |
388 | "かがみ", | |
389 | "かくご", | |
390 | "かくとく", | |
391 | "かざる", | |
392 | "がぞう", | |
393 | "かたい", | |
394 | "かたち", | |
395 | "がちょう", | |
396 | "がっきゅう", | |
397 | "がっこう", | |
398 | "がっさん", | |
399 | "がっしょう", | |
400 | "かなざわし", | |
401 | "かのう", | |
402 | "がはく", | |
403 | "かぶか", | |
404 | "かほう", | |
405 | "かほご", | |
406 | "かまう", | |
407 | "かまぼこ", | |
408 | "かめれおん", | |
409 | "かゆい", | |
410 | "かようび", | |
411 | "からい", | |
412 | "かるい", | |
413 | "かろう", | |
414 | "かわく", | |
415 | "かわら", | |
416 | "がんか", | |
417 | "かんけい", | |
418 | "かんこう", | |
419 | "かんしゃ", | |
420 | "かんそう", | |
421 | "かんたん", | |
422 | "かんち", | |
423 | "がんばる", | |
424 | "きあい", | |
425 | "きあつ", | |
426 | "きいろ", | |
427 | "ぎいん", | |
428 | "きうい", | |
429 | "きうん", | |
430 | "きえる", | |
431 | "きおう", | |
432 | "きおく", | |
433 | "きおち", | |
434 | "きおん", | |
435 | "きかい", | |
436 | "きかく", | |
437 | "きかんしゃ", | |
438 | "ききて", | |
439 | "きくばり", | |
440 | "きくらげ", | |
441 | "きけんせい", | |
442 | "きこう", | |
443 | "きこえる", | |
444 | "きこく", | |
445 | "きさい", | |
446 | "きさく", | |
447 | "きさま", | |
448 | "きさらぎ", | |
449 | "ぎじかがく", | |
450 | "ぎしき", | |
451 | "ぎじたいけん", | |
452 | "ぎじにってい", | |
453 | "ぎじゅつしゃ", | |
454 | "きすう", | |
455 | "きせい", | |
456 | "きせき", | |
457 | "きせつ", | |
458 | "きそう", | |
459 | "きぞく", | |
460 | "きぞん", | |
461 | "きたえる", | |
462 | "きちょう", | |
463 | "きつえん", | |
464 | "ぎっちり", | |
465 | "きつつき", | |
466 | "きつね", | |
467 | "きてい", | |
468 | "きどう", | |
469 | "きどく", | |
470 | "きない", | |
471 | "きなが", | |
472 | "きなこ", | |
473 | "きぬごし", | |
474 | "きねん", | |
475 | "きのう", | |
476 | "きのした", | |
477 | "きはく", | |
478 | "きびしい", | |
479 | "きひん", | |
480 | "きふく", | |
481 | "きぶん", | |
482 | "きぼう", | |
483 | "きほん", | |
484 | "きまる", | |
485 | "きみつ", | |
486 | "きむずかしい", | |
487 | "きめる", | |
488 | "きもだめし", | |
489 | "きもち", | |
490 | "きもの", | |
491 | "きゃく", | |
492 | "きやく", | |
493 | "ぎゅうにく", | |
494 | "きよう", | |
495 | "きょうりゅう", | |
496 | "きらい", | |
497 | "きらく", | |
498 | "きりん", | |
499 | "きれい", | |
500 | "きれつ", | |
501 | "きろく", | |
502 | "ぎろん", | |
503 | "きわめる", | |
504 | "ぎんいろ", | |
505 | "きんかくじ", | |
506 | "きんじょ", | |
507 | "きんようび", | |
508 | "ぐあい", | |
509 | "くいず", | |
510 | "くうかん", | |
511 | "くうき", | |
512 | "くうぐん", | |
513 | "くうこう", | |
514 | "ぐうせい", | |
515 | "くうそう", | |
516 | "ぐうたら", | |
517 | "くうふく", | |
518 | "くうぼ", | |
519 | "くかん", | |
520 | "くきょう", | |
521 | "くげん", | |
522 | "ぐこう", | |
523 | "くさい", | |
524 | "くさき", | |
525 | "くさばな", | |
526 | "くさる", | |
527 | "くしゃみ", | |
528 | "くしょう", | |
529 | "くすのき", | |
530 | "くすりゆび", | |
531 | "くせげ", | |
532 | "くせん", | |
533 | "ぐたいてき", | |
534 | "くださる", | |
535 | "くたびれる", | |
536 | "くちこみ", | |
537 | "くちさき", | |
538 | "くつした", | |
539 | "ぐっすり", | |
540 | "くつろぐ", | |
541 | "くとうてん", | |
542 | "くどく", | |
543 | "くなん", | |
544 | "くねくね", | |
545 | "くのう", | |
546 | "くふう", | |
547 | "くみあわせ", | |
548 | "くみたてる", | |
549 | "くめる", | |
550 | "くやくしょ", | |
551 | "くらす", | |
552 | "くらべる", | |
553 | "くるま", | |
554 | "くれる", | |
555 | "くろう", | |
556 | "くわしい", | |
557 | "ぐんかん", | |
558 | "ぐんしょく", | |
559 | "ぐんたい", | |
560 | "ぐんて", | |
561 | "けあな", | |
562 | "けいかく", | |
563 | "けいけん", | |
564 | "けいこ", | |
565 | "けいさつ", | |
566 | "げいじゅつ", | |
567 | "けいたい", | |
568 | "げいのうじん", | |
569 | "けいれき", | |
570 | "けいろ", | |
571 | "けおとす", | |
572 | "けおりもの", | |
573 | "げきか", | |
574 | "げきげん", | |
575 | "げきだん", | |
576 | "げきちん", | |
577 | "げきとつ", | |
578 | "げきは", | |
579 | "げきやく", | |
580 | "げこう", | |
581 | "げこくじょう", | |
582 | "げざい", | |
583 | "けさき", | |
584 | "げざん", | |
585 | "けしき", | |
586 | "けしごむ", | |
587 | "けしょう", | |
588 | "げすと", | |
589 | "けたば", | |
590 | "けちゃっぷ", | |
591 | "けちらす", | |
592 | "けつあつ", | |
593 | "けつい", | |
594 | "けつえき", | |
595 | "けっこん", | |
596 | "けつじょ", | |
597 | "けっせき", | |
598 | "けってい", | |
599 | "けつまつ", | |
600 | "げつようび", | |
601 | "げつれい", | |
602 | "けつろん", | |
603 | "げどく", | |
604 | "けとばす", | |
605 | "けとる", | |
606 | "けなげ", | |
607 | "けなす", | |
608 | "けなみ", | |
609 | "けぬき", | |
610 | "げねつ", | |
611 | "けねん", | |
612 | "けはい", | |
613 | "げひん", | |
614 | "けぶかい", | |
615 | "げぼく", | |
616 | "けまり", | |
617 | "けみかる", | |
618 | "けむし", | |
619 | "けむり", | |
620 | "けもの", | |
621 | "けらい", | |
622 | "けろけろ", | |
623 | "けわしい", | |
624 | "けんい", | |
625 | "けんえつ", | |
626 | "けんお", | |
627 | "けんか", | |
628 | "げんき", | |
629 | "けんげん", | |
630 | "けんこう", | |
631 | "けんさく", | |
632 | "けんしゅう", | |
633 | "けんすう", | |
634 | "げんそう", | |
635 | "けんちく", | |
636 | "けんてい", | |
637 | "けんとう", | |
638 | "けんない", | |
639 | "けんにん", | |
640 | "げんぶつ", | |
641 | "けんま", | |
642 | "けんみん", | |
643 | "けんめい", | |
644 | "けんらん", | |
645 | "けんり", | |
646 | "こあくま", | |
647 | "こいぬ", | |
648 | "こいびと", | |
649 | "ごうい", | |
650 | "こうえん", | |
651 | "こうおん", | |
652 | "こうかん", | |
653 | "ごうきゅう", | |
654 | "ごうけい", | |
655 | "こうこう", | |
656 | "こうさい", | |
657 | "こうじ", | |
658 | "こうすい", | |
659 | "ごうせい", | |
660 | "こうそく", | |
661 | "こうたい", | |
662 | "こうちゃ", | |
663 | "こうつう", | |
664 | "こうてい", | |
665 | "こうどう", | |
666 | "こうない", | |
667 | "こうはい", | |
668 | "ごうほう", | |
669 | "ごうまん", | |
670 | "こうもく", | |
671 | "こうりつ", | |
672 | "こえる", | |
673 | "こおり", | |
674 | "ごかい", | |
675 | "ごがつ", | |
676 | "ごかん", | |
677 | "こくご", | |
678 | "こくさい", | |
679 | "こくとう", | |
680 | "こくない", | |
681 | "こくはく", | |
682 | "こぐま", | |
683 | "こけい", | |
684 | "こける", | |
685 | "ここのか", | |
686 | "こころ", | |
687 | "こさめ", | |
688 | "こしつ", | |
689 | "こすう", | |
690 | "こせい", | |
691 | "こせき", | |
692 | "こぜん", | |
693 | "こそだて", | |
694 | "こたい", | |
695 | "こたえる", | |
696 | "こたつ", | |
697 | "こちょう", | |
698 | "こっか", | |
699 | "こつこつ", | |
700 | "こつばん", | |
701 | "こつぶ", | |
702 | "こてい", | |
703 | "こてん", | |
704 | "ことがら", | |
705 | "ことし", | |
706 | "ことば", | |
707 | "ことり", | |
708 | "こなごな", | |
709 | "こねこね", | |
710 | "このまま", | |
711 | "このみ", | |
712 | "このよ", | |
713 | "ごはん", | |
714 | "こひつじ", | |
715 | "こふう", | |
716 | "こふん", | |
717 | "こぼれる", | |
718 | "ごまあぶら", | |
719 | "こまかい", | |
720 | "ごますり", | |
721 | "こまつな", | |
722 | "こまる", | |
723 | "こむぎこ", | |
724 | "こもじ", | |
725 | "こもち", | |
726 | "こもの", | |
727 | "こもん", | |
728 | "こやく", | |
729 | "こやま", | |
730 | "こゆう", | |
731 | "こゆび", | |
732 | "こよい", | |
733 | "こよう", | |
734 | "こりる", | |
735 | "これくしょん", | |
736 | "ころっけ", | |
737 | "こわもて", | |
738 | "こわれる", | |
739 | "こんいん", | |
740 | "こんかい", | |
741 | "こんき", | |
742 | "こんしゅう", | |
743 | "こんすい", | |
744 | "こんだて", | |
745 | "こんとん", | |
746 | "こんなん", | |
747 | "こんびに", | |
748 | "こんぽん", | |
749 | "こんまけ", | |
750 | "こんや", | |
751 | "こんれい", | |
752 | "こんわく", | |
753 | "ざいえき", | |
754 | "さいかい", | |
755 | "さいきん", | |
756 | "ざいげん", | |
757 | "ざいこ", | |
758 | "さいしょ", | |
759 | "さいせい", | |
760 | "ざいたく", | |
761 | "ざいちゅう", | |
762 | "さいてき", | |
763 | "ざいりょう", | |
764 | "さうな", | |
765 | "さかいし", | |
766 | "さがす", | |
767 | "さかな", | |
768 | "さかみち", | |
769 | "さがる", | |
770 | "さぎょう", | |
771 | "さくし", | |
772 | "さくひん", | |
773 | "さくら", | |
774 | "さこく", | |
775 | "さこつ", | |
776 | "さずかる", | |
777 | "ざせき", | |
778 | "さたん", | |
779 | "さつえい", | |
780 | "ざつおん", | |
781 | "ざっか", | |
782 | "ざつがく", | |
783 | "さっきょく", | |
784 | "ざっし", | |
785 | "さつじん", | |
786 | "ざっそう", | |
787 | "さつたば", | |
788 | "さつまいも", | |
789 | "さてい", | |
790 | "さといも", | |
791 | "さとう", | |
792 | "さとおや", | |
793 | "さとし", | |
794 | "さとる", | |
795 | "さのう", | |
796 | "さばく", | |
797 | "さびしい", | |
798 | "さべつ", | |
799 | "さほう", | |
800 | "さほど", | |
801 | "さます", | |
802 | "さみしい", | |
803 | "さみだれ", | |
804 | "さむけ", | |
805 | "さめる", | |
806 | "さやえんどう", | |
807 | "さゆう", | |
808 | "さよう", | |
809 | "さよく", | |
810 | "さらだ", | |
811 | "ざるそば", | |
812 | "さわやか", | |
813 | "さわる", | |
814 | "さんいん", | |
815 | "さんか", | |
816 | "さんきゃく", | |
817 | "さんこう", | |
818 | "さんさい", | |
819 | "ざんしょ", | |
820 | "さんすう", | |
821 | "さんせい", | |
822 | "さんそ", | |
823 | "さんち", | |
824 | "さんま", | |
825 | "さんみ", | |
826 | "さんらん", | |
827 | "しあい", | |
828 | "しあげ", | |
829 | "しあさって", | |
830 | "しあわせ", | |
831 | "しいく", | |
832 | "しいん", | |
833 | "しうち", | |
834 | "しえい", | |
835 | "しおけ", | |
836 | "しかい", | |
837 | "しかく", | |
838 | "じかん", | |
839 | "しごと", | |
840 | "しすう", | |
841 | "じだい", | |
842 | "したうけ", | |
843 | "したぎ", | |
844 | "したて", | |
845 | "したみ", | |
846 | "しちょう", | |
847 | "しちりん", | |
848 | "しっかり", | |
849 | "しつじ", | |
850 | "しつもん", | |
851 | "してい", | |
852 | "してき", | |
853 | "してつ", | |
854 | "じてん", | |
855 | "じどう", | |
856 | "しなぎれ", | |
857 | "しなもの", | |
858 | "しなん", | |
859 | "しねま", | |
860 | "しねん", | |
861 | "しのぐ", | |
862 | "しのぶ", | |
863 | "しはい", | |
864 | "しばかり", | |
865 | "しはつ", | |
866 | "しはらい", | |
867 | "しはん", | |
868 | "しひょう", | |
869 | "しふく", | |
870 | "じぶん", | |
871 | "しへい", | |
872 | "しほう", | |
873 | "しほん", | |
874 | "しまう", | |
875 | "しまる", | |
876 | "しみん", | |
877 | "しむける", | |
878 | "じむしょ", | |
879 | "しめい", | |
880 | "しめる", | |
881 | "しもん", | |
882 | "しゃいん", | |
883 | "しゃうん", | |
884 | "しゃおん", | |
885 | "じゃがいも", | |
886 | "しやくしょ", | |
887 | "しゃくほう", | |
888 | "しゃけん", | |
889 | "しゃこ", | |
890 | "しゃざい", | |
891 | "しゃしん", | |
892 | "しゃせん", | |
893 | "しゃそう", | |
894 | "しゃたい", | |
895 | "しゃちょう", | |
896 | "しゃっきん", | |
897 | "じゃま", | |
898 | "しゃりん", | |
899 | "しゃれい", | |
900 | "じゆう", | |
901 | "じゅうしょ", | |
902 | "しゅくはく", | |
903 | "じゅしん", | |
904 | "しゅっせき", | |
905 | "しゅみ", | |
906 | "しゅらば", | |
907 | "じゅんばん", | |
908 | "しょうかい", | |
909 | "しょくたく", | |
910 | "しょっけん", | |
911 | "しょどう", | |
912 | "しょもつ", | |
913 | "しらせる", | |
914 | "しらべる", | |
915 | "しんか", | |
916 | "しんこう", | |
917 | "じんじゃ", | |
918 | "しんせいじ", | |
919 | "しんちく", | |
920 | "しんりん", | |
921 | "すあげ", | |
922 | "すあし", | |
923 | "すあな", | |
924 | "ずあん", | |
925 | "すいえい", | |
926 | "すいか", | |
927 | "すいとう", | |
928 | "ずいぶん", | |
929 | "すいようび", | |
930 | "すうがく", | |
931 | "すうじつ", | |
932 | "すうせん", | |
933 | "すおどり", | |
934 | "すきま", | |
935 | "すくう", | |
936 | "すくない", | |
937 | "すける", | |
938 | "すごい", | |
939 | "すこし", | |
940 | "ずさん", | |
941 | "すずしい", | |
942 | "すすむ", | |
943 | "すすめる", | |
944 | "すっかり", | |
945 | "ずっしり", | |
946 | "ずっと", | |
947 | "すてき", | |
948 | "すてる", | |
949 | "すねる", | |
950 | "すのこ", | |
951 | "すはだ", | |
952 | "すばらしい", | |
953 | "ずひょう", | |
954 | "ずぶぬれ", | |
955 | "すぶり", | |
956 | "すふれ", | |
957 | "すべて", | |
958 | "すべる", | |
959 | "ずほう", | |
960 | "すぼん", | |
961 | "すまい", | |
962 | "すめし", | |
963 | "すもう", | |
964 | "すやき", | |
965 | "すらすら", | |
966 | "するめ", | |
967 | "すれちがう", | |
968 | "すろっと", | |
969 | "すわる", | |
970 | "すんぜん", | |
971 | "すんぽう", | |
972 | "せあぶら", | |
973 | "せいかつ", | |
974 | "せいげん", | |
975 | "せいじ", | |
976 | "せいよう", | |
977 | "せおう", | |
978 | "せかいかん", | |
979 | "せきにん", | |
980 | "せきむ", | |
981 | "せきゆ", | |
982 | "せきらんうん", | |
983 | "せけん", | |
984 | "せこう", | |
985 | "せすじ", | |
986 | "せたい", | |
987 | "せたけ", | |
988 | "せっかく", | |
989 | "せっきゃく", | |
990 | "ぜっく", | |
991 | "せっけん", | |
992 | "せっこつ", | |
993 | "せっさたくま", | |
994 | "せつぞく", | |
995 | "せつだん", | |
996 | "せつでん", | |
997 | "せっぱん", | |
998 | "せつび", | |
999 | "せつぶん", | |
1000 | "せつめい", | |
1001 | "せつりつ", | |
1002 | "せなか", | |
1003 | "せのび", | |
1004 | "せはば", | |
1005 | "せびろ", | |
1006 | "せぼね", | |
1007 | "せまい", | |
1008 | "せまる", | |
1009 | "せめる", | |
1010 | "せもたれ", | |
1011 | "せりふ", | |
1012 | "ぜんあく", | |
1013 | "せんい", | |
1014 | "せんえい", | |
1015 | "せんか", | |
1016 | "せんきょ", | |
1017 | "せんく", | |
1018 | "せんげん", | |
1019 | "ぜんご", | |
1020 | "せんさい", | |
1021 | "せんしゅ", | |
1022 | "せんすい", | |
1023 | "せんせい", | |
1024 | "せんぞ", | |
1025 | "せんたく", | |
1026 | "せんちょう", | |
1027 | "せんてい", | |
1028 | "せんとう", | |
1029 | "せんぬき", | |
1030 | "せんねん", | |
1031 | "せんぱい", | |
1032 | "ぜんぶ", | |
1033 | "ぜんぽう", | |
1034 | "せんむ", | |
1035 | "せんめんじょ", | |
1036 | "せんもん", | |
1037 | "せんやく", | |
1038 | "せんゆう", | |
1039 | "せんよう", | |
1040 | "ぜんら", | |
1041 | "ぜんりゃく", | |
1042 | "せんれい", | |
1043 | "せんろ", | |
1044 | "そあく", | |
1045 | "そいとげる", | |
1046 | "そいね", | |
1047 | "そうがんきょう", | |
1048 | "そうき", | |
1049 | "そうご", | |
1050 | "そうしん", | |
1051 | "そうだん", | |
1052 | "そうなん", | |
1053 | "そうび", | |
1054 | "そうめん", | |
1055 | "そうり", | |
1056 | "そえもの", | |
1057 | "そえん", | |
1058 | "そがい", | |
1059 | "そげき", | |
1060 | "そこう", | |
1061 | "そこそこ", | |
1062 | "そざい", | |
1063 | "そしな", | |
1064 | "そせい", | |
1065 | "そせん", | |
1066 | "そそぐ", | |
1067 | "そだてる", | |
1068 | "そつう", | |
1069 | "そつえん", | |
1070 | "そっかん", | |
1071 | "そつぎょう", | |
1072 | "そっけつ", | |
1073 | "そっこう", | |
1074 | "そっせん", | |
1075 | "そっと", | |
1076 | "そとがわ", | |
1077 | "そとづら", | |
1078 | "そなえる", | |
1079 | "そなた", | |
1080 | "そふぼ", | |
1081 | "そぼく", | |
1082 | "そぼろ", | |
1083 | "そまつ", | |
1084 | "そまる", | |
1085 | "そむく", | |
1086 | "そむりえ", | |
1087 | "そめる", | |
1088 | "そもそも", | |
1089 | "そよかぜ", | |
1090 | "そらまめ", | |
1091 | "そろう", | |
1092 | "そんかい", | |
1093 | "そんけい", | |
1094 | "そんざい", | |
1095 | "そんしつ", | |
1096 | "そんぞく", | |
1097 | "そんちょう", | |
1098 | "ぞんび", | |
1099 | "ぞんぶん", | |
1100 | "そんみん", | |
1101 | "たあい", | |
1102 | "たいいん", | |
1103 | "たいうん", | |
1104 | "たいえき", | |
1105 | "たいおう", | |
1106 | "だいがく", | |
1107 | "たいき", | |
1108 | "たいぐう", | |
1109 | "たいけん", | |
1110 | "たいこ", | |
1111 | "たいざい", | |
1112 | "だいじょうぶ", | |
1113 | "だいすき", | |
1114 | "たいせつ", | |
1115 | "たいそう", | |
1116 | "だいたい", | |
1117 | "たいちょう", | |
1118 | "たいてい", | |
1119 | "だいどころ", | |
1120 | "たいない", | |
1121 | "たいねつ", | |
1122 | "たいのう", | |
1123 | "たいはん", | |
1124 | "だいひょう", | |
1125 | "たいふう", | |
1126 | "たいへん", | |
1127 | "たいほ", | |
1128 | "たいまつばな", | |
1129 | "たいみんぐ", | |
1130 | "たいむ", | |
1131 | "たいめん", | |
1132 | "たいやき", | |
1133 | "たいよう", | |
1134 | "たいら", | |
1135 | "たいりょく", | |
1136 | "たいる", | |
1137 | "たいわん", | |
1138 | "たうえ", | |
1139 | "たえる", | |
1140 | "たおす", | |
1141 | "たおる", | |
1142 | "たおれる", | |
1143 | "たかい", | |
1144 | "たかね", | |
1145 | "たきび", | |
1146 | "たくさん", | |
1147 | "たこく", | |
1148 | "たこやき", | |
1149 | "たさい", | |
1150 | "たしざん", | |
1151 | "だじゃれ", | |
1152 | "たすける", | |
1153 | "たずさわる", | |
1154 | "たそがれ", | |
1155 | "たたかう", | |
1156 | "たたく", | |
1157 | "ただしい", | |
1158 | "たたみ", | |
1159 | "たちばな", | |
1160 | "だっかい", | |
1161 | "だっきゃく", | |
1162 | "だっこ", | |
1163 | "だっしゅつ", | |
1164 | "だったい", | |
1165 | "たてる", | |
1166 | "たとえる", | |
1167 | "たなばた", | |
1168 | "たにん", | |
1169 | "たぬき", | |
1170 | "たのしみ", | |
1171 | "たはつ", | |
1172 | "たぶん", | |
1173 | "たべる", | |
1174 | "たぼう", | |
1175 | "たまご", | |
1176 | "たまる", | |
1177 | "だむる", | |
1178 | "ためいき", | |
1179 | "ためす", | |
1180 | "ためる", | |
1181 | "たもつ", | |
1182 | "たやすい", | |
1183 | "たよる", | |
1184 | "たらす", | |
1185 | "たりきほんがん", | |
1186 | "たりょう", | |
1187 | "たりる", | |
1188 | "たると", | |
1189 | "たれる", | |
1190 | "たれんと", | |
1191 | "たろっと", | |
1192 | "たわむれる", | |
1193 | "だんあつ", | |
1194 | "たんい", | |
1195 | "たんおん", | |
1196 | "たんか", | |
1197 | "たんき", | |
1198 | "たんけん", | |
1199 | "たんご", | |
1200 | "たんさん", | |
1201 | "たんじょうび", | |
1202 | "だんせい", | |
1203 | "たんそく", | |
1204 | "たんたい", | |
1205 | "だんち", | |
1206 | "たんてい", | |
1207 | "たんとう", | |
1208 | "だんな", | |
1209 | "たんにん", | |
1210 | "だんねつ", | |
1211 | "たんのう", | |
1212 | "たんぴん", | |
1213 | "だんぼう", | |
1214 | "たんまつ", | |
1215 | "たんめい", | |
1216 | "だんれつ", | |
1217 | "だんろ", | |
1218 | "だんわ", | |
1219 | "ちあい", | |
1220 | "ちあん", | |
1221 | "ちいき", | |
1222 | "ちいさい", | |
1223 | "ちえん", | |
1224 | "ちかい", | |
1225 | "ちから", | |
1226 | "ちきゅう", | |
1227 | "ちきん", | |
1228 | "ちけいず", | |
1229 | "ちけん", | |
1230 | "ちこく", | |
1231 | "ちさい", | |
1232 | "ちしき", | |
1233 | "ちしりょう", | |
1234 | "ちせい", | |
1235 | "ちそう", | |
1236 | "ちたい", | |
1237 | "ちたん", | |
1238 | "ちちおや", | |
1239 | "ちつじょ", | |
1240 | "ちてき", | |
1241 | "ちてん", | |
1242 | "ちぬき", | |
1243 | "ちぬり", | |
1244 | "ちのう", | |
1245 | "ちひょう", | |
1246 | "ちへいせん", | |
1247 | "ちほう", | |
1248 | "ちまた", | |
1249 | "ちみつ", | |
1250 | "ちみどろ", | |
1251 | "ちめいど", | |
1252 | "ちゃんこなべ", | |
1253 | "ちゅうい", | |
1254 | "ちゆりょく", | |
1255 | "ちょうし", | |
1256 | "ちょさくけん", | |
1257 | "ちらし", | |
1258 | "ちらみ", | |
1259 | "ちりがみ", | |
1260 | "ちりょう", | |
1261 | "ちるど", | |
1262 | "ちわわ", | |
1263 | "ちんたい", | |
1264 | "ちんもく", | |
1265 | "ついか", | |
1266 | "ついたち", | |
1267 | "つうか", | |
1268 | "つうじょう", | |
1269 | "つうはん", | |
1270 | "つうわ", | |
1271 | "つかう", | |
1272 | "つかれる", | |
1273 | "つくね", | |
1274 | "つくる", | |
1275 | "つけね", | |
1276 | "つける", | |
1277 | "つごう", | |
1278 | "つたえる", | |
1279 | "つづく", | |
1280 | "つつじ", | |
1281 | "つつむ", | |
1282 | "つとめる", | |
1283 | "つながる", | |
1284 | "つなみ", | |
1285 | "つねづね", | |
1286 | "つのる", | |
1287 | "つぶす", | |
1288 | "つまらない", | |
1289 | "つまる", | |
1290 | "つみき", | |
1291 | "つめたい", | |
1292 | "つもり", | |
1293 | "つもる", | |
1294 | "つよい", | |
1295 | "つるぼ", | |
1296 | "つるみく", | |
1297 | "つわもの", | |
1298 | "つわり", | |
1299 | "てあし", | |
1300 | "てあて", | |
1301 | "てあみ", | |
1302 | "ていおん", | |
1303 | "ていか", | |
1304 | "ていき", | |
1305 | "ていけい", | |
1306 | "ていこく", | |
1307 | "ていさつ", | |
1308 | "ていし", | |
1309 | "ていせい", | |
1310 | "ていたい", | |
1311 | "ていど", | |
1312 | "ていねい", | |
1313 | "ていひょう", | |
1314 | "ていへん", | |
1315 | "ていぼう", | |
1316 | "てうち", | |
1317 | "ておくれ", | |
1318 | "てきとう", | |
1319 | "てくび", | |
1320 | "でこぼこ", | |
1321 | "てさぎょう", | |
1322 | "てさげ", | |
1323 | "てすり", | |
1324 | "てそう", | |
1325 | "てちがい", | |
1326 | "てちょう", | |
1327 | "てつがく", | |
1328 | "てつづき", | |
1329 | "でっぱ", | |
1330 | "てつぼう", | |
1331 | "てつや", | |
1332 | "でぬかえ", | |
1333 | "てぬき", | |
1334 | "てぬぐい", | |
1335 | "てのひら", | |
1336 | "てはい", | |
1337 | "てぶくろ", | |
1338 | "てふだ", | |
1339 | "てほどき", | |
1340 | "てほん", | |
1341 | "てまえ", | |
1342 | "てまきずし", | |
1343 | "てみじか", | |
1344 | "てみやげ", | |
1345 | "てらす", | |
1346 | "てれび", | |
1347 | "てわけ", | |
1348 | "てわたし", | |
1349 | "でんあつ", | |
1350 | "てんいん", | |
1351 | "てんかい", | |
1352 | "てんき", | |
1353 | "てんぐ", | |
1354 | "てんけん", | |
1355 | "てんごく", | |
1356 | "てんさい", | |
1357 | "てんし", | |
1358 | "てんすう", | |
1359 | "でんち", | |
1360 | "てんてき", | |
1361 | "てんとう", | |
1362 | "てんない", | |
1363 | "てんぷら", | |
1364 | "てんぼうだい", | |
1365 | "てんめつ", | |
1366 | "てんらんかい", | |
1367 | "でんりょく", | |
1368 | "でんわ", | |
1369 | "どあい", | |
1370 | "といれ", | |
1371 | "どうかん", | |
1372 | "とうきゅう", | |
1373 | "どうぐ", | |
1374 | "とうし", | |
1375 | "とうむぎ", | |
1376 | "とおい", | |
1377 | "とおか", | |
1378 | "とおく", | |
1379 | "とおす", | |
1380 | "とおる", | |
1381 | "とかい", | |
1382 | "とかす", | |
1383 | "ときおり", | |
1384 | "ときどき", | |
1385 | "とくい", | |
1386 | "とくしゅう", | |
1387 | "とくてん", | |
1388 | "とくに", | |
1389 | "とくべつ", | |
1390 | "とけい", | |
1391 | "とける", | |
1392 | "とこや", | |
1393 | "とさか", | |
1394 | "としょかん", | |
1395 | "とそう", | |
1396 | "とたん", | |
1397 | "とちゅう", | |
1398 | "とっきゅう", | |
1399 | "とっくん", | |
1400 | "とつぜん", | |
1401 | "とつにゅう", | |
1402 | "とどける", | |
1403 | "ととのえる", | |
1404 | "とない", | |
1405 | "となえる", | |
1406 | "となり", | |
1407 | "とのさま", | |
1408 | "とばす", | |
1409 | "どぶがわ", | |
1410 | "とほう", | |
1411 | "とまる", | |
1412 | "とめる", | |
1413 | "ともだち", | |
1414 | "ともる", | |
1415 | "どようび", | |
1416 | "とらえる", | |
1417 | "とんかつ", | |
1418 | "どんぶり", | |
1419 | "ないかく", | |
1420 | "ないこう", | |
1421 | "ないしょ", | |
1422 | "ないす", | |
1423 | "ないせん", | |
1424 | "ないそう", | |
1425 | "なおす", | |
1426 | "ながい", | |
1427 | "なくす", | |
1428 | "なげる", | |
1429 | "なこうど", | |
1430 | "なさけ", | |
1431 | "なたでここ", | |
1432 | "なっとう", | |
1433 | "なつやすみ", | |
1434 | "ななおし", | |
1435 | "なにごと", | |
1436 | "なにもの", | |
1437 | "なにわ", | |
1438 | "なのか", | |
1439 | "なふだ", | |
1440 | "なまいき", | |
1441 | "なまえ", | |
1442 | "なまみ", | |
1443 | "なみだ", | |
1444 | "なめらか", | |
1445 | "なめる", | |
1446 | "なやむ", | |
1447 | "ならう", | |
1448 | "ならび", | |
1449 | "ならぶ", | |
1450 | "なれる", | |
1451 | "なわとび", | |
1452 | "なわばり", | |
1453 | "にあう", | |
1454 | "にいがた", | |
1455 | "にうけ", | |
1456 | "におい", | |
1457 | "にかい", | |
1458 | "にがて", | |
1459 | "にきび", | |
1460 | "にくしみ", | |
1461 | "にくまん", | |
1462 | "にげる", | |
1463 | "にさんかたんそ", | |
1464 | "にしき", | |
1465 | "にせもの", | |
1466 | "にちじょう", | |
1467 | "にちようび", | |
1468 | "にっか", | |
1469 | "にっき", | |
1470 | "にっけい", | |
1471 | "にっこう", | |
1472 | "にっさん", | |
1473 | "にっしょく", | |
1474 | "にっすう", | |
1475 | "にっせき", | |
1476 | "にってい", | |
1477 | "になう", | |
1478 | "にほん", | |
1479 | "にまめ", | |
1480 | "にもつ", | |
1481 | "にやり", | |
1482 | "にゅういん", | |
1483 | "にりんしゃ", | |
1484 | "にわとり", | |
1485 | "にんい", | |
1486 | "にんか", | |
1487 | "にんき", | |
1488 | "にんげん", | |
1489 | "にんしき", | |
1490 | "にんずう", | |
1491 | "にんそう", | |
1492 | "にんたい", | |
1493 | "にんち", | |
1494 | "にんてい", | |
1495 | "にんにく", | |
1496 | "にんぷ", | |
1497 | "にんまり", | |
1498 | "にんむ", | |
1499 | "にんめい", | |
1500 | "にんよう", | |
1501 | "ぬいくぎ", | |
1502 | "ぬかす", | |
1503 | "ぬぐいとる", | |
1504 | "ぬぐう", | |
1505 | "ぬくもり", | |
1506 | "ぬすむ", | |
1507 | "ぬまえび", | |
1508 | "ぬめり", | |
1509 | "ぬらす", | |
1510 | "ぬんちゃく", | |
1511 | "ねあげ", | |
1512 | "ねいき", | |
1513 | "ねいる", | |
1514 | "ねいろ", | |
1515 | "ねぐせ", | |
1516 | "ねくたい", | |
1517 | "ねくら", | |
1518 | "ねこぜ", | |
1519 | "ねこむ", | |
1520 | "ねさげ", | |
1521 | "ねすごす", | |
1522 | "ねそべる", | |
1523 | "ねだん", | |
1524 | "ねつい", | |
1525 | "ねっしん", | |
1526 | "ねつぞう", | |
1527 | "ねったいぎょ", | |
1528 | "ねぶそく", | |
1529 | "ねふだ", | |
1530 | "ねぼう", | |
1531 | "ねほりはほり", | |
1532 | "ねまき", | |
1533 | "ねまわし", | |
1534 | "ねみみ", | |
1535 | "ねむい", | |
1536 | "ねむたい", | |
1537 | "ねもと", | |
1538 | "ねらう", | |
1539 | "ねわざ", | |
1540 | "ねんいり", | |
1541 | "ねんおし", | |
1542 | "ねんかん", | |
1543 | "ねんきん", | |
1544 | "ねんぐ", | |
1545 | "ねんざ", | |
1546 | "ねんし", | |
1547 | "ねんちゃく", | |
1548 | "ねんど", | |
1549 | "ねんぴ", | |
1550 | "ねんぶつ", | |
1551 | "ねんまつ", | |
1552 | "ねんりょう", | |
1553 | "ねんれい", | |
1554 | "のいず", | |
1555 | "のおづま", | |
1556 | "のがす", | |
1557 | "のきなみ", | |
1558 | "のこぎり", | |
1559 | "のこす", | |
1560 | "のこる", | |
1561 | "のせる", | |
1562 | "のぞく", | |
1563 | "のぞむ", | |
1564 | "のたまう", | |
1565 | "のちほど", | |
1566 | "のっく", | |
1567 | "のばす", | |
1568 | "のはら", | |
1569 | "のべる", | |
1570 | "のぼる", | |
1571 | "のみもの", | |
1572 | "のやま", | |
1573 | "のらいぬ", | |
1574 | "のらねこ", | |
1575 | "のりもの", | |
1576 | "のりゆき", | |
1577 | "のれん", | |
1578 | "のんき", | |
1579 | "ばあい", | |
1580 | "はあく", | |
1581 | "ばあさん", | |
1582 | "ばいか", | |
1583 | "ばいく", | |
1584 | "はいけん", | |
1585 | "はいご", | |
1586 | "はいしん", | |
1587 | "はいすい", | |
1588 | "はいせん", | |
1589 | "はいそう", | |
1590 | "はいち", | |
1591 | "ばいばい", | |
1592 | "はいれつ", | |
1593 | "はえる", | |
1594 | "はおる", | |
1595 | "はかい", | |
1596 | "ばかり", | |
1597 | "はかる", | |
1598 | "はくしゅ", | |
1599 | "はけん", | |
1600 | "はこぶ", | |
1601 | "はさみ", | |
1602 | "はさん", | |
1603 | "はしご", | |
1604 | "ばしょ", | |
1605 | "はしる", | |
1606 | "はせる", | |
1607 | "ぱそこん", | |
1608 | "はそん", | |
1609 | "はたん", | |
1610 | "はちみつ", | |
1611 | "はつおん", | |
1612 | "はっかく", | |
1613 | "はづき", | |
1614 | "はっきり", | |
1615 | "はっくつ", | |
1616 | "はっけん", | |
1617 | "はっこう", | |
1618 | "はっさん", | |
1619 | "はっしん", | |
1620 | "はったつ", | |
1621 | "はっちゅう", | |
1622 | "はってん", | |
1623 | "はっぴょう", | |
1624 | "はっぽう", | |
1625 | "はなす", | |
1626 | "はなび", | |
1627 | "はにかむ", | |
1628 | "はぶらし", | |
1629 | "はみがき", | |
1630 | "はむかう", | |
1631 | "はめつ", | |
1632 | "はやい", | |
1633 | "はやし", | |
1634 | "はらう", | |
1635 | "はろうぃん", | |
1636 | "はわい", | |
1637 | "はんい", | |
1638 | "はんえい", | |
1639 | "はんおん", | |
1640 | "はんかく", | |
1641 | "はんきょう", | |
1642 | "ばんぐみ", | |
1643 | "はんこ", | |
1644 | "はんしゃ", | |
1645 | "はんすう", | |
1646 | "はんだん", | |
1647 | "ぱんち", | |
1648 | "ぱんつ", | |
1649 | "はんてい", | |
1650 | "はんとし", | |
1651 | "はんのう", | |
1652 | "はんぱ", | |
1653 | "はんぶん", | |
1654 | "はんぺん", | |
1655 | "はんぼうき", | |
1656 | "はんめい", | |
1657 | "はんらん", | |
1658 | "はんろん", | |
1659 | "ひいき", | |
1660 | "ひうん", | |
1661 | "ひえる", | |
1662 | "ひかく", | |
1663 | "ひかり", | |
1664 | "ひかる", | |
1665 | "ひかん", | |
1666 | "ひくい", | |
1667 | "ひけつ", | |
1668 | "ひこうき", | |
1669 | "ひこく", | |
1670 | "ひさい", | |
1671 | "ひさしぶり", | |
1672 | "ひさん", | |
1673 | "びじゅつかん", | |
1674 | "ひしょ", | |
1675 | } | |
1676 | ) |
0 | package mnemonics | |
1 | ||
2 | import ( | |
3 | "bytes" | |
4 | "crypto/rand" | |
5 | "testing" | |
6 | "unicode/utf8" | |
7 | ||
8 | "golang.org/x/text/unicode/norm" | |
9 | ) | |
10 | ||
11 | // TestJapaneseDictionary checks that the japanese dictionary is | |
12 | // well formed. | |
13 | func TestJapanesesDictionary(t *testing.T) { | |
14 | // Check for sane constants. | |
15 | if Japanese != "japanese" { | |
16 | t.Error("unexpected identifier for japanese dictionary") | |
17 | } | |
18 | if JapaneseUniquePrefixLen != 3 { | |
19 | t.Error("unexpected prefix len for japanese dictionary") | |
20 | } | |
21 | ||
22 | // Check that the dictionary has well formed elements, and no repeats. | |
23 | japMap := make(map[string]struct{}) | |
24 | for _, word := range japaneseDictionary { | |
25 | // Check that the word is long enough. | |
26 | if utf8.RuneCountInString(word) < JapaneseUniquePrefixLen { | |
27 | t.Fatal("found a short word:", word) | |
28 | } | |
29 | ||
30 | // Check that the word is normalized. | |
31 | newWord := norm.NFC.String(word) | |
32 | if newWord != word { | |
33 | t.Error("found a non-normalized word:", word) | |
34 | } | |
35 | ||
36 | // Fetch the prefix, composed of the first JapaneseUniquePrefixLen | |
37 | // runes. | |
38 | var prefix []byte | |
39 | var runeCount int | |
40 | for _, r := range word { | |
41 | encR := make([]byte, utf8.RuneLen(r)) | |
42 | utf8.EncodeRune(encR, r) | |
43 | prefix = append(prefix, encR...) | |
44 | ||
45 | runeCount++ | |
46 | if runeCount == JapaneseUniquePrefixLen { | |
47 | break | |
48 | } | |
49 | } | |
50 | ||
51 | // Check that the prefix is unique. | |
52 | str := string(prefix) | |
53 | _, exists := japMap[str] | |
54 | if exists { | |
55 | t.Error("found a prefix conflict:", word) | |
56 | } | |
57 | japMap[str] = struct{}{} | |
58 | } | |
59 | ||
60 | // Do some conversions with the japanese dictionary. | |
61 | for i := 1; i <= 32; i++ { | |
62 | for j := 0; j < 5; j++ { | |
63 | entropy := make([]byte, i) | |
64 | _, err := rand.Read(entropy) | |
65 | if err != nil { | |
66 | t.Fatal(err) | |
67 | } | |
68 | phrase, err := ToPhrase(entropy, Japanese) | |
69 | if err != nil { | |
70 | t.Fatal(err) | |
71 | } | |
72 | check, err := FromPhrase(phrase, Japanese) | |
73 | if err != nil { | |
74 | t.Fatal(err) | |
75 | } | |
76 | if bytes.Compare(entropy, check) != 0 { | |
77 | t.Error("conversion check failed for the japanese dictionary") | |
78 | } | |
79 | } | |
80 | } | |
81 | ||
82 | // Check that words in a phrase can be altered according to the prefix | |
83 | // rule. | |
84 | entropy := []byte{1, 2, 3, 4} | |
85 | phrase := Phrase{"えんち", "としょbar", "あふれbaz"} | |
86 | check, err := FromPhrase(phrase, Japanese) | |
87 | if err != nil { | |
88 | t.Fatal(err) | |
89 | } | |
90 | if bytes.Compare(entropy, check) != 0 { | |
91 | t.Error("phrase substitution failed") | |
92 | } | |
93 | } |
0 | // Package mnemonics is a package that converts []byte's into human-friendly | |
1 | // phrases, using common words pulled from a dictionary. The dictionary size is | |
2 | // 1626, and multiple languages are supported. Each dictionary supports | |
3 | // modified phrases. Only the first few characters of each word are important. | |
4 | // These characters form a unique prefix. For example, in the English | |
5 | // dictionary, the unique prefix len (EnglishUniquePrefixLen) is 3, which means | |
6 | // the word 'abbey' could be replaced with the word 'abbot', and the program | |
7 | // would still run as expected. | |
8 | // | |
9 | // The primary purpose of this library is creating human-friendly | |
10 | // cryptographically secure passwords. A cryptographically secure password | |
11 | // needs to contain between 128 and 256 bits of entropy. Humans are typically | |
12 | // incapable of generating sufficiently secure passwords without a random | |
13 | // number generator, and 256-bit random numbers tend to difficult to memorize | |
14 | // and even to write down (a single mistake in the writing, or even a single | |
15 | // somewhat sloppy character can render the backup useless). | |
16 | // | |
17 | // By using a small set of common words instead of random numbers, copying | |
18 | // errors are more easily spotted and memorization is also easier, without | |
19 | // sacrificing password strength. | |
20 | // | |
21 | // The mnemonics package does not have any functions for actually generating | |
22 | // entropy, it just converts existing entropy into human-friendly phrases. | |
23 | package mnemonics | |
24 | ||
25 | import ( | |
26 | "errors" | |
27 | "math/big" | |
28 | "strings" | |
29 | "unicode/utf8" | |
30 | ||
31 | "golang.org/x/text/unicode/norm" | |
32 | ) | |
33 | ||
34 | const ( | |
35 | // DictionarySize specifies the size of the dictionaries that are used by | |
36 | // the mnemonics package. All dictionaries are the same length so that the | |
37 | // same []byte can be encoded into multiple languages and all results will | |
38 | // resemble eachother. | |
39 | DictionarySize = 1626 | |
40 | ) | |
41 | ||
42 | var ( | |
43 | errEmptyInput = errors.New("input has len 0 - not valid for conversion") | |
44 | errUnknownDictionary = errors.New("language not recognized") | |
45 | errUnknownWord = errors.New("word not found in dictionary for given language") | |
46 | ) | |
47 | ||
48 | type ( | |
49 | // DictionaryID is a type-safe identifier that indicates which dictionary | |
50 | // should be used. | |
51 | DictionaryID string | |
52 | ||
53 | // Dictionary is a DictionarySize list of words which can be used to create | |
54 | // human-friendly entropy. | |
55 | Dictionary [DictionarySize]string | |
56 | ||
57 | // Phrase is the human readable version of a random []byte. Most typically, | |
58 | // a phrase is displayed to the user using the String method. | |
59 | Phrase []string | |
60 | ) | |
61 | ||
62 | // The conversion functions can be seen as changing the base of a number. A | |
63 | // []byte can actually be viewed as a slice of base-256 numbers, and a []dict | |
64 | // can be viewed as a slice of base-1626 numbers. The conversions are a little | |
65 | // strange because leading 0's need to be preserved. | |
66 | // | |
67 | // For example, in base 256: | |
68 | // | |
69 | // {0} -> 0 | |
70 | // {255} -> 255 | |
71 | // {0, 0} -> 256 | |
72 | // {1, 0} -> 257 | |
73 | // {0, 1} -> 512 | |
74 | // | |
75 | // Every possible []byte has a unique big.Int which represents it, and every | |
76 | // big.Int represents a unique []byte. | |
77 | ||
78 | // bytesToInt converts a byte slice to a big.Int in a way that preserves | |
79 | // leading 0s, and ensures there is a perfect 1:1 mapping between Int's and | |
80 | // []byte's. | |
81 | func bytesToInt(bs []byte) *big.Int { | |
82 | base := big.NewInt(256) | |
83 | exp := big.NewInt(1) | |
84 | result := big.NewInt(-1) | |
85 | for i := 0; i < len(bs); i++ { | |
86 | tmp := big.NewInt(int64(bs[i])) | |
87 | tmp.Add(tmp, big.NewInt(1)) | |
88 | tmp.Mul(tmp, exp) | |
89 | exp.Mul(exp, base) | |
90 | result.Add(result, tmp) | |
91 | } | |
92 | return result | |
93 | } | |
94 | ||
95 | // intToBytes conversts a big.Int to a []byte, following the conventions | |
96 | // documented at bytesToInt. | |
97 | func intToBytes(bi *big.Int) (bs []byte) { | |
98 | base := big.NewInt(256) | |
99 | for bi.Cmp(base) >= 0 { | |
100 | i := new(big.Int).Mod(bi, base).Int64() | |
101 | bs = append(bs, byte(i)) | |
102 | bi.Sub(bi, base) | |
103 | bi.Div(bi, base) | |
104 | } | |
105 | bs = append(bs, byte(bi.Int64())) | |
106 | return bs | |
107 | } | |
108 | ||
109 | // phraseToInt coverts a phrase into a big.Int, using logic similar to | |
110 | // bytesToInt. | |
111 | func phraseToInt(p Phrase, did DictionaryID) (*big.Int, error) { | |
112 | // Determine which dictionary to use based on the input language. | |
113 | var dict Dictionary | |
114 | var prefixLen int | |
115 | switch { | |
116 | case did == English: | |
117 | dict = englishDictionary | |
118 | prefixLen = EnglishUniquePrefixLen | |
119 | case did == German: | |
120 | dict = germanDictionary | |
121 | prefixLen = GermanUniquePrefixLen | |
122 | case did == Japanese: | |
123 | dict = japaneseDictionary | |
124 | prefixLen = JapaneseUniquePrefixLen | |
125 | default: | |
126 | return nil, errUnknownDictionary | |
127 | } | |
128 | ||
129 | base := big.NewInt(1626) | |
130 | exp := big.NewInt(1) | |
131 | result := big.NewInt(-1) | |
132 | for _, word := range p { | |
133 | // Normalize the input. | |
134 | word = norm.NFC.String(word) | |
135 | ||
136 | // Get the first prefixLen runes from the string. | |
137 | var prefix []byte | |
138 | var runeCount int | |
139 | for _, r := range word { | |
140 | encR := make([]byte, utf8.RuneLen(r)) | |
141 | utf8.EncodeRune(encR, r) | |
142 | prefix = append(prefix, encR...) | |
143 | ||
144 | runeCount++ | |
145 | if runeCount == prefixLen { | |
146 | break | |
147 | } | |
148 | } | |
149 | ||
150 | // Find the index associated with the phrase. | |
151 | var tmp *big.Int | |
152 | found := false | |
153 | for j, word := range dict { | |
154 | if strings.HasPrefix(word, string(prefix)) { | |
155 | tmp = big.NewInt(int64(j)) | |
156 | found = true | |
157 | break | |
158 | } | |
159 | } | |
160 | if !found { | |
161 | return nil, errUnknownWord | |
162 | } | |
163 | ||
164 | // Add the index to the int. | |
165 | tmp.Add(tmp, big.NewInt(1)) | |
166 | tmp.Mul(tmp, exp) | |
167 | exp.Mul(exp, base) | |
168 | result.Add(result, tmp) | |
169 | } | |
170 | return result, nil | |
171 | } | |
172 | ||
173 | // intToPhrase converts a phrase into a big.Int, working in a fashion similar | |
174 | // to bytesToInt. | |
175 | func intToPhrase(bi *big.Int, did DictionaryID) (p Phrase, err error) { | |
176 | // Determine which dictionary to use based on the input language. | |
177 | var dict Dictionary | |
178 | switch { | |
179 | case did == English: | |
180 | dict = englishDictionary | |
181 | case did == German: | |
182 | dict = germanDictionary | |
183 | case did == Japanese: | |
184 | dict = japaneseDictionary | |
185 | default: | |
186 | return nil, errUnknownDictionary | |
187 | } | |
188 | ||
189 | base := big.NewInt(DictionarySize) | |
190 | for bi.Cmp(base) >= 0 { | |
191 | i := new(big.Int).Mod(bi, base).Int64() | |
192 | p = append(p, dict[i]) | |
193 | bi.Sub(bi, base) | |
194 | bi.Div(bi, base) | |
195 | } | |
196 | p = append(p, dict[bi.Int64()]) | |
197 | return p, nil | |
198 | } | |
199 | ||
200 | // ToPhrase converts an input []byte to a human-friendly phrase. The conversion | |
201 | // is reversible. | |
202 | func ToPhrase(entropy []byte, did DictionaryID) (Phrase, error) { | |
203 | if len(entropy) == 0 { | |
204 | return nil, errEmptyInput | |
205 | } | |
206 | intEntropy := bytesToInt(entropy) | |
207 | return intToPhrase(intEntropy, did) | |
208 | } | |
209 | ||
210 | // FromPhrase converts an input phrase back to the original []byte. | |
211 | func FromPhrase(p Phrase, did DictionaryID) ([]byte, error) { | |
212 | if len(p) == 0 { | |
213 | return nil, errEmptyInput | |
214 | } | |
215 | ||
216 | intEntropy, err := phraseToInt(p, did) | |
217 | if err != nil { | |
218 | return nil, err | |
219 | } | |
220 | return intToBytes(intEntropy), nil | |
221 | } | |
222 | ||
223 | // FromString converts an input string into a phrase, and then calls | |
224 | // 'FromPhrase'. | |
225 | func FromString(str string, did DictionaryID) ([]byte, error) { | |
226 | phrase := Phrase(strings.Split(str, " ")) | |
227 | return FromPhrase(phrase, did) | |
228 | } | |
229 | ||
230 | // String combines a phrase into a single string by concatenating the | |
231 | // individual words with space separation. | |
232 | func (p Phrase) String() string { | |
233 | return strings.Join(p, " ") | |
234 | } |
0 | package mnemonics | |
1 | ||
2 | import ( | |
3 | "bytes" | |
4 | "testing" | |
5 | ) | |
6 | ||
7 | // TestConversions checks ToPhrase and FromPhrase for consistency and sanity. | |
8 | func TestConversions(t *testing.T) { | |
9 | // Try for value {0}. | |
10 | initial := []byte{0} | |
11 | phrase, err := ToPhrase(initial, English) | |
12 | if err != nil { | |
13 | t.Error(err) | |
14 | } | |
15 | if len(phrase) != 1 { | |
16 | t.Fatal("unexpected phrase length") | |
17 | } | |
18 | if phrase[0] != englishDictionary[0] { | |
19 | t.Error("unexpected ToPhrase result") | |
20 | } | |
21 | final, err := FromPhrase(phrase, English) | |
22 | if err != nil { | |
23 | t.Error(err) | |
24 | } | |
25 | if bytes.Compare(initial, final) != 0 { | |
26 | t.Error("failure for value {0}") | |
27 | } | |
28 | ||
29 | // Try for value {1}. | |
30 | initial = []byte{1} | |
31 | phrase, err = ToPhrase(initial, English) | |
32 | if err != nil { | |
33 | t.Error(err) | |
34 | } | |
35 | if len(phrase) != 1 { | |
36 | t.Fatal("unexpected phrase length") | |
37 | } | |
38 | if phrase[0] != englishDictionary[1] { | |
39 | t.Error("unexpected ToPhrase result") | |
40 | } | |
41 | final, err = FromPhrase(phrase, English) | |
42 | if err != nil { | |
43 | t.Error(err) | |
44 | } | |
45 | if bytes.Compare(initial, final) != 0 { | |
46 | t.Error("failure for value {1}") | |
47 | } | |
48 | ||
49 | // Try for value {255}. | |
50 | initial = []byte{255} | |
51 | phrase, err = ToPhrase(initial, English) | |
52 | if err != nil { | |
53 | t.Error(err) | |
54 | } | |
55 | if len(phrase) != 1 { | |
56 | t.Fatal("unexpected phrase length") | |
57 | } | |
58 | if phrase[0] != englishDictionary[255] { | |
59 | t.Error("unexpected ToPhrase result") | |
60 | } | |
61 | final, err = FromPhrase(phrase, English) | |
62 | if err != nil { | |
63 | t.Error(err) | |
64 | } | |
65 | if bytes.Compare(initial, final) != 0 { | |
66 | t.Error("failure for value {255}") | |
67 | } | |
68 | ||
69 | // Try for value {0, 0}. | |
70 | initial = []byte{0, 0} | |
71 | phrase, err = ToPhrase(initial, English) | |
72 | if err != nil { | |
73 | t.Error(err) | |
74 | } | |
75 | if len(phrase) != 1 { | |
76 | t.Fatal("unexpected phrase length") | |
77 | } | |
78 | if phrase[0] != englishDictionary[256] { | |
79 | t.Error("unexpected ToPhrase result") | |
80 | } | |
81 | final, err = FromPhrase(phrase, English) | |
82 | if err != nil { | |
83 | t.Error(err) | |
84 | } | |
85 | if bytes.Compare(initial, final) != 0 { | |
86 | t.Error("failure for value {0, 0}") | |
87 | } | |
88 | ||
89 | // Try for value {1, 0}. | |
90 | initial = []byte{1, 0} | |
91 | phrase, err = ToPhrase(initial, English) | |
92 | if err != nil { | |
93 | t.Error(err) | |
94 | } | |
95 | if len(phrase) != 1 { | |
96 | t.Fatal("unexpected phrase length") | |
97 | } | |
98 | if phrase[0] != englishDictionary[257] { | |
99 | t.Error("unexpected ToPhrase result") | |
100 | } | |
101 | final, err = FromPhrase(phrase, English) | |
102 | if err != nil { | |
103 | t.Error(err) | |
104 | } | |
105 | if bytes.Compare(initial, final) != 0 { | |
106 | t.Error("failure for value {1, 0}") | |
107 | } | |
108 | ||
109 | // Try for value {0, 1}. | |
110 | initial = []byte{0, 1} | |
111 | phrase, err = ToPhrase(initial, English) | |
112 | if err != nil { | |
113 | t.Error(err) | |
114 | } | |
115 | if len(phrase) != 1 { | |
116 | t.Fatal("unexpected phrase length") | |
117 | } | |
118 | if phrase[0] != englishDictionary[512] { | |
119 | t.Error("unexpected ToPhrase result") | |
120 | } | |
121 | final, err = FromPhrase(phrase, English) | |
122 | if err != nil { | |
123 | t.Error(err) | |
124 | } | |
125 | if bytes.Compare(initial, final) != 0 { | |
126 | t.Error("failure for value {0, 1}") | |
127 | } | |
128 | ||
129 | // Try for value {1, 1}. | |
130 | initial = []byte{1, 1} | |
131 | phrase, err = ToPhrase(initial, English) | |
132 | if err != nil { | |
133 | t.Error(err) | |
134 | } | |
135 | if len(phrase) != 1 { | |
136 | t.Fatal("unexpected phrase length") | |
137 | } | |
138 | if phrase[0] != englishDictionary[513] { | |
139 | t.Error("unexpected ToPhrase result") | |
140 | } | |
141 | final, err = FromPhrase(phrase, English) | |
142 | if err != nil { | |
143 | t.Error(err) | |
144 | } | |
145 | if bytes.Compare(initial, final) != 0 { | |
146 | t.Error("failure for value {1, 1}") | |
147 | } | |
148 | ||
149 | // Try for value {2, 1}. | |
150 | initial = []byte{2, 1} | |
151 | phrase, err = ToPhrase(initial, English) | |
152 | if err != nil { | |
153 | t.Error(err) | |
154 | } | |
155 | if len(phrase) != 1 { | |
156 | t.Fatal("unexpected phrase length") | |
157 | } | |
158 | if phrase[0] != englishDictionary[514] { | |
159 | t.Error("unexpected ToPhrase result") | |
160 | } | |
161 | final, err = FromPhrase(phrase, English) | |
162 | if err != nil { | |
163 | t.Error(err) | |
164 | } | |
165 | if bytes.Compare(initial, final) != 0 { | |
166 | t.Error("failure for value {2, 1}") | |
167 | } | |
168 | ||
169 | // Try for value {2, 2}. | |
170 | initial = []byte{2, 2} | |
171 | phrase, err = ToPhrase(initial, English) | |
172 | if err != nil { | |
173 | t.Error(err) | |
174 | } | |
175 | if len(phrase) != 1 { | |
176 | t.Fatal("unexpected phrase length") | |
177 | } | |
178 | if phrase[0] != englishDictionary[770] { | |
179 | t.Error("unexpected ToPhrase result") | |
180 | } | |
181 | final, err = FromPhrase(phrase, English) | |
182 | if err != nil { | |
183 | t.Error(err) | |
184 | } | |
185 | if bytes.Compare(initial, final) != 0 { | |
186 | t.Error("failure for value {2, 2}") | |
187 | } | |
188 | ||
189 | // Try for value {abbey, abbey}. | |
190 | initial = []byte{90, 5} | |
191 | phrase, err = ToPhrase(initial, English) | |
192 | if err != nil { | |
193 | t.Error(err) | |
194 | } | |
195 | if len(phrase) != 2 { | |
196 | t.Fatal("unexpected phrase length") | |
197 | } | |
198 | if phrase[0] != englishDictionary[0] { | |
199 | t.Error("unexpected ToPhrase result") | |
200 | } | |
201 | if phrase[1] != englishDictionary[0] { | |
202 | t.Error("unexpected ToPhrase result") | |
203 | } | |
204 | final, err = FromPhrase(phrase, English) | |
205 | if err != nil { | |
206 | t.Error(err) | |
207 | } | |
208 | if bytes.Compare(initial, final) != 0 { | |
209 | t.Error("failure for value {abbey, abbey}") | |
210 | } | |
211 | ||
212 | // Check that all values going from []byte to phrase and back result in the | |
213 | // original value, as deep as reasonable. | |
214 | for i := 0; i < 256; i++ { | |
215 | initial := []byte{byte(i)} | |
216 | phrase, err := ToPhrase(initial, English) | |
217 | if err != nil { | |
218 | t.Fatal(err) | |
219 | } | |
220 | final, err := FromPhrase(phrase, English) | |
221 | if err != nil { | |
222 | t.Fatal(err) | |
223 | } | |
224 | if bytes.Compare(initial, final) != 0 { | |
225 | t.Error("comparison failed during circular byte check") | |
226 | } | |
227 | } | |
228 | for i := 0; i < 256; i++ { | |
229 | for j := 0; j < 256; j++ { | |
230 | initial := []byte{byte(i), byte(j)} | |
231 | phrase, err := ToPhrase(initial, English) | |
232 | if err != nil { | |
233 | t.Fatal(err) | |
234 | } | |
235 | final, err := FromPhrase(phrase, English) | |
236 | if err != nil { | |
237 | t.Fatal(err) | |
238 | } | |
239 | if bytes.Compare(initial, final) != 0 { | |
240 | t.Error("comparison failed during circular byte check") | |
241 | } | |
242 | } | |
243 | } | |
244 | // It takes too long to try all numbers 3 deep, so only a handful are | |
245 | // picked. All edge numbers are checked. | |
246 | for i := 0; i < 256; i++ { | |
247 | for _, j := range []byte{0, 1, 2, 3, 16, 25, 82, 200, 252, 253, 254, 255} { | |
248 | for _, k := range []byte{0, 1, 2, 3, 9, 29, 62, 104, 105, 217, 252, 253, 254, 255} { | |
249 | initial := []byte{byte(i), j, k} | |
250 | phrase, err := ToPhrase(initial, English) | |
251 | if err != nil { | |
252 | t.Fatal(err) | |
253 | } | |
254 | final, err := FromPhrase(phrase, English) | |
255 | if err != nil { | |
256 | t.Fatal(err) | |
257 | } | |
258 | if bytes.Compare(initial, final) != 0 { | |
259 | t.Error("comparison failed during circular byte check") | |
260 | } | |
261 | } | |
262 | } | |
263 | } | |
264 | ||
265 | // Check that all values going from phrase to []byte and back result in the | |
266 | // original value, as deep as reasonable. | |
267 | for i := 0; i < DictionarySize; i++ { | |
268 | initial := Phrase{englishDictionary[i]} | |
269 | entropy, err := FromPhrase(initial, English) | |
270 | if err != nil { | |
271 | t.Fatal(err) | |
272 | } | |
273 | final, err := ToPhrase(entropy, English) | |
274 | if err != nil { | |
275 | t.Fatal(err) | |
276 | } | |
277 | if len(initial) != len(final) { | |
278 | t.Fatal("conversion error") | |
279 | } | |
280 | for i := range initial { | |
281 | if initial[i] != final[i] { | |
282 | t.Error("conversion error") | |
283 | } | |
284 | } | |
285 | } | |
286 | // It takes too long to try all numbers 2 deep for phrases, so the test it | |
287 | // not comprehensive. All edge numbers are checked. | |
288 | for i := 0; i < DictionarySize; i++ { | |
289 | for _, j := range []int{0, 1, 2, 3, 4, 5, 6, 25, 50, 75, 122, 266, 305, 1620, 1621, 1622, 1623, 1623, 1625} { | |
290 | initial := Phrase{englishDictionary[i], englishDictionary[j]} | |
291 | entropy, err := FromPhrase(initial, English) | |
292 | if err != nil { | |
293 | t.Fatal(err) | |
294 | } | |
295 | final, err := ToPhrase(entropy, English) | |
296 | if err != nil { | |
297 | t.Fatal(err) | |
298 | } | |
299 | if len(initial) != len(final) { | |
300 | t.Fatal("conversion error") | |
301 | } | |
302 | for i := range initial { | |
303 | if initial[i] != final[i] { | |
304 | t.Error("conversion error") | |
305 | } | |
306 | } | |
307 | } | |
308 | } | |
309 | // It takes too long to try all numbers 2 deep for phrases, so the test it | |
310 | // not comprehensive. All edge numbers are checked. | |
311 | for _, i := range []int{0, 1, 2, 3, 4, 5, 6, 25, 50, 75, 122, 266, 305, 1620, 1621, 1622, 1623, 1623, 1625} { | |
312 | for _, j := range []int{0, 1, 2, 3, 4, 5, 6, 25, 50, 75, 122, 266, 305, 1620, 1621, 1622, 1623, 1623, 1625} { | |
313 | for _, k := range []int{0, 1, 2, 3, 4, 5, 6, 25, 50, 75, 122, 266, 305, 1620, 1621, 1622, 1623, 1623, 1625} { | |
314 | initial := Phrase{englishDictionary[i], englishDictionary[j], englishDictionary[k]} | |
315 | entropy, err := FromPhrase(initial, English) | |
316 | if err != nil { | |
317 | t.Fatal(err) | |
318 | } | |
319 | final, err := ToPhrase(entropy, English) | |
320 | if err != nil { | |
321 | t.Fatal(err) | |
322 | } | |
323 | if len(initial) != len(final) { | |
324 | t.Fatal("conversion error") | |
325 | } | |
326 | for i := range initial { | |
327 | if initial[i] != final[i] { | |
328 | t.Error("conversion error") | |
329 | } | |
330 | } | |
331 | } | |
332 | } | |
333 | } | |
334 | } | |
335 | ||
336 | // TestNilInputs tries nil and 0 inputs when using the exported functions. | |
337 | func TestNilInputs(t *testing.T) { | |
338 | _, err := ToPhrase(nil, English) | |
339 | if err != errEmptyInput { | |
340 | t.Error(err) | |
341 | } | |
342 | _, err = FromPhrase(nil, English) | |
343 | if err != errEmptyInput { | |
344 | t.Error(err) | |
345 | } | |
346 | _, err = ToPhrase([]byte{0}, "") | |
347 | if err != errUnknownDictionary { | |
348 | t.Error(err) | |
349 | } | |
350 | _, err = FromPhrase(Phrase{"abbey"}, "") | |
351 | if err != errUnknownDictionary { | |
352 | t.Error(err) | |
353 | } | |
354 | ||
355 | ps := Phrase{}.String() | |
356 | if ps != "" { | |
357 | t.Error(ps) | |
358 | } | |
359 | ps = Phrase{""}.String() | |
360 | if ps != "" { | |
361 | t.Error(ps) | |
362 | } | |
363 | ps = Phrase{"a", ""}.String() | |
364 | if ps != "a " { | |
365 | t.Error(ps) | |
366 | } | |
367 | } | |
368 | ||
369 | // TestUnrecognizedWord tries to decode a phrase that has an unrecognized word. | |
370 | func TestUnrecognizedWord(t *testing.T) { | |
371 | phrase := Phrase{"zzzzzz"} | |
372 | _, err := FromPhrase(phrase, English) | |
373 | if err != errUnknownWord { | |
374 | t.Error(err) | |
375 | } | |
376 | } | |
377 | ||
378 | // TestPhraseString calls String() on a Phrase. | |
379 | func TestPhraseString(t *testing.T) { | |
380 | phrase := Phrase{"abc", "def", "g"} | |
381 | if phrase.String() != "abc def g" { | |
382 | t.Error("Phrase.String() behaving unexpectedly") | |
383 | } | |
384 | } | |
385 | ||
386 | // TestNormalization tries to decode a non-normalized string. | |
387 | func TestNormalization(t *testing.T) { | |
388 | a := Phrase{"abhärten"} | |
389 | b := Phrase{"abh\u00e4rten"} | |
390 | c := Phrase{"abha\u0308rten"} | |
391 | d := Phrase{"abh\u0061\u0308rten"} | |
392 | ||
393 | ba, err := FromPhrase(a, German) | |
394 | if err != nil { | |
395 | t.Error(err) | |
396 | } | |
397 | bb, err := FromPhrase(b, German) | |
398 | if err != nil { | |
399 | t.Error(err) | |
400 | } | |
401 | bc, err := FromPhrase(c, German) | |
402 | if err != nil { | |
403 | t.Error(err) | |
404 | } | |
405 | bd, err := FromPhrase(d, German) | |
406 | if err != nil { | |
407 | t.Error(err) | |
408 | } | |
409 | if bytes.Compare(ba, bb) != 0 { | |
410 | t.Error("bad decoding") | |
411 | } | |
412 | if bytes.Compare(bb, bc) != 0 { | |
413 | t.Error("bad decoding") | |
414 | } | |
415 | if bytes.Compare(bc, bd) != 0 { | |
416 | t.Error("bad decoding") | |
417 | } | |
418 | } |