Mnemonic-Seed

如何為 bip39 助記詞生成有效雜湊?

  • January 7, 2019

我試圖向自己證明我理解 bip39 助記詞的工作原理……我在電子表格中完成了大部分工作,因為我認為這會更容易,但我在校驗和值方面遇到了問題……這些是我正在採取的步驟:

  • 我從一個有效的 24 字種子開始
  • 然後將每個單詞更改為其索引值
  • 然後將它們更改為單個 264 二進制數字字元串
  • 然後將其更改為 66 個字元的十六進製字元串
  • 我手動將前 64 個十六進製字元輸入二進制編輯器以創建 32 字節文件
  • 然後我在那個 32 字節文件上使用 linux 終端命令 ‘shasum -a 256’ 來獲取雜湊

但是,該雜湊的前導字節與上面的 66 個字元的十六進製字元串的最後一個字節不匹配……

據我了解,24 字 bip39 種子片語最後有一個單字節校驗和值。該校驗和是種子片語編碼的數字的前 32 個字節的 sha256 雜湊的第一個字節。但是,到目前為止,我還不能提供第 33 個字節來重現有效的種子片語……有什麼建議嗎?

有時從答案向後工作更容易。為了採用這種方法,讓我們從比特幣瀏覽器的子命令mnemonic-new的細節開始。我們還假設 256 位雜湊表示為 87C1B129FBADD7B6E9ABC0A9EF7695436D767AECE042BEC198A97E949FCBE14C 的十六進制。

% echo -n 87C1B129FBADD7B6E9ABC0A9EF7695436D767AECE042BEC198A97E949FCBE14C | bx mnemonic-new

三月突擊引擎戰士人才群採摘工作準備刀管人學生骰子接收分析師敬禮藝術清潔木敵人遊客午餐喜歡

24 個種子字行號直接取自<https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt>:

1087 109 596 1979 1772 1756 1334 961 1360 990 1323 1079 1724 492 1437 67 1527 103 339 2026 592 1840 1066 1038

1086         108          595          1978         1771         1755
0x43E        0x06C        0x253        0x7BA        0x6EB        0x6DB
010000111110 000001101100 001001010011 011110111010 011011101011 011011011011
10000111110  00001101100  01001010011  11110111010  11011101011  11011011011 
8   7   C     1   B   1     2   9   F     B   A     D   D   7     B   6   E

1333         960          1359         989          1322         1078
0x535        0x3C0        0x54F        0x3DD        0x52A        0x436
010100110101 001111000000 010101001111 001111011101 010100101010 010000110110
10100110101  01111000000  10101001111  01111011101  10100101010  10000110110
  9   A   B     C   0     A   9   E     F   7   6     9   5   4     3   6

1723         491          1436         66           1526         102
0x6BB        0x1EB        0x59C        0x042        0x5F6        0x066
011010111011 000111101011 010110011100 000001000010 010111110110 000001100110
11010111011  00111101011  10110011100  00001000010  10111110110  00001100110
D   7   6     7   A   E     C   E   0     4   2     B   E   C     1   9   8

338          2025         591          1839         1065         1037
0x152        0x7E9        0x24F        0x72F        0x429        0x40D
000101010010 011111101001 001001001111 011100101111 010000101001 010000001101
00101010010  11111101001  01001001111  11100101111  10000101001  10000001101
  A   9   7     E   9     4   9   F     C   B   E     1   4   C     0   D

請注意,所有內容都與最後隱藏的附加 0x0D 匹配。這是根據<https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki#generating-the-mnemonic>計算的校驗和。

上面範例的 sha256 散列的前 8 位驅動隱藏在末尾的校驗和 0x0D。

% bx sha256 87C1B129FBADD7B6E9ABC0A9EF7695436D767AECE042BEC198A97E949FCBE14C 0d c811788c7e02c32b9c4b3586baf58ca27f74330c92d661042b19faa6c7e9f2

請注意,所有內容都與最後隱藏的附加 0x0D 匹配。這是根據<https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki#generating-the-mnemonic>計算的校驗和。

從上面的 sha256 操作中使用的位數是該第一列的函式。該表的第二列記錄了應用的校驗和位數。

西班牙 BIP 39 索引與提供的 32 字節熵的英文索引相同。

