BIP-39 specifikacijoje daugiausia aprašomas deterministinių piniginių, pagrįstų mnemonika (lengvai įsimenamų žodžių rinkiniu), generavimo algoritmas ir procesas.
Specifikaciją sudaro dvi pagrindinės dalys:
Kaip sukurti mnemoniją.
Kaip sugeneruotą mnemoniką paversti dvejetaine sėkla.
Toliau apžvelgsime, kaip sukurti deterministines pinigines, pirmiausia aprašant kiekvieną iš šių dviejų dalių.
Mnemonikos generavimas
Algoritminis mnemonikos generavimo procesas yra toks:
Procesas yra toks:
Sukurkite atsitiktinę seką (entropiją) nuo 128 iki 256 bitų (veiksmo dydis 32 bitai)
Atlikite SHA256 atsitiktinei sekai, sugeneruotai ankstesniame veiksme, kad sugeneruotumėte maišos reikšmę, ir imkite pirmuosius N maišos vertės bitus (entropijos ilgis / 32, pvz., 128 bitai, tada N = 4) kaip atsitiktinės sekos kontrolinę sumą.
Pridėkite kontrolinę sumą prie atsitiktinės sekos, sugeneruotos pirmame žingsnyje, pabaigos, kad paveikslo pavyzdyje atsitiktinė seka su kontroline suma būtų 128 + 4 = 132 bitai.
Atsitiktinę seką nuo ankstesnio žingsnio atskirkite 11 bitų segmentais (padalykite), kad 128 bitų entropijos ilgio sekai būtų sugeneruota 12 segmentų (132 / 11 = 12).
Šiuo metu kiekviena reikšmė, kurioje yra 11 bitų segmentas, susiejama su iš anksto nustatytu 2048 žodžių žodynu.
Paskutinė žodžių grupė, sukurta iškirpimo tvarka, yra mnemoninė.
Sėklų generavimas iš mnemonikos
Po mnemoninio generavimo galime sugeneruoti sėklą naudodami raktų generavimo funkciją PBKDF2 algoritmą.
PBKDF2 reikalauja dviejų parametrų: mnemoninio ir druskos. Druskos paskirtis yra apsunkinti įtrūkimą, o BIP-39 galime įvesti slaptafrazę kaip papildomą saugumo veiksnį, kad apsaugotume sėklas.
„PBKDF2 yra „RSA Laboratories“ viešojo rakto kriptografijos standartų (PKCS) serijos dalis, konkrečiai PKCS #5 v2.0, taip pat paskelbta kaip Internet Engineering Task Force RFC 2898.
Atlikus pirmiau mnemoninį generavimą, šioje diagramoje parodytas sėklų generavimo algoritmas.
Pirmasis PBKDF2 parametras yra aukščiau sukurtas mnemonikas.
Antrasis PBKDF2 parametras yra druska, kurią paprastai sudaro eilutė ir pasirenkama vartotojo pateiktų šifravimo eilučių jungtis.
PBKDF2 naudoja HMAC-SHA512 algoritmą, kuris naudoja 2048 maišą, kad sukurtų 512 bitų reikšmę kaip pradinę reikšmę.
** HD piniginės generavimas iš sėklų**
Aukščiau sukurta sėkla bus naudojama kaip HD piniginės šakninė sėkla, o bet kurios HD piniginės šakninė sėkla gali atkurti visą HD piniginę.
Įvedus šakninę sėklą į HMAC-SHA512 algoritmą, gaunama 512 bitų maiša, kurios kairieji 256 bitai naudojami kaip pagrindinis privatus raktas, o dešinieji 256 bitai kaip pagrindinis grandinės kodas. Po to pagrindinis viešasis raktas (264 bitai) gali būti generuojamas pagrindiniu privačiuoju raktu m.
Kaip matote iš aukščiau esančio paveikslo, HD raktas generuojamas naudojant šiuos parametrus.
Parent Private Key arba Parent Public Key; (abu yra nesuspausti 256 bitų ECDSA raktai).
256 bitų pagrindinės grandinės kodas.
32 bitų sveikojo skaičiaus indekso numeris.
Be to, aukščiau pateiktas procesas yra rekursyvus, o Privatus vaiko raktas diagramoje gali būti naudojamas kaip Privatus tėvo raktas kitame lygyje.
Įvedę (Parent Publick Key, Parent Chain Code, Index Number) į HMAC-SHA512 algoritmą, galime sugeneruoti jo dalinius raktus ir pakoreguoti indekso numerį, kad generuotume kelis dalinius raktus tame pačiame lygyje.
Apie išplėstinį raktą
Kadangi ši raktų išvedimo funkcija yra vienakryptė, visų dalinių raktų negalima naudoti pirminiams arba seseriniams raktams išvesti tame pačiame lygyje, tik pirminis raktas ir pagrindinės grandinės kodas (kurie generuojami iš pirminio lygio rakto ir grandinės kodo) gali būti naudojami visiems daliniams raktams ir subgrandinės kodams gauti ir vėliau generuoti atitinkamus antrinius raktus ir pasirašymo sandorius bei adresus.
Rakto ir grandinės kodo derinys vadinamas išplėstiniu raktu, o išplėstinis raktas gali būti naudojamas generuoti visas šakas nuo tada iki apačios.
Išplėstiniame rakte pateiktas raktas gali būti privatus arba viešasis raktas, derinamas su grandinės kodu, atitinkamai vadinamu Išplėstinis privatus raktas ir Išplėstinis viešasis raktas, ir pažymėtas atitinkamai kaip (k, c) ir (K, c), kur viešasis raktas K = taškas (k).
Išplėstinį viešąjį raktą galime išvesti iš išplėstinio privataus rakto, o ne atvirkščiai, todėl kai kurių operacijų scenarijuose (pvz., elektroninėje komercijoje) kiekvienai operacijai galima sugeneruoti naują viešąjį raktą ir adresą, kad būtų gautas mokėjimas, o išplėstinis privatus raktas gali būti saugomas popierinėje piniginėje arba aparatinės įrangos piniginėje, kad būtų galima saugiai pasirašyti operacijas neprisijungus. Kaip matome, išplėstinio viešojo rakto saugumas yra santykinai aukštas, o šioje diagramoje parodytas išplėstinio pirminio viešojo rakto perdavimo mechanizmas, siekiant gauti antrinį privatųjį raktą ir generuoti antrinį viešąjį raktą:




