Specyfikacja BIP-39 opisuje głównie algorytm i proces generowania portfeli deterministycznych w oparciu o mnemonik (zestaw łatwych do zapamiętania słów).
Specyfikacja składa się z dwóch głównych części:
Jak wygenerować mnemonik.
Jak przekształcić wygenerowany mnemonik w ziarno binarne.
Poniżej przedstawiono sposób generowania deterministycznych portfeli, opisując najpierw każdą z tych dwóch części.
Generowanie mnemonika
Algorytmiczny proces generowania mnemonika jest następujący:
Proces jest następujący:
Utwórz losową sekwencję (entropię) o długości od 128 do 256 bitów (rozmiar kroku 32 bity)
Wykonaj SHA256 na losowej sekwencji wygenerowanej w poprzednim kroku, aby wygenerować wartość Hash i przyjmij pierwszych N bitów wartości Hash (długość entropii / 32, np. 128 bitów, następnie N = 4) jako sumę kontrolną losowej sekwencji.
Dodaj Sumę kontrolną na końcu losowej sekwencji wygenerowanej w pierwszym kroku, tak aby w przykładzie na rysunku losowa sekwencja z Sumą kontrolną wynosiła 128 + 4 = 132 bity.
Oddziel losową sekwencję z poprzedniego kroku 11-bitowymi segmentami (split), tak aby dla sekwencji o 128-bitowej długości entropii zostało wygenerowanych 12 segmentów (132 / 11 = 12).
W tym momencie mapowanie każdej wartości zawierającej 11-bitowy segment do predefiniowanego słownika zawierającego 2048 słów.
Ostatnią grupą słów generowanych w kolejności cięcia jest mnemonik.
Generowanie nasion na podstawie mnemoników
Po wygenerowaniu mnemonika możemy wygenerować ziarno za pomocą algorytmu funkcji generowania klucza PBKDF2.
PBKDF2 wymaga dwóch parametrów: mnemonika i soli. Celem soli jest utrudnienie pękania, a w BIP-39 możemy wprowadzić hasło jako dodatkowy czynnik bezpieczeństwa w celu ochrony nasion.
„PBKDF2 jest częścią serii standardów kryptografii klucza publicznego (PKCS) firmy RSA Laboratories, w szczególności PKCS #5 v2.0, opublikowany również jako dokument RFC 2898 Internet Engineering Task Force.
Po powyższym generowaniu mnemoników poniższy diagram przedstawia algorytm generowania nasion.
Pierwszym parametrem PBKDF2 jest mnemonik wygenerowany powyżej.
Drugim parametrem PBKDF2 jest sól, która zazwyczaj składa się z ciągu znaków i opcjonalnej konkatenacji ciągów szyfrujących dostarczonych przez użytkownika.
PBKDF2 wykorzystuje algorytm HMAC-SHA512, który wykorzystuje 2048 skrótów do wygenerowania 512-bitowej wartości jako materiału siewnego.
Generowanie portfela HD z nasion
Wygenerowany powyżej materiał siewny zostanie użyty jako materiał siewny główny portfela HD, a materiał siewny główny dowolnego portfela HD może odtworzyć cały portfel HD.
Wprowadzenie korzenia głównego do algorytmu HMAC-SHA512 daje 512-bitowy skrót, z którego 256 lewych bitów służy jako główny klucz prywatny, a prawe 256 bitów jako główny kod łańcucha. Następnie główny klucz publiczny (264 bity) może zostać wygenerowany za pomocą głównego klucza prywatnego m.in.
Jak widać na powyższym rysunku, klucz HD jest generowany z następującymi parametrami.
Nadrzędny klucz prywatny lub nadrzędny klucz publiczny; (oba są nieskompresowanymi 256-bitowymi kluczami ECDSA).
Kod łańcucha nadrzędnego składający się z 256 bitów.
32-bitowy numer indeksu będący liczbą całkowitą.
Ponadto powyższy proces jest rekurencyjny, a Dzieciowy klucz prywatny na diagramie może zostać użyty jako Nadrzędny klucz prywatny na następnym poziomie.
Wprowadzając (nadrzędny klucz publiczny, nadrzędny kod łańcucha, numer indeksu) do algorytmu HMAC-SHA512, możemy wygenerować jego podklucze i możemy dostosować numer indeksu, aby wygenerować wiele podkluczy na tym samym poziomie.
O kluczu rozszerzonym
Ponieważ ta funkcja wyprowadzania klucza jest jednokierunkowa, nie można używać wszystkich podkluczy do wyprowadzania kluczy nadrzędnych lub kluczy siostrzanych na tym samym poziomie. Do wyprowadzenia wszystkich podkluczy i kodów podłańcucha, a następnie wygenerowania odpowiednich kluczy podpublicznych i adresów do podpisywania transakcji można użyć jedynie klucza nadrzędnego i nadrzędnego kodu łańcucha (które są generowane z klucza i kodu łańcucha na poziomie nadrzędnym).
Kombinacja klucza i kodu łańcucha nazywana jest kluczem rozszerzonym, a klucz rozszerzony może zostać użyty do wygenerowania wszystkich gałęzi od tego momentu w dół.
Klucz dostarczony w kluczu rozszerzonym może być kluczem prywatnym lub kluczem publicznym, połączonym z kodem łańcucha zwanym odpowiednio Rozszerzonym kluczem prywatnym i Rozszerzonym kluczem publicznym i oznaczonym odpowiednio jako (k, c) i (K, c), gdzie klucz publiczny K = punkt (k).
Z rozszerzonego klucza prywatnego możemy wyprowadzić rozszerzony klucz publiczny i nie odwrotnie, dlatego w przypadku niektórych scenariuszy transakcji (np. handlu elektronicznego) dla każdej transakcji można wygenerować nowy klucz publiczny i adres w celu otrzymania płatności, natomiast rozszerzony klucz prywatny można przechowywać w portfelu papierowym lub portfelu sprzętowym w celu bezpiecznego podpisywania transakcji w trybie offline. Jak widzimy, bezpieczeństwo rozszerzonego klucza publicznego jest stosunkowo wysokie, a poniższy diagram przedstawia mechanizm transmisji rozszerzonego nadrzędnego klucza publicznego w celu uzyskania potomnego klucza prywatnego i wygenerowania potomnego klucza publicznego:




