Към основното съдържание

Какво е BIP39?

U
Написано от UKey Wallet

Спецификацията BIP-39 основно описва алгоритъма и процеса за генериране на детерминистични портфейли въз основа на мнемоника (набор от лесни за запомняне думи).

Спецификацията се състои от две основни части:

  1. Как да генерирам мнемоника.

  2. Как да трансформирате генерираната мнемоника в двоично семе.

Следното е поглед върху това как да генерирате детерминистични портфейли, като първо описвате всяка от тези две части.

Генериране на мнемоника

Алгоритмичният процес за генериране на мнемоника е както следва:

Процесът е както следва:

  1. Създайте произволна последователност (ентропия) от 128 до 256 бита (размер на стъпката 32 бита)

  2. Изпълнете SHA256 върху произволната последователност, генерирана в предишната стъпка, за да генерирате хеш стойност и вземете първите N бита от хеш стойността (дължина на ентропията / 32, напр. 128 бита, след това N = 4) като контролна сума на произволната последователност.

  3. Добавете контролна сума към края на произволната последователност, генерирана в първата стъпка, така че за примера на фигурата произволната последователност с контролна сума да е 128 + 4 = 132 бита.

  4. Разделете произволната последователност от предишната стъпка с 11-битови сегменти (разделяне), така че за последователност от 128-битова ентропийна дължина да се генерират 12 сегмента (132 / 11 = 12).

  5. В този момент картографиране на всяка стойност, съдържаща 11-битов сегмент, към предварително дефиниран речник от 2048 думи.

  6. Последната група от думи, генерирани в реда на изрязването, е мнемониката.

Генерация на семена от мнемоника

След мнемоничното генериране можем да генерираме семето, като използваме алгоритъма на функцията за генериране на ключ PBKDF2.

PBKDF2 изисква два параметъра: мнемоника и сол. Целта на солта е да направи кракването по-трудно, а в BIP-39 можем да въведем парола като допълнителен защитен фактор за защита на семената.

„PBKDF2 е част от серията Standards Public-Key Cryptography (PKCS) на RSA Laboratories, по-специално PKCS #5 v2.0, също публикуван като RFC 2898 на Internet Engineering Task Force.“

Следвайки горното генериране на мнемоника, следващата диаграма показва алгоритъма за генериране на семена.

  • Първият параметър на PBKDF2 е мнемониката, генерирана по-горе.

  • Вторият параметър на PBKDF2 е солта, която обикновено се състои от низ и опционална конкатенация на въведени от потребителя низове за шифър.

  • PBKDF2 използва алгоритъма HMAC-SHA512, който използва 2048 хеша, за да произведе 512-битова стойност като начална стойност.

Генериране на HD портфейл от семена

Семената, генерирани по-горе, ще се използват като коренни семена на HD портфейла, а коренните семена на всеки HD портфейл могат да пресъздадат целия HD портфейл.

Въвеждането на коренното начално число в алгоритъма HMAC-SHA512 дава 512-битов хеш, левите 256 бита от които се използват като главен частен ключ, а десните 256 бита като главен верижен код. След това главният публичен ключ (264 бита) може да бъде генериран от главния частен ключ m.

Както можете да видите от горната фигура, HD ключът се генерира със следните параметри.

  • Родителски частен ключ или родителски публичен ключ; (и двата са некомпресирани 256-битови ECDSA ключове).

  • Код на родителската верига от 256 бита.

  • 32-битово цяло число индекс.

В допълнение, горният процес е рекурсивен и Частният ключ на дете в диаграмата може да се използва като Личен ключ на родител на следващото ниво.

Чрез въвеждане (Parent Publick Key, Parent Chain Code, Index Number) в алгоритъма HMAC-SHA512 можем да генерираме неговите подключове и можем да коригираме индексния номер, за да генерираме множество подключове на едно и също ниво.

Относно разширения ключ

Тъй като тази функция за извличане на ключ е еднопосочна, всички подключове не могат да се използват за извличане на техните родителски ключове или сестрински ключове на едно и също ниво, само родителският ключ и кодът на родителската верига (които се генерират от ключа на родителското ниво и верижния код) могат да се използват за извличане на всички подключове и кодове на подвериги и впоследствие да се генерират съответните подпублични ключове и адреси за подписване на транзакции.

Комбинацията от ключ и верижен код се нарича разширен ключ и разширеният ключ може да се използва за генериране на всички разклонения от там надолу.

Ключът, предоставен в разширения ключ, може да бъде или частен ключ, или публичен ключ, комбиниран с верижния код, наречен съответно Разширен частен ключ и Разширен публичен ключ и отбелязан съответно като (k, c) и (K, c), където публичният ключ K = точка (k).

Можем да извлечем разширения публичен ключ от разширения частен ключ, а не обратното, така че за някои сценарии на транзакции (напр. електронна търговия), нов публичен ключ и адрес могат да бъдат генерирани за всяка транзакция за получаване на плащане, докато разширеният частен ключ може да се съхранява в хартиен портфейл или хардуерен портфейл за сигурно офлайн подписване на транзакции. Както виждаме, сигурността на разширения публичен ключ е сравнително висока и следната диаграма показва механизма за предаване на разширения родителски публичен ключ за извличане на дъщерния частен ключ и генериране на дъщерния публичен ключ:

Това отговори ли на въпроса ви?