diff --git a/CHANGELOG.md b/CHANGELOG.md index bd96931..37e9a35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,16 @@ tagged `spec-v0.15`: the long-term recovery of capsules. It changes no format of `.dkc` or `.dkk`, and one verdict: a valid release in the caller's hand opens a capsule even when the clock is before the round time. +- **Random words.** `wordkey.Generate` draws a key of words uniformly from + a built-in list, and `encrypt -new-words FILE [-dic LIST] [-word-count N]` + writes them to a new file: 7 words by default, of the Spanish list + `wordkey/lists/es.txt`, 7776 words, a draft not yet reviewed (spec §38.1, + the SHOULD to offer random words). `wordkey.List` and `CheckList` refuse a + list of fewer than 2048 words or with two words that are one once + normalized. The list is CC BY-SA 4.0, an adaptation of FrequencyWords; + `wordkey/lists/README.md` records its source, method and SHA-256. It + changes no format and no derivation. + - **Approval.** `SpecVersion` is 0.15, and so is the `spec` field of every file of `testdata`: the records and the vectors, regenerated, and the frozen `security_cms.json` and `locator.json`, whose `spec` field alone diff --git a/README.es.md b/README.es.md index 3c7dc23..8069695 100644 --- a/README.es.md +++ b/README.es.md @@ -180,7 +180,11 @@ creador que nadie ha comprobado; una nota que incumple las reglas de texto no se muestra, y los dos lo dicen (`public_note_unusable` en `inspect -json`). `-words` y `-words-file` dan a una cápsula `time_and_key` una llave de palabras: al menos seis palabras distintas de tres letras o más, que la abren -con `decrypt -words-file` en lugar de una `.dkk` (spec §38.1). +con `decrypt -words-file` en lugar de una `.dkk` (spec §38.1). `-new-words +FICHERO` las sortea en su lugar, 7 por defecto, de una lista incluida +(`-dic es`, la única por ahora; `-word-count N`), y las escribe en un fichero +nuevo: las palabras que elige una persona son más débiles. Las listas y su +licencia están en [`wordkey/lists`](wordkey/lists/README.md). ## Librería diff --git a/README.md b/README.md index c437427..bdc9057 100644 --- a/README.md +++ b/README.md @@ -179,7 +179,11 @@ that nobody has checked; a note that breaks the rules of text is not shown, and both say so (`public_note_unusable` in `inspect -json`). `-words` and `-words-file` give a `time_and_key` capsule a key of words: at least six different words of three or more letters, which open it with -`decrypt -words-file` instead of a `.dkk` (spec §38.1). +`decrypt -words-file` instead of a `.dkk` (spec §38.1). `-new-words FILE` +draws them at random instead, 7 by default, from a built-in list +(`-dic es`, the only one for now; `-word-count N`), and writes them to a new +file: words a person chooses are weaker. The lists and their license are in +[`wordkey/lists`](wordkey/lists/README.md). ## Library diff --git a/cmd/datekeys/main.go b/cmd/datekeys/main.go index 18dc86b..e470fcb 100644 --- a/cmd/datekeys/main.go +++ b/cmd/datekeys/main.go @@ -51,7 +51,7 @@ import ( ) const usage = `usage: - datekeys encrypt -at TIME -in FILE|FOLDER... -out FILE.dkc [-comment TEXT] [-author TEXT] [-no-mtime] [-policy time_only|time_and_key] [-recipient age1...]... [-dkk FILE.dkk] [-words TEXT|-words-file FILE] [-padding reforzado|bloque256] [-note TEXT] [-sign KEY [-sign-pass-file FILE]] [-large-area] + datekeys encrypt -at TIME -in FILE|FOLDER... -out FILE.dkc [-comment TEXT] [-author TEXT] [-no-mtime] [-policy time_only|time_and_key] [-recipient age1...]... [-dkk FILE.dkk] [-words TEXT|-words-file FILE|-new-words FILE [-dic LIST] [-word-count N]] [-padding reforzado|bloque256] [-note TEXT] [-sign KEY [-sign-pass-file FILE]] [-large-area] datekeys decrypt -in FILE.dkc -out PATH [-dkk FILE.dkk] [-identity FILE]... [-words TEXT|-words-file FILE] [-expect-author dkauthor1...] [-relay URL]... [-release FILE] datekeys author keygen -out FILE (-pass-file FILE|-plain) datekeys author public -key FILE [-pass-file FILE] @@ -81,6 +81,11 @@ instead of a .dkk (wordkey). Case, accents and extra spaces do not matter. -words leaves them in the shell history; -words-file reads them from a file. +-new-words FILE draws the words at random instead, and writes them to the new +file FILE: -word-count words, 7 by default, of the list -dic, es by default, +of 7776 words. Words a person chooses are weaker than random ones: whoever +holds the .dkc can try them offline once the date has come (spec §38.1). + -note puts a public note in the capsule, in clear: anyone who has the .dkc reads it before the date, nobody can check who wrote it, and with the date it can identify someone. decrypt shows it as text of the creator. @@ -203,6 +208,9 @@ func encrypt(args []string, stderr io.Writer, now func() time.Time) error { fs.Var(&recipients, "recipient", "time_and_key: X25519 recipient age1... (repeatable)") words := fs.String("words", "", "time_and_key: at least 6 words that open the capsule; they stay in the shell history") wordsFile := fs.String("words-file", "", "time_and_key: file with the words that open the capsule") + newWords := fs.String("new-words", "", "time_and_key: new file with words drawn at random from a list, that open the capsule") + dic := fs.String("dic", "es", "list of -new-words: "+strings.Join(wordkey.Languages(), ", ")) + wordCount := fs.Int("word-count", wordkey.DefaultCount, "number of words of -new-words, 6 or more") note := fs.String("note", "", "public note of the capsule: one line that anyone with the .dkc reads before the date, and that can identify someone with it") sign := fs.String("sign", "", "file with the author key that signs the capsule") signPass := fs.String("sign-pass-file", "", "file with the passphrase of the author key, or - for the standard input") @@ -245,9 +253,26 @@ func encrypt(args []string, stderr io.Writer, now func() time.Time) error { if err != nil { return err } + if *newWords != "" { + if text != "" { + return errors.New("encrypt: -new-words excludes -words and -words-file") + } + if err := checkNew(*newWords); err != nil { + return err + } + list, err := wordkey.List(*dic) + if err != nil { + return fmt.Errorf("encrypt: %w", err) + } + drawn, err := wordkey.Generate(list, *wordCount, nil) + if err != nil { + return fmt.Errorf("encrypt: %w", err) + } + text = strings.Join(drawn, " ") + } if text != "" { if pol != capsule.TimeAndKey { - return errors.New("encrypt: -words and -words-file need -policy time_and_key") + return errors.New("encrypt: -words, -words-file and -new-words need -policy time_and_key") } w := wordkey.Normalize(text) if err := wordkey.Check(w); err != nil { @@ -294,6 +319,11 @@ func encrypt(args []string, stderr io.Writer, now func() time.Time) error { return fmt.Errorf("the capsule was written to %s but its .dkk could not be: %w", *out, err) } } + if *newWords != "" { + if err := writeAtomic(*newWords, func(w io.Writer) error { _, err := io.WriteString(w, text+"\n"); return err }); err != nil { + return fmt.Errorf("the capsule was written to %s but its words could not be: %w", *out, err) + } + } fmt.Fprintf(stderr, "Encrypted locally for %s (round %d)\n datekey %s\n capsule_id %x\n format %d: %d files, a payload of %d bytes, padded to %d (%s)\n", res.UnlockAt.Format(time.RFC3339), res.DateKey.Round, res.DateKey.Compact(), res.CapsuleID, res.Format, len(res.Head.Files), res.Length, res.PaddedLength, res.Padding) for _, p := range skipped { @@ -302,6 +332,9 @@ func encrypt(args []string, stderr io.Writer, now func() time.Time) error { if res.PortableKey != nil { fmt.Fprintf(stderr, " access key %s: keep it secret; it is valid for this capsule only\n", *dkk) } + if *newWords != "" { + fmt.Fprintf(stderr, " words %s: %d words of the list %s; keep them secret, or write them down and delete the file\n", *newWords, *wordCount, *dic) + } if res.UnlockAt.Sub(now()) > longHorizon { fmt.Fprintln(stderr, "warning: Quicknet V1 timelock is not post-quantum. The ciphertext may stay available for years,\n"+ " and its future confidentiality depends on the provider and on the underlying cryptography (spec §53).") diff --git a/cmd/datekeys/main_test.go b/cmd/datekeys/main_test.go index 3482423..51ebddf 100644 --- a/cmd/datekeys/main_test.go +++ b/cmd/datekeys/main_test.go @@ -25,6 +25,7 @@ import ( "g.activething.com/go/DateKeys/internal/inspectview" "g.activething.com/go/DateKeys/internal/testkit" "g.activething.com/go/DateKeys/profile" + "g.activething.com/go/DateKeys/wordkey" ) const fixtures = "../../testdata/fixtures" @@ -636,12 +637,63 @@ func TestKeyOfWords(t *testing.T) { {[]string{"-policy", "time_and_key", "-words", "perro luna casa verde tren mar" + string(rune(0x200B))}, "invisible character U+200B"}, {[]string{"-words", "uno dos tres cuatro cinco seis"}, "need -policy time_and_key"}, {[]string{"-policy", "time_and_key", "-words", "a", "-words-file", words}, "are exclusive"}, + {[]string{"-policy", "time_and_key", "-words", "a", "-new-words", filepath.Join(dir, "n.txt")}, "-new-words excludes -words and -words-file"}, + {[]string{"-policy", "time_and_key", "-new-words", words}, "already exists"}, + {[]string{"-policy", "time_and_key", "-new-words", filepath.Join(dir, "n.txt"), "-dic", "xx"}, `no word list for "xx"`}, + {[]string{"-policy", "time_and_key", "-new-words", filepath.Join(dir, "n.txt"), "-word-count", "5"}, "at least 6 words, not 5"}, + {[]string{"-new-words", filepath.Join(dir, "n.txt")}, "-words, -words-file and -new-words need -policy time_and_key"}, } { args := append([]string{"encrypt", "-at", at, "-in", in, "-out", filepath.Join(dir, "x.dkc")}, tc.args...) if _, _, err := cli(t, genesis, args...); err == nil || !strings.Contains(err.Error(), tc.want) { t.Errorf("%v: %v, want %q", tc.args, err, tc.want) } } + if _, err := os.Stat(filepath.Join(dir, "n.txt")); err == nil { + t.Error("a refused encrypt left its words file") + } +} + +func TestNewWords(t *testing.T) { + dir := t.TempDir() + in := filepath.Join(dir, "carta.txt") + os.WriteFile(in, []byte("abierta con palabras al azar"), 0o600) + p := profile.Quicknet() + unlock := time.Unix(p.GenesisTime+999*3, 0).UTC() // round 1000 + dkc := filepath.Join(dir, "carta.dkc") + words := filepath.Join(dir, "palabras.txt") + _, stderr, err := cli(t, time.Unix(p.GenesisTime, 0), "encrypt", "-at", unlock.Format(time.RFC3339), "-policy", "time_and_key", + "-new-words", words, "-word-count", "8", "-in", in, "-out", dkc) + if err != nil { + t.Fatalf("encrypt: %v\n%s", err, stderr) + } + if !strings.Contains(stderr, "words "+words+": 8 words of the list es") { + t.Errorf("stderr: %s", stderr) + } + b, err := os.ReadFile(words) + if err != nil { + t.Fatal(err) + } + list, _ := wordkey.List("es") + inList := map[string]bool{} + for _, w := range list { + inList[w] = true + } + drawn := strings.Fields(string(b)) + if len(drawn) != 8 || !strings.HasSuffix(string(b), "\n") { + t.Fatalf("words file %q", b) + } + for _, w := range drawn { + if !inList[w] { + t.Errorf("%q is not in the list es", w) + } + } + out := filepath.Join(dir, "abierta") + if _, stderr, err := cli(t, later, "decrypt", "-in", dkc, "-out", out, "-words-file", words, "-relay", relay(t)); err != nil { + t.Fatalf("decrypt: %v\n%s", err, stderr) + } + if b, err := os.ReadFile(filepath.Join(out, "carta.txt")); err != nil || string(b) != "abierta con palabras al azar" { + t.Fatalf("carta.txt = %q, %v", b, err) + } } // Spec v0.11 §24.1: decrypt does not show a public note that breaks the rules diff --git a/docs/traceability.md b/docs/traceability.md index e1f13fc..a4b7e9a 100644 --- a/docs/traceability.md +++ b/docs/traceability.md @@ -68,7 +68,7 @@ v0.14, and §47.1 and §79, new in v0.15. A case of §64 that is not in the repo | 36.1 | Authenticity semantics | documented in `README.md`, `SECURITY.md` | — (a property the protocol does not provide) | | 37 | X25519 recipient V1; the writer rejects a recipient that is not canonical (bit 255 set, or u ≥ p) or of low order, and MAY reject a point of the twist | `age.X25519Recipient`; `agewrap.X25519IdentityFromRaw`, `agewrap.CheckX25519Recipient` (run by `capsule.Encrypt`); the twist check is not implemented | `agewrap.TestRawKeys`, `TestNonCanonicalRecipients`; `capsule.TestEncryptRejectsInvalidOptions` | | 38 | Portable Access Key | `EncryptOptions.NewPortableKey` (fresh `I_ACCESS` per capsule; no API accepts an existing one); `accesskey.AccessKey` | `capsule.TestPortableKeysAreNeverReused` | -| 38.1 | Key of words: one more X25519 credential of `time_and_key`, among the 16; the normalization: NFD with the tables of Unicode 18.0.0, without U+0300 to U+036F, the simple lower case of each code point, split by the spaces of the list; PBKDF2-HMAC-SHA256 of 600 000 rounds, salted with the chain hash, the round and `capsule_id`, into a raw X25519 identity; the writer requires at least 6 words, counting only different words of 3 or more letters, and refuses controls, ignorables and unassigned code points; a reader may ask for the words instead of a `.dkk` | `wordkey` (`Normalize`, `Check`, `Key`, `Identity`, `Rounds`, `MinWords`, `MinLetters`), with `pathrule.NFD`, `Lower`, `DefaultIgnorable` and `Assigned`; `capsule.EncryptOptions.Words` (`accessRecipients`; `sealer.write` derives the identity once `capsule_id` is drawn); `cmd/datekeys`: `-words` and `-words-file` of `encrypt` and `decrypt` (`wordsText`), the words of `decrypt` salted with what `capsule.Inspect` gives | `wordkey.TestNormalize`, `TestCheck`, `TestKeyVector` (the vector of §38.1); `testdata/vectors/wordkey.json` (`internal/testkit.WordKeyVectors`, `TestVectorFilesAreCurrent`): the words of a text, what a writer refuses and the identities, the cases of §64 of v0.11; `capsule.TestEncryptFilesWords` (the words of another `capsule_id` do not open); `cmd/datekeys.TestKeyOfWords` | +| 38.1 | Key of words: one more X25519 credential of `time_and_key`, among the 16; the normalization: NFD with the tables of Unicode 18.0.0, without U+0300 to U+036F, the simple lower case of each code point, split by the spaces of the list; PBKDF2-HMAC-SHA256 of 600 000 rounds, salted with the chain hash, the round and `capsule_id`, into a raw X25519 identity; the writer requires at least 6 words, counting only different words of 3 or more letters, and refuses controls, ignorables and unassigned code points; a reader may ask for the words instead of a `.dkk`; SHOULD: random words of a public list by default, at least 6 of 2048 or more | `wordkey` (`Normalize`, `Check`, `Key`, `Identity`, `Rounds`, `MinWords`, `MinLetters`; `Generate`, `List`, `CheckList`, `DefaultCount`, `MinListSize`, the list `lists/es.txt`), with `pathrule.NFD`, `Lower`, `DefaultIgnorable` and `Assigned`; `capsule.EncryptOptions.Words` (`accessRecipients`; `sealer.write` derives the identity once `capsule_id` is drawn); `cmd/datekeys`: `-words` and `-words-file` of `encrypt` and `decrypt` (`wordsText`), `-new-words`, `-dic` and `-word-count` of `encrypt`, the words of `decrypt` salted with what `capsule.Inspect` gives | `wordkey.TestNormalize`, `TestCheck`, `TestKeyVector` (the vector of §38.1), `TestBuiltInLists`, `TestCheckList`, `TestGenerate`, `TestGenerateUniform`; `testdata/vectors/wordkey.json` (`internal/testkit.WordKeyVectors`, `TestVectorFilesAreCurrent`): the words of a text, what a writer refuses and the identities, the cases of §64 of v0.11; `capsule.TestEncryptFilesWords` (the words of another `capsule_id` do not open); `cmd/datekeys.TestKeyOfWords`, `TestNewWords` | | 39 | Recipients of INNER_ACCESS_AGE: in formats 2 and 3 from 1 to 16 credentials, a dummy in each slot left (a fresh public key whose private key is dropped at once), the 16 in a uniformly random order; which slots are dummies is recorded only in the official vectors | `capsule/encrypt.go` (`accessRecipients`, `fillSlots`, `permute`); `agewrap.AccessIdentity` | `capsule.TestInnerHasSixteenStanzas`, `TestDummyRecipients`, `TestStanzaOrderIsUniform`, `TestCredentialBounds`, `TestFixtureRecipients`, `TestEncryptRoundTripBothPolicies`; `TestConformanceFixtures` (the stanza each credential opens, `access_key_stanza` and `identity_stanzas` in the records) | | 40 | `.dkk` framing; `BODY_LEN` in 1..16 MiB (0 is `ERR_INTEGRITY`); order of the frame checks | `accesskey.Encode`, `accesskey.Decode` (the body buffer grows with the data read; every buffer holding the body is wiped) | `accesskey.TestDecodeRejects`, `TestDecodePrecedence`, `TestDecodeShortBodyAllocatesLittle`, `TestEncodeAndDecodeLeaveNoStaleMaterial`, `FuzzDecode` | | 41 | `.dkk` BODY_CBOR | `AccessKey.MarshalBody`, `accesskey.DecodeBody` (hand-written `bodyWire` encode and decode) | `accesskey.TestFixtures`, `TestDecodeBodyStructure` | diff --git a/wordkey/generate.go b/wordkey/generate.go new file mode 100644 index 0000000..a11c4bb --- /dev/null +++ b/wordkey/generate.go @@ -0,0 +1,110 @@ +package wordkey + +import ( + "crypto/rand" + _ "embed" + "fmt" + "io" + "math/big" + "sort" + "strings" + "unicode/utf8" +) + +// DefaultCount is the number of words Generate draws when the caller does +// not ask for more: 7 words of a list of 7776 are about 90 bits. +const DefaultCount = 7 + +// MinListSize is the fewest words of a list that Generate accepts (spec +// §38.1: at least 6 words of a list of 2048 or more). +const MinListSize = 2048 + +//go:embed lists/es.txt +var listES string + +// lists are the word lists built into the module, by language. Each is a +// plain UTF-8 file, one word per line; lists/README.md says where each comes +// from and its license. +var lists = map[string]string{ + "es": listES, +} + +// Languages returns the languages of the built-in word lists, sorted. +func Languages() []string { + var l []string + for k := range lists { + l = append(l, k) + } + sort.Strings(l) + return l +} + +// List returns the built-in word list of lang, after checking it with +// CheckList. +func List(lang string) ([]string, error) { + text, ok := lists[lang] + if !ok { + return nil, fmt.Errorf("wordkey: no word list for %q; the lists are %s", lang, strings.Join(Languages(), ", ")) + } + words := strings.Split(strings.TrimSuffix(text, "\n"), "\n") + if err := CheckList(words); err != nil { + return nil, fmt.Errorf("wordkey: the list %q: %w", lang, err) + } + return words, nil +} + +// CheckList reports why words cannot be a list for Generate: fewer than +// MinListSize words, or a word that is not one word of MinLetters +// characters or more once normalized, that holds a character Check refuses, +// or that is the same as another once normalized. Two words such as «papa» +// and «papá» would be one word with less entropy than the list promises. +func CheckList(words []string) error { + if len(words) < MinListSize { + return fmt.Errorf("%d words, fewer than %d", len(words), MinListSize) + } + seen := make(map[string]string, len(words)) + for i, w := range words { + n := Normalize(w) + if len(n) != 1 || n[0] != strings.TrimSpace(n[0]) || utf8.RuneCountInString(n[0]) < MinLetters { + return fmt.Errorf("line %d, %q, is not one word of %d or more letters", i+1, w, MinLetters) + } + if err := checkRunes(n[0]); err != nil { + return fmt.Errorf("line %d: %w", i+1, err) + } + if prev, ok := seen[n[0]]; ok { + return fmt.Errorf("line %d, %q, is the same word as %q once normalized", i+1, w, prev) + } + seen[n[0]] = w + } + return nil +} + +// Generate draws n different words of list, uniformly, with random, which +// is crypto/rand.Reader when nil. Each word adds log2(len(list)) bits, a +// little less for each word already drawn. n must be MinWords or more. +func Generate(list []string, n int, random io.Reader) ([]string, error) { + if n < MinWords { + return nil, fmt.Errorf("wordkey: a key of words needs at least %d words, not %d", MinWords, n) + } + if n > len(list)/2 { + return nil, fmt.Errorf("wordkey: %d words of a list of %d", n, len(list)) + } + if random == nil { + random = rand.Reader + } + picked := make(map[int]bool, n) + words := make([]string, 0, n) + size := big.NewInt(int64(len(list))) + for len(words) < n { + i, err := rand.Int(random, size) + if err != nil { + return nil, fmt.Errorf("wordkey: %w", err) + } + if picked[int(i.Int64())] { + continue + } + picked[int(i.Int64())] = true + words = append(words, list[i.Int64()]) + } + return words, nil +} diff --git a/wordkey/generate_test.go b/wordkey/generate_test.go new file mode 100644 index 0000000..98f2d09 --- /dev/null +++ b/wordkey/generate_test.go @@ -0,0 +1,144 @@ +package wordkey + +import ( + "bytes" + "crypto/sha256" + "fmt" + "strings" + "testing" +) + +// The built-in lists and their SHA-256, as lists/README.md records them. A +// change of a list changes the hash an app pins, so it is never silent. +var listHashes = map[string]string{ + "es": "ff77b487765c000da97cca58fe94a2cdb947303e7a07460614d7d95d800034fe", +} + +func TestBuiltInLists(t *testing.T) { + if got := strings.Join(Languages(), " "); got != "es" { + t.Fatalf("Languages() = %q", got) + } + for lang, want := range listHashes { + if got := fmt.Sprintf("%x", sha256.Sum256([]byte(lists[lang]))); got != want { + t.Errorf("list %s: SHA-256 %s, want %s", lang, got, want) + } + words, err := List(lang) + if err != nil { + t.Fatal(err) + } + if len(words) != 7776 { + t.Errorf("list %s: %d words, want 7776", lang, len(words)) + } + } + if _, err := List("xx"); err == nil || !strings.Contains(err.Error(), `no word list for "xx"; the lists are es`) { + t.Errorf("List(xx): %v", err) + } +} + +func TestCheckList(t *testing.T) { + base := make([]string, MinListSize) + for i := range base { + base[i] = fmt.Sprintf("pal%04d", i) + } + if err := CheckList(base); err != nil { + t.Fatal(err) + } + with := func(i int, w string) []string { + l := append([]string(nil), base...) + l[i] = w + return l + } + for _, c := range []struct { + list []string + want string + }{ + {base[:MinListSize-1], "2047 words, fewer than 2048"}, + {with(5, "dos palabras"), `line 6, "dos palabras", is not one word`}, + {with(5, " "), "is not one word"}, + {with(5, "mi"), `"mi", is not one word of 3 or more letters`}, + {with(5, "casa​"), "invisible character U+200B"}, + {with(5, "PAL0001"), `line 6, "PAL0001", is the same word as "pal0001"`}, + {append(with(0, "papá"), "papa"), `"papa", is the same word as "papá"`}, + } { + if err := CheckList(c.list); err == nil || !strings.Contains(err.Error(), c.want) { + t.Errorf("CheckList: %v, want %q", err, c.want) + } + } +} + +func TestGenerate(t *testing.T) { + list, err := List("es") + if err != nil { + t.Fatal(err) + } + words, err := Generate(list, DefaultCount, nil) + if err != nil { + t.Fatal(err) + } + if len(words) != DefaultCount { + t.Fatalf("%d words", len(words)) + } + if err := Check(Normalize(strings.Join(words, " "))); err != nil { + t.Errorf("generated words %q: %v", words, err) + } + seen := map[string]bool{} + for _, w := range words { + if seen[w] { + t.Errorf("%q drawn twice", w) + } + seen[w] = true + } + // The same random bytes draw the same words: Generate reads nothing else. + seed := bytes.Repeat([]byte{7, 1, 200, 33}, 64) + a, _ := Generate(list, 6, bytes.NewReader(seed)) + b, _ := Generate(list, 6, bytes.NewReader(seed)) + if strings.Join(a, " ") != strings.Join(b, " ") { + t.Errorf("%q and %q", a, b) + } + for _, c := range []struct { + n int + want string + }{ + {5, "at least 6 words, not 5"}, + {len(list), "7776 words of a list of 7776"}, + } { + if _, err := Generate(list, c.n, nil); err == nil || !strings.Contains(err.Error(), c.want) { + t.Errorf("Generate(%d): %v, want %q", c.n, err, c.want) + } + } + if _, err := Generate(list, 6, bytes.NewReader(nil)); err == nil || !strings.Contains(err.Error(), "EOF") { + t.Errorf("Generate without random bytes: %v", err) + } +} + +// Every word is about as likely: over 7776·40 draws of one word, each index +// falls in its bucket of 64 between 0.8 and 1.2 times the mean. +func TestGenerateUniform(t *testing.T) { + if testing.Short() { + t.Skip("slow") + } + list, _ := List("es") + index := make(map[string]int, len(list)) + for i, w := range list { + index[w] = i + } + const buckets = 64 + var count [buckets]int + draws := 0 + for draws < len(list)*40 { + words, err := Generate(list, 6, nil) + if err != nil { + t.Fatal(err) + } + for _, w := range words { + count[index[w]*buckets/len(list)]++ + draws++ + } + } + mean := float64(draws) / buckets + for i, c := range count { + if float64(c) < 0.8*mean || float64(c) > 1.2*mean { + t.Errorf("bucket %d: %d draws, mean %.0f", i, c, mean) + } + } +} diff --git a/wordkey/lists/README.md b/wordkey/lists/README.md new file mode 100644 index 0000000..f82a218 --- /dev/null +++ b/wordkey/lists/README.md @@ -0,0 +1,38 @@ +# Word lists of `wordkey.Generate` + +The lists from which `datekeys encrypt -new-words` draws a key of words at +random (spec §38.1: at least 6 words of a public list of 2048 or more). They +are not normative: a reader does not need them, because the key is derived +from the normalized text of the words, whatever list they came from. + +| List | Words | SHA-256 | Status | +|---|---|---|---| +| `es.txt` | 7776 | `ff77b487765c000da97cca58fe94a2cdb947303e7a07460614d7d95d800034fe` | Draft, not yet reviewed by a native speaker | + +A list changes only with its hash in this file and in `generate_test.go`: +an application that downloads a list pins its SHA-256 and refuses any other. + +## `es.txt` + +- **Source:** the frequencies of + [FrequencyWords](https://github.com/hermitdave/FrequencyWords) by Hermit + Dave, `content/2018/es/es_50k.txt`, counted on the OpenSubtitles 2018 + corpus, licensed under CC BY-SA 4.0. The Spanish Hunspell dictionary of + LibreOffice (RLA-ES, `es_ES.dic` and `es_ES.aff`) is used only as a filter + and is not redistributed. +- **License:** this list is an adaptation of FrequencyWords and is licensed + under [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/), + unlike the code of this module (Apache 2.0). +- **Method:** the most frequent words that are, in order: + 1. lowercase letters only, of 3 to 9 letters; + 2. a base form of the dictionary: an entry with affix flags, or the + feminine its flag `G` makes. Entries without flags, which are + conjugations, plurals and pieces of names, are left out; + 3. not in a short list of offensive or unpleasant words; + 4. not the other half of a pair that differs only in a final `-o` or `-a` + (`chico` and `chica`): the more frequent stays; + 5. not the same as a word already taken once normalized as in §38.1 + (`papa` and `papá`): the more frequent stays. + + The first 7776 that pass, sorted. `wordkey.CheckList` checks the last rule + and the characters of every word. diff --git a/wordkey/lists/es.txt b/wordkey/lists/es.txt new file mode 100644 index 0000000..a13a95a --- /dev/null +++ b/wordkey/lists/es.txt @@ -0,0 +1,7776 @@ +abad +abadía +abandonar +abandono +abanico +abarca +abdomen +abdominal +abeja +abejorro +abertura +abierta +abismo +abofetear +abogacía +abogado +abordaje +abordar +abortar +aborto +abra +abrasador +abrazar +abridor +abrigado +abrigo +abril +abrir +absceso +absoluto +absorber +absorción +absorto +abstracto +absuelto +absurdo +abuela +abundante +aburrido +aburrir +abusador +abusar +abusivo +abuso +acabado +acabar +acabo +academia +académico +acalorada +acampada +acampar +acariciar +acatar +acceder +accesible +acceso +accesorio +accidente +acción +acechar +acecho +aceite +aceituna +acelerado +acelerar +acento +aceptable +aceptar +acepto +acera +acercar +acertado +acertar +acertijo +acidez +acierto +aclarado +aclarar +acné +acoger +acogida +acomodar +acompañar +aconsejar +acorazado +acordado +acordar +acorde +acordeón +acortar +acosador +acosar +acostado +acostar +acre +acróbata +actitud +activar +actividad +activista +activo +acto +actor +actriz +actuación +actual +actuar +acuario +acudir +acuerdo +acumulado +acumular +acusación +acusado +acusador +acusar +acuse +acuático +acústica +adaptar +adecuado +adelantar +adelanto +adelgazar +aderezo +adhesiva +adicción +adicional +adición +adictivo +adicto +adinerado +adivinar +adjunto +admirador +admirar +admisible +admisión +admitir +adopción +adoptar +adoptivo +adorar +adornar +adorno +adquirido +adquirir +aduana +adulador +adulterio +adulto +advertido +advertir +adán +aerolínea +aeronave +aeroplano +aerosol +aeródromo +afable +afección +afecta +afectado +afectar +afectuoso +afeitado +afeitar +afeminado +aferrado +afgano +afiche +afición +afilado +afilar +afinar +afinidad +afirmar +aflicción +aflojar +afrenta +africano +afrodita +afrontar +afán +agarrado +agarrar +agarre +agencia +agenda +agente +agilidad +agitación +agitado +agitar +agobiante +agonía +agosto +agota +agotador +agotar +agradable +agradar +agradecer +agrado +agredido +agredir +agregado +agregar +agresivo +agresión +agresor +agria +agridulce +agrícola +agua +aguacate +aguantar +aguardar +agudo +aguijón +aguja +agujero +agustín +ahogado +ahogar +ahogo +ahorcado +ahorcar +ahorrar +ahorro +ahumado +ahuyentar +aire +aislado +aislante +aislar +ajedrez +ajeno +ajetreo +ajuar +ajustado +ajustar +ajuste +alabado +alabanza +alabar +alambre +alana +alarde +alardear +alargar +alarma +alarmante +alba +albahaca +albañil +albedrío +alberca +albergar +albergue +albino +albornoz +alboroto +albóndiga +alcaide +alcalde +alcaldesa +alcaldía +alcance +alcanzado +alcanzar +alcatraz +alce +alcoba +alcohol +alcántara +aldea +aleatorio +alegar +alegato +alegra +alegrar +alegre +alegría +aleja +alejado +alejar +alemán +alentador +alentar +alergia +alertar +aleta +alfa +alfabeto +alfil +alfiler +alfombra +alférez +alga +algodón +algoritmo +alguacil +alguna +ali +aliado +alianza +aliento +aligerar +alimentar +alimento +alinear +aliviar +alivio +alma +almacena +almacenar +almacén +almeja +almendra +almirante +almohada +almorzar +almuerzo +alocado +aloja +alojado +alojar +alondra +alonso +alquila +alquilar +alquiler +alquimia +alquitrán +alta +altar +altavoz +alterado +alterar +altercado +alterna +alteza +altitud +altura +altísimo +alucinar +aluminio +alumno +alza +alzar +alzheimer +alérgico +amable +amado +amador +amanecer +amante +amapola +amar +amargado +amargo +amargura +amarillo +amarrado +amarrar +amazona +ambicioso +ambición +ambiental +ambiente +ambiguo +ambulante +amenaza +amenazar +americano +amigable +amigo +amistad +amistoso +amnesia +amo +amoníaco +amor +amores +amorío +amparo +ampliar +amplio +amplitud +ampolla +amputar +anal +analista +analizar +analogía +analítica +anarquía +anastasia +anatomía +ancestral +ancestro +ancho +anciano +ancla +andamio +androide +andén +anemia +anestesia +aneurisma +anexo +anfitrión +angelical +angelina +angelito +anguila +angular +angustia +angélica +anhelo +animado +animadora +animal +animar +aniquilar +anochecer +anomalía +anonimato +anormal +anotar +ansia +ansiedad +ansioso +antemano +antena +anterior +anticipar +anticuado +antiguo +antojo +antorcha +antro +antídoto +antílope +anual +anuario +anular +anunciar +anzuelo +anécdota +anís +anónimo +aorta +apacible +apagar +apagón +aparador +aparato +aparcar +aparecer +aparentar +aparente +aparición +apartado +apartar +apatía +apego +apelar +apellido +aperitivo +apertura +apestar +apestoso +apetito +apilar +apio +aplastar +aplaudir +aplauso +aplazar +aplicado +aplicar +aplique +apoderado +apodo +apogeo +apolo +apoplejía +aportar +apostar +apoyar +apreciar +aprender +aprendiz +apresurar +apretado +apretar +apretón +aprieto +aprobado +aprobar +aptitud +apto +apuntado +apuntar +apunte +apurado +apurar +apuñalado +apuñalar +apéndice +apóstol +aquelarre +aquella +arado +arar +araña +arañazo +arboleda +arbusto +arcadia +arce +archivar +archivo +arcilla +arco +arcángel +arda +arder +ardid +ardiente +ardilla +ardor +arduo +arena +arenque +arete +argel +argentina +argumento +aria +arma +armada +armadillo +armadura +armamento +armar +armario +armazón +armenia +armería +armonía +armónica +arnés +aro +aroma +arpa +arpía +arpón +arquero +arrancado +arrancar +arranque +arrasar +arrastrar +arrastre +arrebatar +arrebato +arrecife +arreglado +arreglar +arreglo +arrestar +arresto +arribo +arriesgar +arritmia +arrogante +arrojado +arrojar +arrojo +arroyo +arroz +arruga +arruinar +arsenal +arsénico +arte +artefacto +arteria +arterial +artesanal +artesano +artesanía +artillero +artilugio +artimaña +artista +artículo +artístico +arzobispo +arándano +asa +asado +asador +asaltante +asaltar +asamblea +asar +ascender +ascensión +ascenso +ascensor +asco +asedio +asegurado +asegurar +asentado +aseo +asesina +asesinato +asesor +asesoría +asfalto +asfixia +asiento +asignado +asignar +asimilar +asistenta +asistente +asistido +asistir +asiático +asma +asno +asociado +asombro +aspecto +asperger +aspirante +aspirar +aspirina +asqueroso +asta +asteroide +astilla +astillero +astral +astro +astrónomo +astucia +astuto +asumir +asunción +asunto +asustar +atacante +atacar +atado +atar +atardecer +atascado +atasco +ataúd +atención +atender +atenea +atentado +atento +ateo +aterrador +aterrizar +atizador +atleta +atletismo +atlántico +atlético +atmósfera +atontado +atracador +atracar +atraco +atractivo +atraer +atrapar +atrasado +atraso +atravesar +atrevido +atrocidad +atropello +atropina +atroz +atuendo +aturdido +atómica +atónito +atún +audacia +audaz +audición +audiencia +audio +auditorio +audífono +auge +augurio +augusto +aula +aullar +aullido +aumentar +aumento +aura +auricular +aurora +ausencia +ausente +autismo +autista +auto +autonomía +autopsia +autor +autoridad +autorizar +auténtico +autógrafo +autónomo +auxiliar +auxilio +avalancha +avance +avanzada +avanzar +avaricia +avaro +avatar +ave +aventura +averiguar +avería +avestruz +aviación +aviador +aviar +avioneta +avisado +avisar +aviso +avispa +avión +axila +ayuda +ayudado +ayudante +ayudar +ayuno +azafata +azafrán +azotado +azotar +azote +azotea +azteca +azufre +azul +azulejo +azúcar +aérea +añada +añadido +añadir +año +baba +babear +babilonia +babor +baboso +bacalao +bache +bacteria +bahía +baila +bailado +bailar +bailarina +baile +baja +bajada +bajar +bajista +bajito +bajón +bala +balance +balancear +balanceo +balanza +balazo +balboa +balcón +balde +baldes +ballena +ballesta +ballet +balneario +balsa +balística +balón +bambú +banal +bancaria +banco +bancos +banda +bandada +bandas +bandeja +bandera +bandido +banquero +banquete +bao +bar +baraja +baranda +barata +baratija +barba +barbacoa +barbero +barbería +barbilla +barbudo +barcaza +barco +barcos +barniz +baronesa +barquero +barra +barraca +barracón +barranco +barrer +barrera +barricada +barriga +barril +barrio +barullo +barón +basa +basada +base +basta +bastar +bastarda +bastión +bastón +basura +basurero +bata +batalla +batallón +bate +batea +bateador +batear +baterista +batería +batido +batidora +batir +batista +batuta +bautismo +bautista +bautizar +bautizo +bayoneta +bazar +bazo +bazofia +bañado +bañador +bañar +bañera +baño +baúl +bebedor +beber +bebida +bebé +beca +becerro +bel +belga +bella +belleza +belén +bemol +ben +bendecir +bendición +bendito +beneficio +bengala +benigno +benito +benjamín +benéfica +berenjena +bernardo +berrinche +besar +beso +bestia +bestial +beta +bey +biberón +biblia +bicho +bici +bicicleta +bienestar +bigote +bikini +biliar +billar +billete +billetera +billón +binario +bingo +biografía +biología +biológico +biopsia +bisabuelo +bisonte +bistec +bisturí +bit +bitácora +bizarro +bizco +bizcocho +biólogo +blanco +blanda +blasfemia +blasfemo +bledo +blindado +blindaje +blog +bloque +bloquear +bloqueo +blusa +boa +bobada +bobina +bobo +boca +bocado +bocanada +bocaza +boceto +bocina +boda +bodega +bofetada +bohemia +boicot +boina +bola +bolera +boleto +boletín +boliche +bollo +bolo +bolsa +bolígrafo +bomba +bombardeo +bombear +bombero +bombón +bonanza +bondad +bondadoso +bongo +bonito +bono +bordado +borde +bordo +borgoña +borneo +borra +borracho +borrador +borrar +borroso +borrón +bosnia +bosque +bosquejo +bota +botar +bote +botella +botiquín +botánico +botín +botón +boutique +boxeador +boxear +boxeo +boya +braga +bragueta +brasil +brasileño +bravo +bravucón +brazalete +brazo +brea +brebaje +brecha +bren +bretaña +brevedad +bribón +brigada +brigadier +brillante +brillar +brillo +brincar +brindar +brisa +británico +brocha +broche +broma +bromear +bromista +bronca +bronce +bronceado +brota +brote +bruja +brujería +bruma +bruno +brusco +brutal +bruto +brújula +bucal +bucear +buceo +bucle +buda +budismo +budista +budín +bueno +buenísimo +buey +bufanda +bufete +bufón +buitre +bulevar +bullicio +bulto +bungalow +buque +burbuja +burdel +burguesía +burgués +burla +burlar +burro +burócrata +bus +busca +buscador +buscar +buscarla +buses +busto +butaca +buzo +buzos +buzón +bálsamo +báltico +bárbara +básico +béisbol +bíblico +bóveda +búfalo +búho +búnker +búsqueda +cabalgar +cabalgata +caballero +caballito +caballo +cabaña +cabecera +cabellera +cabello +cabelludo +caber +cabeza +cabezota +cabezón +cabida +cabina +cable +cabra +cabrear +cabría +cacahuete +cacao +cacerola +cacharro +cachemira +cacho +cachondo +cachorro +cadena +cadera +cadete +caer +cafetera +cafetería +cafeína +café +caimán +caja +cajero +cajón +cal +cala +calabaza +calabozo +calada +calamar +calambre +calamidad +calavera +calcetín +calcio +calcular +caldera +caldo +calentar +calentito +calibre +calidad +calidez +caliente +califa +calificar +caliza +callado +callar +calle +callejero +callejón +callo +calma +calmante +calmar +calor +calumnia +caluroso +calvario +calvo +calza +calzado +calzón +cama +camada +camaleón +camarada +camarero +camarote +camarón +cambiante +cambiar +cambio +camello +camerino +camilla +camilo +caminante +caminar +caminata +camino +camionero +camioneta +camisa +camiseta +camisón +camión +campaña +campera +campesino +campestre +campeón +campiña +campo +campus +camuflaje +can +canal +canalizar +canalla +canario +canasta +cancela +cancelar +cancha +canciller +canción +candado +candela +candente +candidato +canela +cangrejo +canguro +caniche +canino +canoa +canoso +cansa +cansado +cansancio +cansar +canta +cantante +cantar +cante +cantera +cantina +cantinero +cantor +caníbal +caoba +capa +capacidad +caparazón +capataz +capaz +capellán +capilla +capital +capitana +capitolio +capitán +capota +capote +capricho +captar +captura +capturar +capucha +capuchino +capullo +capítulo +caqui +car +cara +carabina +caracol +caradura +carajo +caramelo +caravana +carbono +carbón +carcasa +carcelero +cardenal +cardíaco +carencia +carente +cargado +cargador +cargar +cargo +carguero +caribe +caricia +caridad +carisma +cariño +cariñoso +carla +carmel +carmen +carmesí +carmín +carnada +carnal +carnaval +carne +carnero +carnet +carnicero +carnívoro +carolina +carpa +carpeta +carrera +carreta +carrete +carretera +carril +carrito +carro +carros +carroza +carroña +carruaje +carrusel +carta +cartel +cartelera +cartera +cartucho +cartílago +cartón +carótida +casa +casado +casanova +casar +cascabel +cascada +cascarón +casco +cascos +casero +caseta +casete +casillero +casino +casita +caspa +casta +castaño +castidad +castigar +castigo +castillo +castor +castrado +castro +casual +cata +catalina +catapulta +catarro +catedral +categoría +catorce +catre +catálogo +catéter +católica +caucho +caucásico +caudillo +causa +causante +causar +cautela +cauteloso +cautiva +cava +cavar +caverna +caviar +cavidad +cayo +caza +cazado +cazador +cazar +cazuela +caído +caña +cañería +caótico +cebada +cebo +cebolla +cebra +ceda +ceder +cedro +cegado +ceguera +ceja +celda +celebrado +celebrar +celeste +celestial +celia +celibato +celo +celos +celoso +celta +celular +cemento +cena +cenar +cenicero +ceniza +censo +censura +centavo +centenar +centeno +centinela +centrado +central +centrar +centro +centurión +cepa +cercado +cercano +cercanía +cerco +cerdito +cereal +cerebral +cerebro +ceremonia +cereza +cerilla +cero +cerrado +cerradura +cerrajero +cerrar +cerro +cerrojo +certeza +cerveza +cervical +cerámica +cese +cesta +cesárea +cetro +cha +chacal +chal +chaleco +chalet +chambelán +champaña +champán +champú +chamán +chance +chantaje +chapa +chapado +chapuzón +chaqueta +charco +charla +charlar +charlatán +chasquido +chat +chatarra +chato +chaval +che +checa +chef +chelín +cheque +chequear +chequera +chica +chichón +chicle +chiflado +chihuahua +chilla +chillar +chillido +chillón +chimenea +chimpancé +china +chip +chiquero +chiquita +chiquitín +chirrido +chisme +chismosa +chispa +chiste +chistoso +chita +chivatazo +chivato +chivo +chocante +chocar +chocolate +chocó +choque +chorizo +chorlito +chorrada +chorro +choza +chucho +chuleta +chulo +chungo +chupado +chupete +chusma +cháchara +chándal +chófer +cianuro +cicatriz +ciclismo +ciclista +ciclo +ciclón +cid +ciego +cielo +cien +ciencia +ciento +cierre +cierta +ciervo +cifra +cifrado +cigarro +cigüeña +cilantro +cilindro +cima +cinco +cincuenta +cine +cineasta +cinema +cinismo +cinta +cintura +cinturón +circo +circuito +circular +ciruela +cirugía +cirujano +cisco +cisne +cisterna +cita +citación +citar +ciudad +ciudadano +ciudadela +civil +ciénaga +clan +claqué +clara +claridad +clarinete +clase +claudia +clausura +clavado +clavar +clave +clavel +clavo +clavícula +clemencia +clemente +clero +cliché +clienta +cliente +clientela +clima +climático +clip +cloaca +clon +clonación +cloro +cloruro +club +clásico +cláusula +clérigo +clínica +coalición +cobalto +cobarde +cobardía +cobertizo +cobertura +cobija +cobra +cobrador +cobrar +cobre +coca +cocción +cocer +coche +cochero +cochino +cocido +cocina +cocinar +cocinero +cocodrilo +codicia +codicioso +codo +codorniz +cofre +coger +cogido +coherente +cohete +coincidir +coito +cojera +cojo +cojonudo +cojín +cola +colaborar +colada +colador +colapsar +colar +colcha +colchón +colección +colectivo +colega +colegiala +colegio +colgado +colgante +colgar +colibrí +coliflor +colina +coliseo +colisión +collar +colmena +colmillo +colmo +colocado +colocar +colon +colonia +colonial +color +colorado +colorear +colosal +coloso +columna +columpio +coma +comadreja +comadrona +comanche +comandar +comando +comarca +combate +combatir +combinado +combinar +comedia +comedor +comentar +comenzar +comer +comercial +comerciar +comercio +cometa +cometer +cometido +comezón +comida +comienzo +comino +comisario +comisión +comité +comodidad +comodoro +comodín +compacto +compadre +comparado +comparar +compartir +compasivo +compasión +compañero +compañía +compensar +competir +compinche +complacer +complejo +completar +completo +complicar +componer +comporta +compra +comprado +comprador +comprar +compresor +comprobar +comprueba +compuerta +compuesto +compás +comuna +comunicar +comunidad +comunismo +comunista +comunión +común +concebir +conceder +concejal +concejo +concepto +concertar +concierto +conciliar +concluir +concretar +concreto +concubina +concuerda +conde +condena +condenado +condenar +condición +conducir +conducta +conductor +conectar +conejillo +conejito +conejo +conexión +confesado +confesar +confesión +confesor +confeti +confiado +confianza +confiar +confirmar +confiscar +conflicto +confundir +confuso +congelado +congelar +congo +congreso +conjetura +conjunto +cono +conocedor +conocer +conocido +conquista +conseguir +consejero +consejo +consenso +consentir +conserje +conserva +conservar +consigna +consola +consolar +consorcio +consorte +conspirar +constante +construir +consuelo +consulado +consulta +consultar +consultor +consumado +consumido +consumir +consumo +contable +contactar +contado +contador +contagio +contar +contener +contenido +contento +conteo +contestar +contigua +continua +continuar +contraer +contrario +contratar +control +controlar +contusión +convencer +convenio +convento +conversar +convertir +convicto +convivir +convocar +convoy +conyugal +cooperar +coordinar +copa +copia +copiar +coqueta +coquetear +coraje +coral +coraza +corazón +corbata +corcel +corcho +cordel +cordero +cordial +cordura +cordón +corea +coreano +corista +corneta +cornisa +cornudo +coro +corona +coronado +coronel +corpiño +corporal +corra +corral +correcto +corredor +corregir +correo +correr +correría +corrido +corromper +corrupto +corso +corsé +corta +cortado +cortador +cortante +cortar +corte +cortejar +cortejo +cortes +cortesana +cortesía +corteza +cortina +cosa +cosaco +cosecha +cosechar +coser +cosido +cosmos +costa +costado +costal +costar +coste +costear +costera +costoso +costumbre +costura +costurera +cotidiana +cotilla +cotilleo +coyote +coágulo +coñac +craneal +crea +creación +creador +crear +creativo +crecer +crecido +creciente +credo +creencia +creer +crema +cremación +cremoso +cresta +creta +cretino +creyente +creíble +creído +criada +criadero +crianza +criar +criatura +crimen +criminal +cripta +cristal +cristiano +cristina +cristo +criterio +criticar +croata +cromo +cromosoma +cruce +crucero +cruces +crucial +crucifijo +crudo +cruel +crueldad +crujiente +cruz +cruzado +cruzar +cráneo +cráter +crédito +crío +crítica +crónica +cuaderno +cuadrado +cuadrante +cuadro +cuadros +cualidad +cuarenta +cuartel +cuarteto +cuarto +cuarzo +cuatro +cubano +cubeta +cubierta +cubo +cubrir +cubículo +cucaracha +cuchara +cucharada +cuchillo +cuco +cuelga +cuelgue +cuello +cuenco +cuenta +cuerda +cuerno +cuero +cuerpo +cuervo +cuesta +cuestión +cueva +cuida +cuidado +cuidador +cuidadoso +cuidar +culata +culebra +culinario +culpa +culpable +culpado +culpar +culta +cultivado +cultivar +cultivo +cultura +cultural +cumbre +cumplido +cumplir +cuna +cuneta +cuota +cupido +cupo +cupón +cura +curación +curado +curador +curandero +curar +curie +curioso +curro +currículo +cursi +curso +curva +curvatura +custodia +cutre +cuyo +cuántica +cuánto +cuñado +cálculo +cálido +cáliz +cámara +cápsula +cárcel +cáscara +cátedra +cáñamo +célebre +célula +céntimo +césar +césped +cíclope +cínico +círculo +cívico +cóctel +código +cólera +cómic +cómico +cómodo +cómplice +cóndor +cónsul +cónyuge +córdoba +cósmico +cúmulo +cúpula +cúspide +dactilar +daga +dalia +dama +damasco +damisela +dance +dandi +danesa +dante +danza +dar +dardo +data +dañado +dañar +dañino +daño +deambular +debacle +debatir +deber +debido +debilidad +debilitar +decano +decencia +decente +decepción +decidido +decidir +decir +decisivo +decisión +declarado +declarar +declive +decorado +decorador +decorar +decoro +decreto +dedicar +deducción +deducir +defender +defendido +defensa +defensiva +defensor +definido +definir +deforme +defraudar +deidad +deja +dejado +dejar +delantal +delantera +delatar +delator +delegado +deleite +deletrear +deletreo +delfín +delgado +delia +deliberar +delicado +delicia +delicioso +delirante +delirio +delito +delta +demandar +demasiada +demencia +demencial +demente +demo +demoler +demonio +demoníaco +demora +demorar +demostrar +demócrata +densidad +denso +dentadura +dental +dentista +denuncia +denunciar +depender +deportivo +depositar +depravado +depresivo +deprimido +derecha +deriva +derivado +derrama +derramado +derramar +derrame +derretido +derretir +derribado +derribar +derribo +derrocar +derrota +derrotado +derrotar +derrumbar +desacato +desafiar +desafío +desagüe +desalmado +desalojar +desarmar +desastre +desatar +desayunar +descalzo +descansar +descanso +descarado +descargar +descartar +descender +describir +descrito +descubrir +descuido +desdicha +deseable +desear +desechar +deseo +deseoso +deserción +desertar +desertor +desfilar +desfile +desgarro +desgaste +deshecho +deshonor +desierto +desistir +desliz +deslizar +desmayado +desmayar +desmontar +desnuda +desnudez +desorden +despacho +despedida +despedir +despegar +despegue +despejado +despejar +despensa +despertar +despido +despierta +despistar +desplegar +destacado +destacar +destapar +destello +destierro +destinado +destreza +destrozar +destruir +desviar +desván +desvío +detallado +detalle +detección +detectar +detective +detector +detención +detener +detenido +deterioro +detonador +detonar +deuda +devoción +devolver +devorador +devorar +devoto +devuelto +diablo +diabólico +diadema +diafragma +diagonal +diagrama +dial +dialecto +diamante +diana +diario +diarrea +dibujante +dibujar +dibujo +dicho +dichoso +dictado +dictador +dictadura +dictar +dieciocho +diego +diente +diestro +dieta +diez +difundir +difunto +difusión +difícil +digerir +digestivo +digestión +digital +dignidad +digno +dije +dilema +diligente +diluvio +dimensión +diminuto +dimisión +dimitir +dinamita +dinastía +dineral +dinero +dino +dinámica +dios +diosa +diploma +diputado +dique +dirección +directiva +directo +director +dirigente +dirigible +dirigida +dirigir +disco +discordia +discoteca +discreto +disculpa +disculpar +discurso +discusión +discutir +discípulo +disección +diseñador +diseñar +diseño +disfraz +disfrazar +disfrutar +disfrute +disgusto +disimular +disminuir +disolver +disparada +disparar +disparate +disparo +dispersa +disponer +dispuesto +disputa +distancia +distante +distinto +distraer +distraído +distrito +disturbio +disuelto +diurno +diva +diversión +divertido +divertir +dividir +divina +divinidad +división +divorciar +divorcio +divulgar +diván +dix +diácono +diálogo +diámetro +dióxido +dobla +doblado +doblar +dobles +doce +docena +docente +doctor +doctorado +doctrina +documento +dolencia +doler +dolor +dolorido +doloroso +domador +domar +domicilio +dominante +dominar +domingo +dominical +dominio +dominó +domo +doméstica +don +donación +donado +donante +donar +doncella +dones +donjuán +dopamina +dorado +dormido +dormilón +dormir +dorsal +dorso +dos +dosis +dossier +dotado +dote +doña +drago +dragón +drama +dramático +drenaje +drenar +drogar +dron +druida +drástico +ducha +duchar +duda +dudar +dudoso +duelo +duende +dueto +dueño +dulzura +duplicado +duplicar +duque +duquesa +dura +duración +duradera +durar +durazno +dureza +durmiente +débil +década +décimo +dédalo +déficit +día +dócil +dólar +dúo +ebriedad +ebrio +echado +echar +echo +eclipse +eco +ecografía +ecológico +economía +económica +ecuación +ecuador +edad +edema +edición +edificio +editar +editor +editorial +edredón +educación +educado +educar +educativo +edén +efectivo +efecto +efectuar +eficacia +eficaz +eficiente +egipcio +ego +egoísmo +egoísta +eje +ejecución +ejecutar +ejecutivo +ejecutor +ejemplar +ejemplo +ejercer +ejercicio +ejercitar +ejército +elaborado +elaborar +elección +electo +electoral +electro +electrón +elefante +elegancia +elegante +elegido +elegir +elegía +elemental +elemento +elenco +elevación +elevado +elevador +elevar +elfo +eliminar +elixir +ella +elle +elocuente +elogio +eludir +elástica +eléctrica +embajada +embajador +embalaje +embarazo +embarcar +embargo +embarque +emblema +embolia +emboscada +embrión +embrollo +embudo +embustero +emergente +emerger +eminencia +eminente +emir +emisario +emisión +emisora +emitir +emocional +emoción +emotivo +empacar +empanada +empaque +empate +empatía +empeorar +emperador +empezar +empeñado +empeñar +empeño +empiece +empleado +empleador +emplear +empleo +empollón +emprender +empujar +empuje +empujón +enamorado +enamorar +enano +encajar +encaje +encantado +encantar +encanto +encarar +encargado +encargar +encargue +encender +encendido +encerrar +enchufe +encierro +encogido +encontrar +encubrir +encuentro +enderezar +enema +enemigo +enemistad +energía +enfadar +enfado +enfatizar +enfermar +enfermera +enfermizo +enfermo +enfocar +enfrentar +enfriar +enganchar +enganche +engañar +engaño +engañoso +engendrar +engendro +engordar +engranaje +engreído +enigma +enjambre +enjuague +enlace +enmendar +enmienda +enojar +enorme +enredo +enrique +enrollado +enrollar +ensayar +enseñado +enseñanza +enseñar +ensuciar +entablar +ente +entender +entendido +enterado +enterar +entero +enterrar +entidad +entierro +entrada +entrante +entrar +entrega +entregada +entregar +entrenar +envase +envejecer +envenenar +enviado +enviar +envidia +envoltura +envolver +envuelto +envío +enzima +enérgico +epicentro +epidemia +epidural +epifanía +epilepsia +episodio +equipo +equivocar +ere +erección +erizo +ermitaño +ero +erosión +erradicar +errado +errante +errar +error +errático +errónea +eructar +erudito +erupción +erótico +escala +escalada +escalar +escalera +escalpelo +escalón +escanear +escapada +escapar +escape +escapo +escarbar +escarlata +escasez +escaso +escayola +escena +escenario +esclavo +esclusa +escoba +escobar +escocia +escocés +escoger +escogido +escolar +escolta +escoltar +esconder +escondido +escondite +escopeta +escoria +escorpión +escote +escribir +escrito +escritor +escritura +escroto +escuadra +escuadrón +escucha +escuchar +escudero +escudo +escuela +escultor +escultura +escupido +escupir +escándalo +escáner +escénico +escéptico +ese +esencia +esencial +esfera +esfinge +esforzado +esfuerzo +esgrima +esguince +eslabón +esmalte +esmeralda +eso +espacial +espacio +espacioso +espagueti +espalda +espantar +espanto +espantoso +esparcido +esparcir +espasmo +español +especie +espectro +especular +espejismo +espejo +espera +esperanza +esperar +esperma +espesa +espesor +espiar +espina +espinaca +espinal +espinosa +espionaje +espiral +esplendor +esponja +esponjoso +esposa +espuma +espátula +espía +espíritu +esqueleto +esquema +esquiar +esquimal +esquina +esquiva +esquivar +esquí +estable +establo +estaca +estacada +estación +estadio +estafa +estafador +estafar +estallar +estallido +estampa +estampado +estampida +estancada +estancia +estanque +estante +estatal +estatua +estatura +estatuto +estaño +este +estela +estelar +ester +esternón +estigma +estilista +estilo +estima +estimular +estira +estirado +estirar +estirpe +estiércol +esto +estomacal +estonia +estorbo +estornudo +estrado +estratega +estrechar +estrecho +estrella +estrellar +estrenar +estreno +estribor +estricta +estrofa +estropear +estruendo +estuche +estudiado +estudiar +estudio +estudioso +estufa +estupenda +estupidez +estándar +estática +estéreo +estéril +estética +estímulo +estómago +esófago +eta +etanol +etapa +etcétera +eterna +eternidad +etiqueta +etiquetar +eufemismo +euforia +eufórico +eunuco +euro +europea +eutanasia +evacuado +evacuar +evadir +evaluar +evangelio +evasiva +evasión +evento +evidencia +evidente +evitar +evolución +exacta +exactitud +exagerado +exagerar +exaltado +examen +examinar +excavar +excelente +excepción +excesivo +exceso +excitante +excluir +exclusivo +exclusión +excursión +excusa +excusado +exhausto +exhibir +exigencia +exigente +exigir +existente +existir +exitoso +exorcismo +exorcista +expandir +expansiva +expansión +experto +expiación +expiar +explicar +explique +explorar +explosivo +explosión +explotar +explícito +exponer +expresa +expresar +expresión +exprimir +expuesto +expulsa +expulsar +expulsión +exquisito +extender +extensa +extensión +exterior +externa +extinción +extintor +extirpar +extorsión +extracto +extraer +extrañar +extraño +extremo +exótico +fabricar +fabuloso +facción +faceta +fachada +facial +facilidad +facilitar +factible +factor +factorial +factura +facultad +faena +faisán +faja +falda +faldero +falla +fallar +fallecido +fallido +falsedad +falso +falta +faltante +faltar +fama +familia +familiar +famoso +fan +fanfarrón +fango +fantasear +fantasma +fantasmal +fantasía +fanático +faraón +farmacia +faro +farol +farola +farsa +farsante +fascismo +fascista +fase +fastidiar +fastidio +fatalidad +fatiga +fauna +fausto +favor +favorable +favorito +fax +faz +fealdad +fecha +federal +felicidad +felicitar +felino +feliz +felpudo +femenina +feminidad +feminismo +feminista +femoral +feo +feria +feriado +ferocidad +feroz +ferviente +fervor +festejar +festejo +festival +festivo +festín +fetal +fetiche +feto +fiable +fiambre +fianza +fiar +fiasco +fibra +ficción +ficha +fichar +fichero +ficticia +fidelidad +fideo +fiebre +fiel +fiera +fierro +fiesta +figura +figurado +fijación +fijado +fijar +fijo +fila +filete +filial +film +filmación +filmar +filme +filosofal +filosofía +filtrado +filtrar +filtro +filósofo +fin +final +finalidad +finalista +finalizar +financiar +finca +fines +fingido +fingir +finito +finlandés +fino +firma +firmar +firmeza +fiscal +fiscalía +fisura +flaco +flacucho +flagrante +flamante +flamenco +flan +flanco +flash +flauta +flautista +flecha +flechazo +flexible +flirtear +flirteo +flojo +flor +flora +floral +florecer +florero +florida +florista +flota +flotador +flotante +flotar +flote +fluidez +fluido +fluir +flujo +fobia +foco +fogata +fogueo +folleto +follón +fomentar +fondo +fontana +fontanero +forajido +forastero +force +forcejeo +forense +forestal +forja +forjado +forjar +forma +formación +formal +formar +formato +formular +fornicar +fornido +foro +forro +fortaleza +fortuito +fortuna +forzada +forzar +forzoso +fosa +foto +fotocopia +fotógrafo +frac +fracasar +fracaso +fracción +fractura +fragancia +fragata +fragmento +fraile +frambuesa +francisco +franco +francés +franela +franja +franqueza +frasco +frase +fraternal +fraude +frecuente +fregadero +fregado +fregar +fregona +frenar +frenesí +freno +frenético +fresa +fresco +frescura +fresno +frey +freír +frialdad +fricción +frijol +friki +frito +frontal +frontera +frotar +fruncido +fruta +frágil +frígida +frío +frívola +fuego +fuente +fuerza +fuga +fugaz +fugitivo +fulana +fumador +fumar +fumo +funcional +funcionar +función +funda +fundación +fundador +fundar +fundición +fundido +fundir +funeral +funeraria +furgoneta +furgón +furia +furioso +furor +furtivo +fusco +fuselaje +fusible +fusil +fusilar +fusión +futuro +fábrica +fábula +fármaco +fémur +féretro +fértil +fía +física +fórmula +fósforo +fósil +fúnebre +fútbol +gabardina +gabinete +gacela +gaceta +gaetano +gafe +gaga +gala +galante +galaxia +galera +gales +galileo +gallardo +galleta +gallina +gallinero +gallito +gallo +galope +galáctica +galán +galón +gama +gamba +gamberro +gamma +gamuza +gana +ganado +ganador +ganancia +ganar +gancho +ganga +gangrena +ganso +garaje +garbo +garcía +garete +garfio +garganta +garito +garra +garrapata +garrote +garza +gas +gasa +gaseosa +gasolina +gastado +gastar +gasto +gatillo +gato +gatos +gaveta +gaviota +gaza +gel +gelatina +gema +gemela +gemido +gemir +generador +general +generar +generoso +genio +genocidio +genoma +gente +gentil +gentileza +gentuza +genuino +genética +geografía +geología +geometría +gerencia +gerente +germen +gestionar +gestión +gesto +geólogo +gigante +gil +gimnasio +gimnasta +gin +ginebra +gira +girar +girasol +giratoria +gitana +glaciar +gladiador +global +globo +gloria +glorioso +glotón +glucosa +gluten +glándula +gnomo +gobernar +gobierno +gol +golfista +golfo +golosina +golpe +golpear +golpeo +goma +gong +gonorrea +gordo +gorila +gorra +gorrión +gota +goteo +gotera +gozar +gozo +grabación +grabado +grabadora +grabar +gracia +gracioso +grado +graduado +gradual +graduar +grafiti +gramo +gramática +gramófono +gran +granada +grand +grandeza +grandioso +granero +granito +granizo +granja +granjero +grano +granuja +grapadora +grasa +grasiento +grata +gratitud +gratuita +grava +grave +gravedad +gray +green +gremio +grey +griego +grieta +grifo +grillo +gringo +gripe +gris +grita +gritar +griterío +gro +grosero +grosería +grosor +grotesco +grueso +grulla +grupal +grupo +gruta +gruñido +gruñir +gruñón +gráfico +grúa +guacamole +guante +guantera +guapo +guapísima +guarda +guardado +guardar +guardería +guardia +guardián +guarida +guarra +guerra +guerrero +guerrilla +gueto +guiado +guiar +guido +guinda +guinea +guion +guionista +guisado +guisante +guiso +guitarra +guiño +gurú +gusano +gustar +gusto +gustos +guzmán +guía +gánster +género +góndola +gótica +güisqui +habana +habilidad +habitable +habitante +habitual +habla +hablado +hablador +hablar +hacedor +hacer +hacha +hacienda +hada +halagador +halago +halcón +hallado +hallar +hallazgo +halo +hamaca +hambre +hambruna +hampa +hangar +harina +harta +harén +hawaiana +hazaña +hebilla +hebreo +hechicero +hechizo +hecho +hedor +heladera +helado +helena +helio +hematoma +hembra +heno +henry +hepática +heraldo +heredado +heredar +heredero +hereje +herejía +herencia +herido +herir +hermandad +hermanito +hermano +hermosa +hermosura +hermético +hernia +heroico +heroísmo +herradura +herrero +hervido +hervir +hidrógeno +hiedra +hielo +hiena +hierba +hierro +higiene +higiénico +higo +hijastra +hijita +hijo +hilarante +hilera +hilo +himno +hinchado +hinchazón +hipo +hipoteca +hippie +hippy +hipócrita +hipódromo +hiriente +hispano +histeria +historia +historial +histérica +histórico +hito +hocico +hogar +hogareño +hoguera +hoja +hojalata +holanda +holandés +holgazán +hollín +holograma +hombre +hombro +hombría +home +homenaje +homicida +homicidio +hondo +honesto +hongo +honor +honorable +honorario +honra +honradez +honrado +honrar +horario +horca +horda +horizonte +hormiga +hormigueo +hormigón +hormona +hormonal +hornear +horno +horrendo +horrible +horroroso +hortense +horóscopo +hospedaje +hospicio +hospital +hostal +hostil +hotel +hoyo +hueco +huelga +huella +huerto +hueso +huevo +huida +huir +humanidad +humano +humanoide +humeante +humedad +humildad +humilde +humillar +humo +humor +hundir +huracán +hurgar +hurto +hurón +husmear +huérfano +huésped +hábil +hábitat +hábito +hámster +hélice +héroe +híbrido +hígado +húmedo +húngaro +iceberg +icono +idea +ideal +idealismo +idealista +idear +identidad +ideología +idioma +idiotez +idéntico +iglesia +ignición +ignorante +ignorar +iguala +igualar +igualdad +igualito +iguana +iluminado +iluminar +ilusión +ilustre +imagen +imaginar +imitación +imitador +imitar +impactar +impacto +impala +imparable +impedido +impedir +imperial +imperio +impetuoso +implicar +implícito +imponer +importar +impostor +imprenta +impresión +impreso +impresora +imprimir +improviso +impuesto +impulsar +impulsivo +impulsor +impune +imán +inaudito +inaugural +inaugurar +incendiar +incendio +incentivo +incesto +incidente +incienso +incisión +incitar +inclinado +inclinar +incluir +incrustar +inculpar +incursión +incógnito +indagar +indeciso +indefenso +india +indiana +indicador +indicar +indicio +indigente +indirecta +individuo +indochina +indoloro +indonesia +inducción +inducido +inducir +indulto +industria +indígena +inepto +inercia +inerte +infame +infamia +infancia +infante +infantil +infarto +infección +infectar +inferior +infernal +infierno +infinidad +inflación +inflar +influir +informado +informal +informar +informe +inga +ingeniero +ingenioso +ingenuo +ingerir +ingle +inglés +ingresar +ingreso +inhalador +inhalar +inherente +inhibidor +iniciado +inicial +iniciar +inicio +injerto +inmenso +inmersión +inmerso +inminente +inmundo +inmune +inmunidad +innovador +inocencia +inocente +inodoro +inquilino +inscrito +insecto +insertar +insignia +insinuar +insistir +insolente +insomnio +inspector +inspirado +inspirar +instalar +instancia +instante +instinto +instituto +instruido +insulina +insultar +insulto +intacto +integrado +integral +integrar +intelecto +intención +intensiva +intentar +intento +interesar +interino +interior +interna +intervalo +interés +intestino +intimidad +intimidar +intocable +intrusión +intruso +intrépido +intubar +intuición +inundado +inundar +invadir +invasión +invasor +invención +inventar +invento +invernal +inversa +inversor +invertido +invertir +invicto +invierno +invitado +invitar +invito +invocar +inyección +inyectar +ira +iraní +iraquí +iris +irlanda +irlandés +ironía +irritante +irrumpir +irónico +isa +isla +islámico +israelí +italiano +izquierda +jabalí +jabón +jacinto +jacuzzi +jade +jadeo +jaguar +jalar +jaleo +jamón +jane +japonés +japón +jaque +jaqueca +jarabe +jardinero +jardín +jarra +jarrón +jaula +jauría +java +jazmín +jefa +jefatura +jefe +jengibre +jeque +jerarquía +jerez +jerga +jeringa +jerónimo +jeta +jinete +jirafa +jorge +jornada +jorobado +josefina +jota +joven +jovencita +jovial +joya +joyero +juan +jubilado +judaísmo +judicial +judío +juerga +juez +jueza +jugador +jugo +jugoso +juguete +juguetón +juicio +juliana +julio +jungla +junta +juntar +jurado +juramento +jurar +juro +jurídico +justa +justicia +juvenil +juventud +juzgado +juzgar +júbilo +júnior +kan +kappa +karaoke +karma +ketchup +kilo +kilómetro +kit +káiser +laberinto +labial +labio +labor +laboral +laborista +labrador +laca +lacayo +lactosa +ladera +lado +lados +ladra +ladrar +ladrido +ladrillo +ladrón +lagartija +lagarto +lago +laguna +lama +lamentar +lamento +lamer +lana +lance +lancha +langosta +lanza +lanzadera +lanzado +lanzador +lanzar +lapso +larga +largar +laringe +larva +lasaña +lastimar +lastre +lata +latente +lateral +latido +latino +latir +latitud +latín +latón +laurel +lava +lavabo +lavadero +lavado +lavadora +lavanda +lavar +lave +laxante +lazar +lazo +leal +lealtad +lección +leche +lechero +lecho +lechuga +lechuza +lector +lectura +led +leda +leer +legado +legal +legalidad +legión +lego +legítimo +leila +lejano +lejía +lema +len +lena +lencería +lengua +lenguado +lenguaje +lenta +lente +leo +leona +leopardo +lepra +leproso +lesión +letal +letra +letrado +letrero +letrina +leucemia +levadura +levantado +levantar +levante +leve +leviatán +ley +leyenda +leído +leñador +león +liar +libanés +liberador +liberal +liberar +libertad +libertino +libia +libido +librado +librar +libre +libreta +libro +libélula +licencia +liceo +licor +licuadora +liderar +liderazgo +lidia +lidiar +liebre +lienzo +liga +ligado +ligar +ligero +lila +lima +limbo +limitado +limitar +limonada +limosna +limpia +limpiador +limpiar +limpieza +limusina +limón +lince +lindo +lineal +linfoma +lino +linterna +liquidar +lira +lirio +lis +lisa +listado +listo +listón +litera +literal +literario +litio +litro +liviano +liza +llaga +llama +llamado +llamar +llamarada +llamativo +llano +llanto +llanura +llave +llavero +llega +llegado +llegar +llenado +llenar +lleno +lleva +llevada +llevar +llorar +lloro +llorón +llover +llovido +lluvia +lluvioso +lobo +locación +local +localidad +localizar +loción +loco +locura +locutor +lodo +logia +logo +logotipo +logrado +lograr +logro +logística +lombardo +lombriz +lomo +lona +longitud +longo +loquero +loro +losa +lote +lotería +loto +lucha +luchador +luchar +lucia +lucidez +lucifer +lucir +lucrativo +lucro +lugar +luis +luisa +lujo +lujoso +lujuria +lulú +lumbar +luminoso +luna +lunar +lunático +lupa +luto +lux +luz +láctea +lágrima +lámina +lámpara +lápida +lápiz +láser +lástima +látigo +lázaro +líder +límite +línea +lío +líquido +lóbulo +lógica +lúcido +lúgubre +macabro +macedonia +maceta +machacado +machacar +machete +machista +macho +machote +macizo +madama +madera +madrastra +madre +madrina +madrugada +madrugar +madura +madurar +madurez +maese +maestre +maestro +maestría +mafia +mafioso +magdalena +magia +magistral +magma +magna +magnate +magnesio +magneto +magnitud +magnolia +magnética +magnífico +mago +magos +majestad +majo +mala +malaria +malasia +malcriado +maldad +maldecir +maldición +maldita +malestar +maleta +maletero +maletín +maleza +malgastar +malicia +malicioso +maligno +malla +malnacido +malo +malta +maltrato +malvado +mamar +mambo +mamá +mamífero +mamón +man +manada +manantial +mancha +manchado +manchar +manco +mandado +mandar +mandarín +mandato +mando +mandíbula +manejable +manejar +manejo +manera +manga +mangosta +manguera +manicomio +manicura +manija +maniobra +maniobrar +manipular +maniquí +manivela +maniático +manjar +mano +manojo +mansión +manta +manteca +mantel +mantener +mantenida +manual +manuela +manzana +maníaco +mapa +mapache +maqueta +mar +maratón +maravilla +marca +marcación +marcado +marcador +marcar +marcha +marchar +marchita +marcia +marcial +marciano +marea +mareado +marfil +marga +margarita +margen +marginado +marginal +mari +mariana +marido +marihuana +marimacho +marina +marinero +marioneta +mariposa +mariquita +mariscal +marisco +marmota +marqués +marrón +marta +marte +martillo +martina +martirio +martín +maría +marítimo +masa +masacrar +masaje +masajista +mascar +mascota +masculino +masiva +masticar +mata +matadero +matador +matanza +mate +materia +material +materna +maternal +matinal +matriz +matrona +matrícula +matutino +matón +maura +mausoleo +maximizar +mayo +mayonesa +mayor +mayordomo +mayoría +mayúscula +mazmorra +mazo +maíz +mea +meado +meca +mecanismo +mecedora +mecha +mechero +mechón +mecánico +medalla +medallón +media +mediación +mediador +mediana +medicina +medicinal +medición +medida +medidor +medieval +medina +mediocre +mediodía +medir +meditar +medusa +mega +megáfono +mejicano +mejilla +mejora +mejorar +mejoría +melaza +melena +mella +melocotón +melodrama +melodía +melón +membrana +membresía +memo +memorable +memoria +memorial +memorizar +mencionar +mención +mendigar +mendigo +menor +mensaje +mensajero +mensual +mental +mente +mentido +mentir +mentira +mentiroso +mentor +mentón +menuda +menú +mera +mercader +mercado +mercados +mercancía +mercante +merced +merecedor +merecer +merecido +merengue +merienda +merlín +mermelada +merodear +mesa +mesero +meses +meseta +mesilla +mesita +mestizo +meta +metal +metano +meteorito +meteoro +meter +metido +metraje +metralla +metro +metáfora +metálico +mexicano +mezcla +mezclado +mezclar +mezquino +mezquita +meñique +mica +micro +microchip +micrófono +miedo +miedoso +miel +miembro +miente +migración +migraña +mijo +mil +milagro +milagroso +milano +milena +milenio +mili +milicia +militante +militar +milla +millar +millón +milán +milímetro +mimado +mimo +mimosa +mina +minado +mineral +minero +minerva +mingo +miniatura +minimizar +ministro +minoría +minucioso +minuto +minúsculo +miope +mir +mira +mirada +mirador +miranda +mirar +mirza +mirón +misa +miserable +miseria +misil +misionero +misión +mismo +mismísimo +misterio +mitad +mitin +mito +mitología +mixta +miércoles +mochila +moción +moco +mocoso +modelaje +modelar +modelo +moderado +moderna +modestia +modesto +modificar +modista +modo +mofeta +moho +mojado +mojar +moje +mojigata +mojo +mola +molde +moldear +molecular +moler +molesta +molestar +molestia +molido +molinero +molino +molinos +molécula +momentito +momento +momia +momo +monada +monarca +monarquía +mondo +moneda +monedero +monetario +mongol +monitor +monja +monje +mono +monogamia +monopatín +monopolio +monotonía +monseñor +monstruo +monta +montado +montar +montaña +monte +monterrey +montes +montura +montículo +montón +monumento +monzón +monólogo +monótono +monóxido +moqueta +mora +morada +moral +moraleja +moralidad +moralista +morboso +mordaza +mordedura +morder +mordido +mordisco +moreno +moretón +morfina +morgue +moribundo +morir +mormón +morsa +mortadela +mortal +mortero +mosaico +mosca +moscada +mosquete +mosquito +mostaza +mostrador +mostrar +mote +motel +motivar +motivo +moto +motor +motorista +motín +mover +movido +movilidad +movilizar +moya +mozo +mucha +muchacho +muchísimo +mudanza +mudar +mudo +mueble +muebles +mueca +muela +muelle +muera +muerta +muestra +mugre +mugriento +muir +mujer +mujercita +mujeriego +mula +muleta +multa +multitud +mundano +mundial +mundo +mundos +municipal +municipio +munición +mural +muralla +murmullo +murmurar +muro +musa +muscular +musculoso +museo +musgo +musical +muslo +musulmán +mutación +mutante +mutilado +mutuo +muérdago +muñeca +mágico +máquina +mármol +mártir +máscara +máster +mástil +máximo +médico +médula +mérito +método +mímica +mínimo +mío +mísero +místico +mítico +módulo +móvil +múltiple +músculo +música +nabo +nacer +nacho +nacido +nacional +nación +nadador +nadar +nafta +nalga +nana +nao +napa +napoleón +naranja +narciso +nariz +narración +narrador +narrativa +nasa +nasal +nata +natación +natal +natalidad +nativo +natural +naufragio +navaja +naval +navarro +nave +navegador +navegante +navegar +navidad +navideño +navío +nazareno +neblina +nebulosa +necesaria +necesidad +necesitar +necio +nefasto +negación +negado +negar +negativo +negociado +negociar +negocio +negra +negrito +nena +neo +nervio +nervioso +nerón +neto +neumonía +neumático +neural +neuronal +neurólogo +neurótico +neutral +neutro +nevada +nevar +nevera +newton +nexo +neón +nicaragua +nicho +nicotina +nido +niebla +niego +nieto +nieve +ninfa +ninja +nirvana +nitrato +nitro +nivel +niñato +niñera +niño +nobel +noble +nobleza +noche +noción +nocturno +nodo +nodriza +nombrado +nombrar +nombre +nominar +nona +noquear +nordeste +noria +norma +normal +noruega +nostalgia +nota +notable +notar +notario +noticia +noticiero +notificar +notorio +novato +novedad +novedoso +novela +novelista +noveno +noventa +novia +noviazgo +nube +nubla +nublado +nuca +nuclear +nudo +nudos +nuera +nuestro +nueve +nuevo +nuez +nulo +nupcial +nutria +nutrición +néctar +nómada +nómina +núcleo +número +obedecer +obediente +obesidad +obeso +obispo +obituario +objeción +objetar +objetivo +objeto +obligado +obligar +oboe +obra +obrar +obrero +obsceno +obsequio +observar +obsesivo +obsesión +obsoleto +obstante +obstetra +obstinado +obstruir +obstáculo +obtener +obvio +ocasional +ocasión +ocaso +occidente +ochenta +ocho +ocio +octavo +ocular +oculta +ocultar +ocupación +ocupada +ocupar +ocurrido +ocurrir +océano +oda +odiar +odio +odioso +odisea +ofender +ofendido +ofensa +ofensiva +oferta +oficial +oficina +oficio +ofrecer +ofrenda +ogro +ojete +ojiva +ojo +ola +oleada +oleaje +oleoducto +oler +olfato +oliva +olla +olmo +olor +olvidado +olvidar +olvido +olímpico +ombligo +omega +omisión +omiso +omitir +once +onda +onza +opcional +opción +operación +operadora +operar +operativo +opinar +opinión +opio +oponente +oportuno +oposición +opresión +optar +optimismo +optimista +opuesto +oración +orador +oral +orangután +orar +orbe +orbital +ordenado +ordenador +ordenando +ordenanza +ordenar +ordinario +oreja +orfanato +organismo +organizar +orgullo +orgulloso +orgánico +orgía +oriental +oriente +orificio +origen +original +orilla +orina +orinal +orinar +oro +orquesta +orquídea +ortega +orto +ortodoxo +oruga +oráculo +osado +osadía +oscurecer +oscuridad +oscuro +oso +ostentoso +ostia +ostra +otorgar +otoño +otra +ovación +oval +oveja +ovni +oxígeno +oyente +ozono +oído +oír +pabellón +paciencia +paciente +pacifista +pacotilla +pacto +pacífico +padrastro +padre +padrino +paella +paga +pagado +pagano +pagar +pagaré +paisaje +paisano +pajar +pajarito +palabra +palacio +paladar +palanca +palco +palestina +paleta +paliza +palma +palmada +palmera +palo +paloma +palomar +palomita +palurdo +pamela +pan +panadero +panadería +pancarta +panceta +pancho +panda +panecillo +panel +panes +panfleto +panorama +pantalla +pantalón +pantano +pantera +panteón +pantomima +panza +papal +papaya +papel +papeleo +papelera +papá +paquete +parada +paradero +paradigma +paradoja +paralelo +paralizar +paranoia +paranoico +parar +paraíso +parca +parcela +parche +parcial +pardo +parecer +parecido +pared +paredón +pareja +paria +pariente +parir +parisino +parlante +parlotear +parloteo +parmesano +paro +parodia +parpadear +parpadeo +parque +parranda +parroquia +partera +partido +partir +partitura +parto +partícula +parásito +pasa +pasadizo +pasado +pasador +pasajero +pasante +pasantía +pasaporte +pasar +pasarela +pascal +pascua +pascual +pase +pasear +paseo +pasillo +pasional +pasivo +pasión +pasma +pasmado +pasta +pastel +pastelero +pastor +pata +patada +patata +patear +patente +paterna +paternal +patinador +patinaje +patinar +patio +patología +patria +patriarca +patricia +patriota +patrullar +patrón +patán +paté +patético +patíbulo +patógeno +pausa +pauta +pavimento +pavo +pavor +payaso +paz +pañal +paño +pañuelo +peaje +pecado +pecador +pecar +pecera +pecho +pechuga +peculiar +pedal +pedante +pedazo +pedestal +pediatra +pediatría +pedicura +pedido +pedir +pedro +pega +pegadizo +pegado +pegajoso +pegamento +pegar +pegatina +peinado +peinar +peine +pelado +pelar +peldaño +pelea +peleador +pelear +pelele +peligro +peligroso +pelirroja +pellejo +pellizco +pelmazo +pelo +pelos +pelota +pelotón +peluca +peluche +peludo +peluquero +pelusa +pelícano +película +pena +penal +pendiente +penetrar +penique +penoso +pensado +pensador +pensar +pensativo +pensión +pentágono +penumbra +península +pepe +pepino +pepita +pequeñito +pequeño +pequeñín +pera +percance +percha +perchero +percibir +percusión +perdedor +perder +perdición +perdido +perdiz +perdonar +perdón +peregrino +perejil +pereza +perezoso +perfecto +perfil +perforar +perfume +pergamino +peri +pericia +perico +periferia +perito +periódico +perjuicio +perjurio +perla +permiso +permitir +perno +perpetuo +perplejo +perrera +perrito +perro +persa +perseguir +persiana +persona +personaje +personal +perspicaz +persuadir +perturbar +perverso +perímetro +período +pesado +pesar +pesca +pescado +pescador +pescar +pescuezo +pesebre +pesimista +peso +pesquero +pestañear +peste +pestillo +petaca +petardo +petición +petrolera +petróleo +petulante +pez +pezón +peón +piadoso +pianista +picadillo +picado +picadura +picante +picaporte +picar +picazón +pichón +pico +picor +piedad +piedra +piel +pienso +pierde +pierna +pieza +pijama +pijo +pila +pilar +pileta +pillar +pillo +pilotar +pilotear +piloto +pimienta +pin +pincel +pincha +pinchar +pinchazo +pingüino +pino +pinocho +pinta +pintado +pintar +pintor +pintura +pinza +pionero +pipí +pique +piquete +pirata +piratear +piratería +piro +pirámide +pisada +pisar +piscina +piso +pisotear +pista +pistacho +pistola +pistolero +pitido +pitón +pizarra +pizca +pizza +pizzería +piñata +placa +placebo +placenta +placer +plaga +plagado +plan +plancha +planchar +planear +planeta +planilla +plano +planta +plantado +plantar +plantear +plantilla +plasma +plateado +platicar +platino +plato +platónico +plausible +playa +playera +plaza +plebeyo +plegaria +pleito +plena +plenitud +pliegue +plomero +plomo +pluma +plural +plutonio +plástico +plátano +plática +población +poblado +pobre +pobreza +poca +pocilga +poción +podar +poderoso +poderío +podio +podre +poema +poesía +poeta +polaco +polar +polaridad +policial +policía +policíaca +polilla +polio +polizón +poliéster +pollas +pollito +pollo +polo +polución +polvo +polémica +polígrafo +política +pomada +pomelo +pomo +pompa +pomposo +ponche +poncho +poner +poni +pop +popa +popular +poquito +porcelana +porche +porción +porqué +porro +porta +portada +portador +portal +portar +portavoz +portazo +porte +portero +portería +portugués +portátil +portón +porvenir +pos +posa +posada +posadero +posar +poseer +posesivo +posesión +poseído +posgrado +posible +posición +positivo +posponer +pospuesto +posta +postal +poste +posterior +postgrado +postiza +postor +postre +postura +potable +potasio +pote +potencia +potencial +potente +potro +pozo +poético +practicar +pradera +prado +preciado +precinto +precio +preciosa +precisar +precisión +preciso +precoz +predecir +predicar +predicho +prefecto +pregunta +preguntar +prematuro +premio +premisa +prenda +prender +prendido +prensa +preocupar +preparar +presa +presagio +presentar +presente +preservar +presionar +presión +presta +prestar +preste +prestigio +presumido +presumir +presunto +pretender +prevenido +prevenir +prever +previo +previsto +preñada +prima +primaria +primavera +primer +primicia +primitivo +princesa +principal +principio +prior +prioridad +prisa +prisión +privación +privada +privar +proa +probable +probado +probar +problema +proceder +procesado +procesar +proceso +proclama +procrear +procura +procurar +prodigio +producir +producto +productor +proeza +profe +profecía +profesión +profesor +profeta +programa +programar +progresar +progreso +prohibido +prohibir +prolongar +promedio +prometer +prometido +promover +pronta +propagar +propenso +propia +propicio +propiedad +proponer +propuesta +propulsor +propósito +prosa +proseguir +prosperar +protector +proteger +protegido +protestar +proteína +protocolo +prototipo +provecho +proveedor +proveer +provenir +proverbio +provincia +provisto +provocar +proxeneta +proyectar +proyectil +proyecto +proyector +prudencia +prudente +prueba +práctica +préstamo +príncipe +pródigo +prófugo +prójimo +prólogo +prórroga +próspero +próstata +próxima +psicólogo +psicópata +psicótico +psique +psíquico +pubertad +publicar +pudor +pueblo +puente +puerco +puerta +puesto +puja +pujar +pulga +pulgada +pulgar +pulido +pulir +pulmonar +pulmonía +pulmón +pulpo +pulsar +pulsera +pulso +puma +punción +punk +punto +puntual +punzante +pupila +pura +pureza +purga +purgar +purpurina +puré +putada +puzle +puñado +puñal +puñalada +puñetera +puño +página +pájaro +pálido +pánico +páramo +párrafo +párroco +péndulo +pésame +pésimo +pícaro +píldora +póliza +pólvora +póquer +pórtico +póster +púa +púbico +público +púlpito +púrpura +quebrado +quebrar +queda +quedar +queja +quejar +quema +quemado +quemadura +quemar +querer +querida +queroseno +queso +quicio +quiebra +quiebre +quien +quieto +quietud +quijada +quijote +quimera +quimio +quince +quinto +quiosco +quirófano +quiste +quita +quitar +química +rabia +rabieta +rabino +rabioso +rabo +racha +racial +racimo +racional +racismo +racista +ración +radar +radiación +radiador +radial +radiante +radical +radio +rafa +rafe +rain +raja +rajar +rallo +rama +ramillete +rampa +ramón +rana +ranas +ranchero +rancho +rancio +rango +ranura +rap +rapero +rapidez +raptar +rapto +raptor +raqueta +rareza +raro +rascar +rasgado +rasgar +rasgo +rasguño +raso +rastrear +rastreo +rastrero +rastrillo +rastro +ratas +ratero +ratito +rato +ratonera +ratón +rayado +rayo +raza +razonable +razonar +razón +raíz +reabrir +reacio +real +realeza +realidad +realismo +realista +realizar +reanudar +rebajar +rebanada +rebeca +rebelde +rebeldía +rebelión +rebosante +rebotar +recado +recambio +recargar +recaudar +recaída +recepción +receptor +recesión +receso +receta +rechazar +rechazo +recibido +recibidor +recibir +recibo +recibí +reciclaje +reciclar +reciente +recital +recitar +reclamar +reclamo +reclusión +recluso +recluta +reclutar +recobrar +recoger +recogido +reconocer +recopilar +recordar +recorrer +recorrido +recortado +recortar +recrear +recreo +rectal +rectitud +recto +rector +recuento +recuerdo +recuperar +recurrir +red +redacción +redactar +redactor +redada +rededor +redención +redentor +redil +redoble +redonda +reducción +reducido +reducir +reemplazo +referente +refinado +refinería +reflector +reflejar +reflejo +reflexión +reformado +reformar +reforzar +refrescar +refresco +refrán +refuerzo +refugiado +refugio +refutar +regadera +regalado +regalar +regaliz +regalo +regar +regatear +regazo +regente +regional +registrar +registro +región +regla +regocijo +regordete +regresar +regresiva +regresión +regreso +regulador +rehén +reina +reinado +reinar +reiniciar +reja +relación +relajada +relajante +relajar +relativo +relato +relevante +relevo +relicario +religiosa +religión +relincho +reliquia +relleno +reloj +relojero +relucir +relámpago +remar +remate +remediar +remedio +remera +remitente +remo +remolacha +remolino +remolque +remoto +remover +renacer +renacuajo +renal +rencor +rendición +rendido +rendir +rene +renegado +reno +renovar +renta +rentar +renuncia +renunciar +reo +reparar +reparo +repartir +repelente +repentino +repetir +repleto +replicar +reponer +reportaje +reportar +reposar +repostar +reprimir +reprobar +reproche +reptil +repuesto +repulsivo +requerir +requisito +resaltar +resbalar +resbaloso +rescatar +rescate +reserva +reservado +reservar +resfriado +resguardo +residente +residual +residuo +resina +resistir +resolver +resorte +respaldar +respaldo +respecto +respetar +respeto +respirar +respiro +responder +respuesta +restante +restaurar +resto +resucitar +resuelto +resuelve +resulta +resultado +resultar +resumen +resumir +retar +retención +retener +retirado +retirar +reto +retomar +retorcido +retornar +retrasada +retrasar +retraso +retrato +retrete +retroceso +retórica +reunir +revancha +revelador +revelar +reventar +reverendo +reversa +revertir +revisar +revisor +revista +revivir +revocar +revolcón +revuelta +revés +revólver +rey +rezado +rezar +rezo +reír +reñido +riachuelo +ribera +rico +ridiculez +ridículo +riego +rienda +riesgo +rifa +rifle +rigidez +rigor +riguroso +rima +rincón +riqueza +riquísimo +risa +ritmo +rito +ritual +rival +rivalidad +rivera +rizado +riña +riñón +robado +robar +roble +robo +robot +robusto +robótica +roca +roce +rociar +rocío +rodado +rodaje +rodante +rodar +rodea +rodear +rodillo +roedor +roer +rogar +rojizo +rojo +rol +rollo +roma +romance +romano +romeo +romero +romper +romántico +ron +ronca +roncar +ronda +ropa +ropero +roque +rosa +rosado +rosario +rosca +rostro +rotación +roto +rotonda +rotundo +rotura +rouge +roza +rubia +rubor +rubí +rudo +rueda +ruego +rufián +rugido +rugir +ruibarbo +ruido +ruidoso +ruin +ruina +ruiseñor +ruleta +rumano +rumbo +rumor +ruptura +rural +ruso +ruta +rutina +rutinario +rábano +ráfaga +rápida +réplica +rígido +río +rústico +sabandija +saber +sabia +sabido +sabiduría +sabina +sable +sabor +saborear +sabotaje +sabotear +sabre +sabroso +sabueso +sabático +saca +sacada +sacar +sacerdote +saciar +sacudida +sacudir +safari +saga +sagitario +sagrado +sala +salada +salami +salario +salchicha +saldar +saldo +salga +salida +saliente +salina +salio +salir +saliva +salmo +salmón +salomón +salsa +saltado +saltador +saltar +salto +salud +saluda +saludar +salva +salvación +salvado +salvador +salvar +salvia +salón +samurái +san +sanación +sanador +sanar +sanatorio +sancho +sanción +sandía +sangrar +sangre +sangría +sanguínea +sanidad +sanitario +sano +sansón +santiago +santiamén +santidad +santo +santuario +santísima +sao +sapo +saque +saquear +saqueo +sarampión +sarcasmo +sarcófago +sardina +sargento +sarta +sartén +sastre +sato +saturno +satánico +satélite +satén +sauce +saudita +sauna +savia +saxo +saxofón +secado +secadora +secar +sección +seco +secreta +secta +sector +secuaz +secuela +secuencia +secuestro +sed +sedal +sedante +sediento +seducción +seducir +seductor +sedán +segmento +seguida +seguidor +seguir +segundo +segura +seguridad +seis +selección +selectiva +selecto +sellado +sellar +sello +selva +semana +semanal +semblante +sembrado +sembrar +semejante +semejanza +semental +semestre +semilla +seminario +semáforo +semántica +senado +senador +sencillez +sencillo +senda +sendero +senil +senior +seno +sensación +sensatez +sensato +sensible +sensor +sensorial +sensual +sentado +sentar +sentencia +sentido +sentir +seo +separado +separar +sepulcro +sepultura +sequía +sera +serbia +serena +serenata +serenidad +seres +serial +serie +seriedad +serio +sermón +serpiente +serrano +servicial +servicio +servidor +servir +sesenta +sesión +set +setenta +setiembre +seto +seudónimo +severidad +severo +sexista +sexto +señal +señalado +señalar +señor +señorita +señoría +señuelo +sheriff +show +sicario +siciliano +sida +sidra +siembra +sien +siena +sierra +siervo +siesta +siete +sigilo +sigiloso +siglo +sigma +signo +siguiente +sil +silba +silbar +silbato +silbido +silenciar +silencio +silicio +silicona +silla +sillón +silo +silueta +silva +silvestre +simbionte +simbólico +simetría +similar +similitud +simio +simpatía +simple +simposio +simpática +simulacro +simulador +simular +simón +sinagoga +sincero +sincro +sindical +sindicato +sinfonía +sinfónica +singular +siniestro +sintonía +sintético +sinónimo +siquiatra +sirena +siria +siro +sirope +sirvienta +sirviente +sis +sistema +sistólica +sita +sitio +situación +situado +situar +soberano +soberanía +soberbia +sobornado +sobornar +soborno +sobra +sobriedad +sobrino +sobrio +sociable +social +sociedad +socio +socorro +soda +sodio +sodomía +sofocante +soga +soja +sola +solano +solapa +solar +soldado +soldador +soledad +solemne +solicitar +solicitud +solista +solitario +solsticio +soltar +soltero +solución +sombra +sombrero +sombrío +someter +somnífero +somo +sonado +sonar +sonata +sonda +sondeo +sonido +sonora +sonreír +sonriente +sonrisa +sonámbulo +sopa +soplar +soplete +soplo +soplón +soportar +soporte +soprano +sor +sorbete +sorbo +sordo +sorpresa +sorteo +sortija +sosa +sospecha +sospechar +sostener +sostenido +soto +soviética +soñador +sport +sra +sta +suavidad +suavizar +subasta +subir +subjefe +sublime +submarino +subsidio +suburbio +succión +suceder +sucedido +sucesión +suceso +sucesor +sucia +suciedad +sucumbir +sucursal +sudadera +sudar +sudeste +sudoeste +sudor +sudoroso +sueco +suegra +sueldo +suelta +suero +suerte +sueño +sufra +sufrido +sufrir +sugerir +sugestión +suicidar +suite +suiza +sujetador +sujetar +sujeto +sulfato +sulfuro +sulfúrico +sultán +suma +sumar +sumario +sumergido +sumisión +sumiso +superar +superior +suplente +suplicar +suponer +supremo +supresión +suprimir +supuesto +sureste +sureño +surfista +surgir +suroeste +surtido +susana +suspender +suspense +suspenso +suspirar +suspiro +sustancia +sustento +sustituir +sustituto +susto +susurrar +susurro +sutil +sutileza +sutura +suyo +suéter +sábado +sábana +sádico +sándwich +sátira +sémola +séptimo +séquito +sésamo +símbolo +síndrome +síntoma +sólido +sónico +sórdido +sótano +súbdito +súbita +súplica +tabaco +taberna +tabique +tabla +tablero +tableta +tablón +taburete +tabú +tacaño +tachar +tacho +taco +tacto +tacón +tailandés +tajada +tajo +tala +taladro +talco +talento +talentoso +talibán +talismán +talla +tallado +tallar +talle +taller +talonario +talón +tamaño +tambor +tamil +tampón +tanda +tangible +tango +tanque +tanta +tao +tapa +tapadera +tapado +tapar +tapete +tapicería +tapioca +tapiz +tapón +tara +tarda +tardanza +tardar +tardía +tarea +tarifa +tarjeta +tarro +tarta +tasa +tata +tatuaje +tau +taxi +taxista +taza +tazón +tea +teatral +teatro +techo +tecla +teclado +tedioso +tejado +tejano +tejer +tejido +tejón +telaraña +telas +tele +telefonía +telegrama +telepatía +televisor +teléfono +telégrafo +telón +tema +temblar +temblor +temer +temerario +temeroso +temor +tempestad +templado +templar +temple +templo +tempo +temporada +temporal +temprana +temática +tenacidad +tenaz +tendencia +tender +tendero +tendido +tendón +tenebroso +tenedor +tener +tenia +teniente +tenor +tensión +tenso +tentación +tentado +tentador +tentar +tentativa +tentempié +tenue +teología +teorema +teoría +tequila +terapeuta +terapia +tercera +tercero +tercio +terco +teresa +terminal +terminar +termo +ternera +ternura +terraza +terremoto +terrenal +terreno +terrestre +terrible +terror +terrícola +terrón +tesla +tesorero +tesorería +tesoro +testarudo +testigo +testículo +tetera +textil +texto +textura +teñido +teórico +tiara +tiberio +tibia +tiburón +tic +tiemblo +tiempo +tienda +tienta +tierno +tierra +tifoidea +tifón +tigre +tigresa +tijera +timador +timbre +timidez +timo +timonel +timón +tina +tinta +tinte +tipo +tirado +tirador +tirano +tiranía +tirar +tiro +tiroteo +tirón +titanio +tito +titulado +titular +titán +tiza +toalla +tobillera +tobillo +tobogán +toca +tocado +tocador +tocar +tocino +toda +toga +toldo +tolerante +tolerar +toma +tomado +tomar +tomate +ton +tonelada +tono +tonos +tontear +tontería +tonto +tope +topo +toque +torcer +torcido +torero +tormenta +torneo +tornillo +torno +toro +torpe +torpedo +torpeza +torre +torrente +torso +torta +tortas +tortuga +tortura +torturar +torácica +tosca +toscana +tose +toser +tostada +tostadora +totalidad +toxina +traba +trabado +trabajado +trabajar +trabajo +tracción +tracto +tractor +tradición +traducir +traductor +traficar +tragar +tragedia +trago +traición +traidor +traje +trama +trampa +trampolín +tramposo +trance +tranquilo +tranvía +trapecio +trapo +trasero +trasladar +traslado +traspasar +traspaso +traste +trastero +trasto +trastorno +trata +tratado +tratar +trauma +travesti +travesura +travesía +travieso +través +trayecto +traza +trazado +trazar +traído +trece +trecho +tregua +treinta +tremendo +tren +trenza +trepa +trepar +treta +tribal +tribu +tribuna +tribunal +tributo +triciclo +tridente +trigo +trilogía +trimestre +trina +trinchera +trineo +trinidad +tripa +triple +tris +triste +tristeza +tritón +triunfal +triunfar +triunfo +trivial +triángulo +trocito +trofeo +trol +trombón +trompa +trompeta +tronco +trono +tropa +tropezar +tropical +tropiezo +trotar +trote +trovador +trozo +trucha +truco +true +trueno +trueque +tráfico +trágico +tráiler +trámite +tránsito +tráquea +trébol +tríada +trío +trípode +trópico +tsunami +tubería +tubo +tuerca +tuerto +tugurio +tumba +tumbado +tumbar +tumor +tumulto +tundra +turbante +turbina +turbio +turbo +turco +turismo +turista +turno +turquesa +turístico +tutela +tutor +tutoría +tuyo +táctica +tártaro +técnica +térmica +término +tímido +tío +típico +títere +título +tónica +tópico +tóxico +túnel +túnica +ubicación +ubicar +ucrania +ucraniano +ultraje +umbilical +umbral +ungüento +unicornio +unidad +uniforme +unir +universal +universo +unión +unánime +urbana +urgencia +urgente +urinario +urna +urticaria +usado +usanza +usar +uso +usos +usted +usual +usuario +usurero +utilidad +utilizar +utopía +uña +vaca +vacante +vaciado +vaciar +vacilar +vacuna +vacío +vagabundo +vagar +vaginal +vago +vagón +vaina +vainilla +vajilla +val +valencia +valentina +valentía +valer +valeroso +validez +valiente +valija +valioso +valla +valle +valor +valorar +vals +valía +vampiro +vanidad +vanidoso +vano +vapor +vaquero +vara +variable +variación +variante +variar +varicela +variedad +varita +varonil +varón +vasco +vascular +vaselina +vasija +vaso +vasto +vaticano +vecindad +vecino +vector +veda +vega +vegano +vegetal +vehículo +veinte +vejez +vejiga +vela +velada +velar +velatorio +velcro +velero +vello +velocidad +velorio +veloz +vena +venado +vencedor +vencer +vencida +vendedor +vender +vendo +vendí +veneno +venenosa +vengador +venganza +vengar +vengativo +venia +venida +venir +venta +ventaja +ventana +ventilar +ventisca +ventura +ver +vera +verano +verbal +verbena +verbo +verdad +verdadero +verde +verdugo +verdura +vereda +veredicto +vergüenza +verificar +verja +verme +verruga +versión +verso +versículo +vertebral +vertedero +verter +vertical +verónica +vestido +vestidor +vestir +vestuario +vestíbulo +vesícula +veterano +veto +vez +viable +viajante +viajar +viaje +viajero +vial +vibración +vibrador +vibrante +vibrar +vicario +vicio +vicioso +victoria +vida +vidente +video +vidriera +vidrio +viejo +viento +vientre +viernes +viga +vigente +vigilante +vigilar +vigilia +vigor +vigoroso +vikingo +vil +villa +villano +vinagre +vincular +vinilo +vino +viola +violada +violencia +violento +violeta +violín +vira +viral +virar +virginia +virgo +viril +virilidad +virrey +virtual +virtud +virtuoso +viruela +visible +visir +visita +visitante +visitar +visión +visor +visto +visual +vital +vitalidad +vitamina +vitrina +viuda +vivaz +vivero +vivido +vivienda +viviente +vivir +vivo +vizconde +viñedo +vocación +vocal +vocalista +vocero +vodka +voila +volador +volante +volar +volcar +volcán +volcánica +voleibol +voltaje +voltear +voltereta +volumen +voluntad +volver +volvo +volátil +vomitar +voraz +votación +votar +voto +voz +vudú +vuelco +vuelo +vuelta +vuestra +válido +válvula +vándalo +váter +vértebra +vértigo +víbora +víctima +vínculo +víspera +vómito +vórtice +watt +weber +wifi +yak +yanqui +yarda +yate +yegua +yema +yen +yerba +yerno +yeso +yodo +yogur +yugo +yugular +zafar +zafiro +zanahoria +zanja +zapatero +zapato +zar +zarigüeya +zarpa +zarpar +zeta +zodiaco +zombi +zona +zoo +zoológico +zoquete +zorro +zumba +zumbido +zumo +zurdo +ácido +áfrica +ágil +águila +álamo +álgebra +ámbar +ámbito +ángel +ángulo +ánimo +ápice +árabe +árbitro +árbol +área +ártico +áspero +ático +átomo +élite +épico +época +éter +ética +étnica +éxito +éxodo +ídolo +índice +índole +íntegro +íntimo +óleo +ómnibus +ópera +óptica +óptimo +órbita +órgano +ósea +óvulo +óxido +úlcera +última +único +útero +útil diff --git a/wordkey/wordkey.go b/wordkey/wordkey.go index ead24a9..5a74808 100644 --- a/wordkey/wordkey.go +++ b/wordkey/wordkey.go @@ -60,15 +60,8 @@ func Normalize(text string) []string { func Check(words []string) error { counted := make(map[string]bool) for _, w := range words { - for _, r := range w { - switch { - case unicode.IsControl(r): - return fmt.Errorf("wordkey: the words hold the control character U+%04X", r) - case pathrule.DefaultIgnorable(r): - return fmt.Errorf("wordkey: the words hold the invisible character U+%04X", r) - case !pathrule.Assigned(r): - return fmt.Errorf("wordkey: the words hold U+%04X, unassigned in Unicode %s", r, pathrule.UnicodeVersion) - } + if err := checkRunes(w); err != nil { + return err } if utf8.RuneCountInString(w) >= MinLetters { counted[w] = true @@ -80,6 +73,22 @@ func Check(words []string) error { return nil } +// checkRunes reports a control, a Default_Ignorable_Code_Point or a code +// point unassigned in Unicode 18.0.0 in w. +func checkRunes(w string) error { + for _, r := range w { + switch { + case unicode.IsControl(r): + return fmt.Errorf("wordkey: the words hold the control character U+%04X", r) + case pathrule.DefaultIgnorable(r): + return fmt.Errorf("wordkey: the words hold the invisible character U+%04X", r) + case !pathrule.Assigned(r): + return fmt.Errorf("wordkey: the words hold U+%04X, unassigned in Unicode %s", r, pathrule.UnicodeVersion) + } + } + return nil +} + // Key returns the raw X25519 identity of words for the capsule capsuleID, of // the round of the chain whose hash is chainHash. The caller clears it. func Key(words []string, chainHash []byte, round uint64, capsuleID []byte) ([]byte, error) {