% echo 87C1B129FBADD7B6E9ABC0A9EF7695436D767AECE042BEC198A97E949FCBE14C | bx mnemonic-new -l es 漫畫精神元素征服蘇丹站黑暗聚集麵包乳膠耳朵網蘋果酒遇見支柱村蛹錨船長貪婪斧頭寶光火焰

24 個種子詞行號直接取自<https://github.com/bitcoin/bips/blob/master/bip-0039/spanish.txt>與以上英文匹配:

1087 109 596 1979 1772 1756 1334 961 1360 990 1323 1079 1724 492 1437 67 1527 103 339 2026 592 1840 1066 1038

BIP 39助記符到種子的操作絕對是不可逆的,產生的有效種子在 BIP 39 特定語言的種子詞列表中會有很大差異。下面對英語 ( en ) 和西班牙語 ( es )使用了兩種不同的 512 位助記符到種子機制(stretch和比特幣瀏覽器助記符到種子)。

% echo "march assault engine warrior talent swarm pluck job prepare knife pipe man student dice receive analyst salute art clean wood enemy tourist lunch like" | bx mnemonic-to-seed -l en -p "123" 809839beb19097ccfbe20c62278c9c4801497010f913a133c3d20f563a216a6cf23a5af53c13d778b278069f189aee1bd73452ec7617d935c2631edd93d70284

% stretch -f sha512 -r 2048 "march assault engine warrior talent swarm pluck job prepare knife pipe man student dice receive analyst salute art clean wood enemy tourist lunch like" mnemonic123 | bx base64-decode | bx base16-encode 809839beb19097ccfbe20c62278c9c4801497010f913a133c3d20f563a216a6cf23a5af53c13d778b278069f189aee1bd73452ec7617d935c2631edd93d70284

% echo "manga ánimo elemento vencer sultán soporte oscuro juntar pan látex oreja malla sidra cumplir pilar aldea pupa ancla capitán voraz eje tesoro luz llama" | bx mnemonic-to-seed -l es -p "123" 4e0159fedf7682323f9a34a8218292faf78277727bf6cc6bb4c7f833d5920318a8dfaad8c91813984ed567fff14e7f59aa4be9890540989de0448d2f86864a4f

% stretch -f sha512 -r 2048 "manga ánimo elemento vencer sultán soporte oscuro juntar pan látex oreja malla sidra cumplir pilar aldea pupa ancla capitán voraz eje tesoro luz llama" mnemonic123 | bx base64-decode | bx base16-encode 4e0159fedf7682323f9a34a8218292faf78277727bf6cc6bb4c7f833d5920318a8dfaad8c91813984ed567fff14e7f59aa4be9890540989de0448d2f86864a4f

最後,可以從上面的兩個 512 位種子中生成一個頂級的分層確定性擴展密鑰。

% echo 809839beb19097ccfbe20c62278c9c4801497010f913a133c3d20f563a216a6cf23a5af53c13d778b278069f189aee1bd73452ec7617d935c2631edd93d70284 | bx hd-new xprv9s21ZrQH143K2yEY3QSoUzx5i1ZL3rMJX4C5XikitLQruPj23MTBLhU1EiZkpQNidPxKhCR548zUpw261gJZ8x6scyQeCE67Tr2v1bAn8cx

% echo 4e0159fedf7682323f9a34a8218292faf78277727bf6cc6bb4c7f833d5920318a8dfaad8c91813984ed567fff14e7f59aa4be9890540989de0448d2f86864a4f | bx hd-new xprv9s21ZrQH143K4SehajoujF9rWwQezrvezd7trUPBgrN1r7WkDiY3fUobvbTmbigW5vhpJzBtURszkiBRRenUapMtbBaGaWtVHL4ZWPcaZcL

您可以創建一個有效的種子來計算有效的最後一個單詞 (23+1)。

即使使用瀏覽器 JS 控制台:

mywords="sausage liquid same heart ... "

allwords = WORDLISTS["english"]
m = new Mnemonic("english")
for (var w in allwords) { 
      curr_word=allwords[w]; 
      test_words = mywords + " " + curr_word; 
      if (m.check(test_words)) { console.log(curr_word) } 
}

資源:

<http://wikistas.com/u/cryptodog!Ccsi1HdXWr/Wd5q-generating-secure-bip39-seeds>

引用自:https://bitcoin.stackexchange.com/questions/68605