Skip to content

Mnemonic Generation

The MnemonicGenerator creates BIP39-compliant mnemonic phrases for cryptocurrency wallets and secure key derivation.

use Cline\Keyphrase\Generators\MnemonicGenerator;
// Using static factory method
$mnemonic = MnemonicGenerator::create()->generate();
// Using constructor
$generator = new MnemonicGenerator();
$mnemonic = $generator->generate();

BIP39 specifies valid word counts that correspond to specific entropy levels:

WordsEntropy BitsChecksum BitsTotal Bits
121284132
151605165
181926198
212247231
242568264
// Default is 12 words (128 bits entropy)
$mnemonic = MnemonicGenerator::create()->generate();
// 24 words for maximum security (256 bits entropy)
$mnemonic = MnemonicGenerator::create()
->words(24)
->generate();

Invalid word counts will throw an InvalidWordCountException:

// Throws InvalidWordCountException
$mnemonic = MnemonicGenerator::create()->words(10)->generate();

BIP39 defines wordlists for 9 languages:

$mnemonic = MnemonicGenerator::create()
->english()
->generate();
$mnemonic = MnemonicGenerator::create()
->spanish()
->generate();
$mnemonic = MnemonicGenerator::create()
->french()
->generate();
$mnemonic = MnemonicGenerator::create()
->italian()
->generate();

Japanese uses ideographic space (U+3000) as the separator:

$mnemonic = MnemonicGenerator::create()
->japanese()
->generate();
// Words separated by ideographic space: "\u{3000}"
$mnemonic = MnemonicGenerator::create()
->korean()
->generate();
$mnemonic = MnemonicGenerator::create()
->czech()
->generate();
$mnemonic = MnemonicGenerator::create()
->chineseSimplified()
->generate();
$mnemonic = MnemonicGenerator::create()
->chineseTraditional()
->generate();
use Cline\Keyphrase\Enums\BIP39Language;
$mnemonic = MnemonicGenerator::create()
->useLanguage(BIP39Language::Spanish)
->generate();

Override the default separator (space for most languages):

$mnemonic = MnemonicGenerator::create()
->separator('-')
->generate();
// Example: "abandon-ability-able-about-above-absent-absorb-abstract-absurd-abuse-access-accident"
$generator = MnemonicGenerator::create()->words(12);
$entropy = $generator->entropy();
// Returns: 132.0 (128 bits + 4 checksum bits)
$generator = MnemonicGenerator::create()->words(12);
$bits = $generator->entropyBits();
// Returns: 128
$mnemonics = MnemonicGenerator::create()
->words(12)
->english()
->generateMany(5);
// Returns array of 5 unique mnemonics
$generator = MnemonicGenerator::create()
->words(24)
->spanish();
$wordCount = $generator->getWordCount();
// Returns: 24
$language = $generator->getLanguage();
// Returns: BIP39Language::Spanish
use Cline\Keyphrase\Generators\MnemonicGenerator;
use Cline\Keyphrase\Enums\BIP39Language;
// Create a mnemonic generator for a cryptocurrency wallet
$generator = MnemonicGenerator::create()
->words(24)
->english();
// Generate the recovery phrase
$mnemonic = $generator->generate();
// Check entropy
$entropy = $generator->entropy();
echo "Mnemonic entropy: {$entropy} bits";
// Verify word count
$words = explode(' ', $mnemonic);
echo "Word count: " . count($words);
// Generate for different language
$spanishMnemonic = $generator
->useLanguage(BIP39Language::Spanish)
->generate();

All generated mnemonics are fully BIP39 compliant:

  1. Wordlist: Uses official BIP39 wordlists (2048 words each)
  2. Entropy: Cryptographically secure random entropy
  3. Checksum: Proper SHA-256 checksum appended
  4. Validation: Word counts match BIP39 specification

Each BIP39 wordlist has these properties:

  • Exactly 2048 words
  • Words are sorted for binary search
  • First 4 characters uniquely identify each word
  • No word is a prefix of another word
Use CaseWordsEntropy
Standard wallet12128 bits
High-value wallet24256 bits
Cold storage24256 bits
Hardware wallet24256 bits

For maximum security:

  • Always use 24 words for significant cryptocurrency holdings
  • Store the mnemonic securely (metal backup, safety deposit box)
  • Never store digitally or share online
  • Test recovery before depositing funds