BIP-39-specifikationen beskriver hovedsageligt algoritmen og processen til generering af deterministiske tegnebøger baseret på mnemonic (et sæt ord, der er nemme at huske).
Specifikationen består af to hoveddele:
Sådan genereres mnemonikken.
Hvordan man transformerer den genererede mnemonic til et binært frø.
Det følgende er et kig på, hvordan man genererer deterministiske tegnebøger ved først at beskrive hver af disse to dele.
Generering af en mnemonik
Den algoritmiske proces til at generere en mnemonic er som følger:
Processen er som følger:
Opret en tilfældig sekvens (entropi) på 128 til 256 bit (trinstørrelse 32 bit)
Udfør SHA256 på den tilfældige sekvens genereret i det foregående trin for at generere en Hash-værdi, og tag de første N bit af Hash-værdien (entropi-længde / 32, f.eks. 128 bit, derefter N = 4) som kontrolsummen af den tilfældige sekvens.
Tilføj Checksum til slutningen af den tilfældige sekvens genereret i det første trin, så for eksemplet i figuren er den tilfældige sekvens med Checksum 128 + 4 = 132 bit.
Adskil den tilfældige sekvens fra det foregående trin med 11-bit segmenter (opdelt), således at der for en sekvens på 128-bit entropilængde genereres 12 segmenter (132 / 11 = 12).
På dette tidspunkt kortlægges hver værdi, der indeholder et 11-bit segment, til en foruddefineret ordbog med 2048 ord.
Den sidste gruppe af ord, der genereres i rækkefølgen af snittet, er mnemonikken.
Frøgenerering fra mnemonics
Efter mnemonic-genereringen kan vi generere frøet ved at bruge nøglegenereringsfunktionen PBKDF2-algoritmen.
PBKDF2 kræver to parametre: en mnemonisk og et salt. Formålet med salt er at gøre revnedannelse vanskeligere, og i BIP-39 kan vi introducere en adgangskode som en ekstra sikkerhedsfaktor for at beskytte frøene.
"PBKDF2 er en del af RSA Laboratories' Public-Key Cryptography Standards (PKCS) serie, specifikt PKCS #5 v2.0, også udgivet som Internet Engineering Task Force's RFC 2898."
Efter den ovennævnte mnemogenerering viser følgende diagram algoritmen for frøgenerering.
Den første parameter i PBKDF2 er mnemonikken genereret ovenfor.
Den anden parameter i PBKDF2 er saltet, som generelt består af en streng og en valgfri sammenkædning af brugerleverede chifferstrenge.
PBKDF2 bruger HMAC-SHA512-algoritmen, som bruger 2048 hashes til at producere en 512-bit værdi som et frø.
Generering af HD-pung fra frø
Det frø, der er genereret ovenfor, vil blive brugt som Root Seed af HD-pungen, og Root Seed af enhver HD-pung kan genskabe hele HD-pungen.
Indtastning af Root Seed i HMAC-SHA512-algoritmen giver en 512-bit hash, hvoraf de venstre 256 bits bruges som Master Private Key og de højre 256 bits som Master Chain Code. Derefter kan Master Public Key (264 bit) genereres af Master Private Key m.
Som du kan se fra ovenstående figur, genereres HD-nøglen med følgende parametre.
Overordnet privat nøgle eller overordnet offentlig nøgle; (begge er ukomprimerede 256 bit ECDSA nøgler).
Forælderkædekode på 256 bit.
Et 32-bit heltalsindeksnummer.
Derudover er ovenstående proces rekursiv, og Privat børnenøgle i diagrammet kan bruges som Privat forældrenøgle på næste niveau.
Ved at indtaste (Pparent Publick Key, Parent Chain Code, Index Number) i HMAC-SHA512-algoritmen kan vi generere dens undernøgler, og vi kan justere indeksnummeret for at generere flere undernøgler på samme niveau.
Om udvidet nøgle
Fordi denne nøgleafledningsfunktion er ensrettet, kan alle undernøgler ikke bruges til at udlede deres overordnede nøgler eller søsternøgler på samme niveau, kun den overordnede nøgle og den overordnede kædekode (som er genereret fra forældrenes overordnede niveaunøgle og kædekode) kan bruges til at udlede alle undernøgler og underkædekoder, og efterfølgende genererer de tilsvarende nøgler til signering og adresser offentligt.
Kombinationen af nøgle- og kædekoden kaldes udvidet nøgle, og den udvidede nøgle kan bruges til at generere alle grene derfra og ned.
Nøglen i den udvidede nøgle kan enten være en privat nøgle eller en offentlig nøgle, kombineret med kædekoden kaldet Udvidet privat nøgle og Udvidet offentlig nøgle, og noteret som henholdsvis (k, c) og (K, c), hvor den offentlige nøgle K = punkt(k).
Vi kan udlede den udvidede offentlige nøgle fra den udvidede private nøgle og ikke omvendt, så for nogle transaktionsscenarier (f.eks. e-handel) kan en ny offentlig nøgle og adresse genereres for hver transaktion for at modtage betaling, mens den udvidede private nøgle kan gemmes i en papirpung eller en hardwarepung for sikker offline signering af transaktioner. Som vi kan se, er sikkerheden af den udvidede offentlige nøgle relativt høj, og det følgende diagram viser transmissionsmekanismen for den udvidede overordnede offentlige nøgle til at udlede den underordnede private nøgle og generere den underordnede offentlige nøgle:




