Python

bip39 從熵轉換為種子失敗測試,熵為“00000000000000000000000000000000”

  • March 6, 2020

嘗試使用以下程式碼段將熵的十六進製字元串轉換為種子句子。第一次測試失敗,有 16 個零字節。似乎我的函式得出的結論是校驗和是“1011”,但它應該是“0011”(例如通過這個頁面),因此我在種子句中確實有一個錯誤,我的最後一個詞在索引 13 上(指責)並且正確單詞在索引 3(關於)上。**我的功能有什麼問題?**此外,bip39 中沒有太多的實現細節,如果您了解一些資源(不僅僅是核心程式碼庫),他們會受到熱烈歡迎!

import hashlib
import requests
import unicodedata

def get_word_list():
   url = "https://raw.githubusercontent.com/"
   uri = "bitcoin/bips/master/bip-0039/english.txt"
   return requests.get(url + uri).text.split()


def checksum_length(entropy_bits: int) -> int:
   return int(entropy_bits / 32)


def mnemonic_from_entropy(entropy: str) -> str:
   word_list = get_word_list()
   entropy_bits = len(entropy) * 4
   entropy_bytes = bytes.fromhex(entropy)
   print(entropy_bytes.hex())
   entropy_int = int.from_bytes(entropy_bytes, byteorder="big")
   sha256_entropy_bytes = hashlib.sha256(entropy_bytes).digest()
   sha256_entropy_int = int.from_bytes(sha256_entropy_bytes, "big")
   checksum_bit_length = checksum_length(entropy_bits=entropy_bits)
   checksum = bin(sha256_entropy_int)[2:2 + checksum_bit_length]
   entropy_checksum = bin(entropy_int)[2:] + checksum
   entropy_checksum = entropy_checksum.zfill(entropy_bits + checksum_bit_length)
   bin_indexes = re.findall("." * 11, entropy_checksum)
   indexes = [int(index, 2) for index in bin_indexes]
   mnemonic_lst = [word_list[index] for index in indexes]
   mnemonic_sentence = unicodedata.normalize("NFKD", " ".join(mnemonic_lst))
   return mnemonic_sentence

if __name__ == "__main__":
   mnemonic_from_entropy("00000000000000000000000000000000")

你需要刪除 python 二進制分母'0b’,然後將 sha256 摘要的二進製表示填零到 256bits –> 然後它可以工作

checksum = bin(sha256_entropy_int)[2:].zfill(256)[:checksum_bit_length]

在 bip 中還提到了一個參考實現(最初一定錯過了)

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