Codebase list golang-github-nebulouslabs-entropy-mnemonics / 3f256b3
New upstream version 0.0~git20150811.0.6afa27f Free Ekanayaka 7 years ago
11 changed file(s) with 6039 addition(s) and 0 deletion(s). Raw diff Collapse all Expand all
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 }