Goldenkey成品示例
区块链助记词碰撞器/恢复器都遵循生成符合BIP39标准的助记词或私钥这个逻辑。
一、BIP39标准简介
BIP39(Bitcoin Improvement Proposal 39)是一种用于生成助记词的标准,旨在提供一种易于记忆的方式来安全地存储和恢复加密货币钱包的私钥。助记词通常由12到24个单词组成,这些单词是从一个预定义的2048个单词的列表中选择的。生成助记词的过程包括以下几个步骤:
1. 生成随机熵:熵的长度通常是128到256位,并且是32的倍数。
2. 计算校验和:对熵进行SHA-256哈希计算,并取哈希值的前几位作为校验和。
3. 组合熵和校验和:将校验和附加到熵的末尾,形成一个新的二进制序列。
4. 分割为助记词索引:将组合后的二进制序列分割成每组11位的片段,每个片段转换为一个数字,作为助记词列表中的索引。
5. 映射为助记词:使用这些索引从预定义的2048个助记词列表中提取相应的助记词。
二、Python代码实现
1. 生成随机熵
熵是生成助记词的基础,通常是一个随机生成的二进制序列。熵的长度可以是128、160、192、224或256位。
import os
import hashlib
import binascii
import bip39 # 使用bip39库简化操作
def generate_entropy(strength=128):
"""
生成随机熵
:param strength: 熵的长度(位),必须是32的倍数
:return: 二进制熵
"""
if strength % 32 != 0:
raise ValueError("熵的长度必须是32的倍数")
entropy_bytes = os.urandom(strength // 8)
return entropy_bytes
2. 计算校验和
校验和是通过SHA-256哈希算法计算熵的前几位得到的。校验和的长度取决于熵的长度。
def generate_checksum(entropy_bytes):
"""
计算校验和
:param entropy_bytes: 二进制熵
:return: 二进制校验和
"""
hash_object = hashlib.sha256(entropy_bytes)
hash_digest = hash_object.digest()
checksum_length = len(entropy_bytes) // 4 # 校验和的长度(字节)
checksum = bin(int(binascii.hexlify(hash_digest), 16))[2:2 + checksum_length * 8]
return checksum
3. 组合熵和校验和
将校验和附加到熵的末尾,形成一个新的二进制序列。
def combine_entropy_checksum(entropy_bytes, checksum):
"""
组合熵和校验和
:param entropy_bytes: 二进制熵
:param checksum: 二进制校验和
:return: 组合后的二进制序列
"""
entropy_bits = ''.join([bin(byte)[2:].zfill(8) for byte in entropy_bytes])
combined_bits = entropy_bits + checksum
return combined_bits
4. 分割为助记词索引
将组合后的二进制序列分割成每组11位的片段,每个片段转换为一个数字,作为助记词列表中的索引。
def split_into_indices(combined_bits):
"""
分割为助记词索引
:param combined_bits: 组合后的二进制序列
:return: 助记词索引列表
"""
indices = [int(combined_bits[i:i + 11], 2) for i in range(0, len(combined_bits), 11)]
return indices
5. 映射为助记词
使用助记词索引从预定义的2048个助记词列表中提取相应的助记词。
def indices_to_mnemonic(indices):
"""
将索引映射为助记词
:param indices: 助记词索引列表
:return: 助记词短语
"""
wordlist = bip39.wordlist.english
mnemonic = ' '.join([wordlist[index] for index in indices])
return mnemonic
6. 生成助记词的完整函数
将上述步骤组合成一个完整的函数,生成符合BIP39标准的助记词。
def generate_bip39_mnemonic(strength=128):
"""
生成符合BIP39标准的助记词
:param strength: 熵的长度(位),必须是32的倍数
:return: 助记词短语
"""
entropy_bytes = generate_entropy(strength)
checksum = generate_checksum(entropy_bytes)
combined_bits = combine_entropy_checksum(entropy_bytes, checksum)
indices = split_into_indices(combined_bits)
mnemonic = indices_to_mnemonic(indices)
return mnemonic
# 示例:生成一个128位的助记词
mnemonic_phrase = generate_bip39_mnemonic(128)
print(f"Generated mnemonic phrase: {mnemonic_phrase}")
三、生成私钥
从助记词生成私钥的过程通常涉及以下步骤:
1. 使用助记词和密码生成种子(Seed)。
2. 使用种子生成主私钥。
3. 从主私钥派生出子私钥。以下是生成私钥的代码示例:
import hashlib
import hmac
import binascii
def mnemonic_to_seed(mnemonic, password=""):
"""
从助记词生成种子
:param mnemonic: 助记词短语
:param password: 可选密码
:return: 种子(二进制)
"""
salt = "mnemonic" + password
seed = hashlib.pbkdf2_hmac('sha512', mnemonic.encode('utf-8'), salt.encode('utf-8'), 2048)
return seed
def seed_to_master_key(seed):
"""
从种子生成主私钥
:param seed: 种子(二进制)
:return: 主私钥(二进制)
"""
hmac_digest = hmac.new(b"Bitcoin seed", seed, hashlib.sha512).digest()
master_key = hmac_digest[:32] # 主私钥
chain_code = hmac_digest[32:] # 链码
return master_key, chain_code
# 示例:从助记词生成私钥
mnemonic_phrase = generate_bip39_mnemonic(128)
seed = mnemonic_to_seed(mnemonic_phrase)
master_key, chain_code = seed_to_master_key(seed)
print(f"Generated master private key (hex): {binascii.hexlify(master_key).decode()}")
print(f"Generated chain code (hex): {binascii.hexlify(chain_code).decode()}")
通过上述代码,我们可以随机生成符合BIP39标准的助记词,并从助记词生成私钥。生成助记词的过程严格遵循熵生成、校验位计算和单词映射的步骤,确保生成的助记词是安全且符合标准的。生成私钥的过程则基于助记词和密码生成种子,再从种子中派生出主私钥和链码。希望这篇文章和代码示例能帮助你更好地理解和实现BIP39助记词和私钥的生成。如果有其他问题,欢迎继续提问!
Goldenkey专业开发区块链加密/解密技术。TG:@hebe7956 @Gdk7956