使用 Scrypt 和 PBKDF2 的算法 - Python
Algorithm with Scrypt and PBKDF2 - Python
我已尝试在 Python
上重现此算法
(双管道表示在密码短语中添加0x1或0x2)
s1 = scrypt(key=(passphrase||0x1), salt=(salt||0x1), N=2^18, r=8, p=1, dkLen=32)
s2 = pbkdf2(key=(passphrase||0x2), salt=(salt||0x2), c=2^16, dkLen=32, prf=HMAC_SHA256)
keypair = generate_bitcoin_keypair(s1 ⊕ s2)
我做了这个:
s1 = pyscrypt.hash(password=phrase+'\x01', salt=saltPhrase+'\x01', N=16, r=8, p=1, dkLen=32)
s2 = pbkdf2(phrase+'\x02', saltPhrase+'\x02', 1, keylen=32, prf='hmac-sha256')
newWallet = BitcoinKeypair.from_passphrase(''.join(chr(ord(a) ^ ord(b)) for a,b in zip(s1,s2)))
问题是它无法正常工作,因为它会生成此
bitcoin address: 1HvAip4QGWqPJoh8nxLmRAXtbuVj9AKGHq
Wif: 5Kd3D34oALv33x7RMAPrrsNtidZjQekdWHXWGXW6cs2SnRkKUR2
但正确的输出是这样的:
bitcoin address: 1MGKWPZEqJh9JzCPYYsKFEo9w8E2GXmzA7
Wif: 5KXwsERJKvUZde3qHboJFz1gF6B15Xt7TB22bRWoGzgN3FHxqyR
有人可以帮助我吗?谢谢。
完整代码如下:http://pastebin.com/QL0tQ83v
要使用此脚本,您需要安装这些库:
pip install pyscrypt passlib coinkit
这似乎是 WarpWallet 的一个实现,我猜这是您获得“正确”值的地方。你有两个问题。
首先BitcoinKeypair.from_passphrase
从密码生成一个密钥,但是你已经自己生成了密钥,所以你不需要这个——你可以只使用你拥有的密钥(你需要导入binascii
使用 hexlify
):
# xor the two subkeys as before.
key = ''.join(chr(ord(a) ^ ord(b)) for a,b in zip(s1,s2))
# Convert to a hex string first (coinkit / pybitcoin expects hex
# rather than raw bytes).
key_hex = hexlify(key)
# Create the keypair.
newWallet = BitcoinKeypair(key_hex)
(另外 BitcoinKeypair
现在似乎已被弃用,也许您应该考虑转向 pybitcoin 和 BitcoinPrivateKey
和 BitcoinPublicKey
)。
其次,您在两个 kdfs 中的工作因素都偏离了。对于 scrypt,它应该是 2^18(你有 16 个),对于 pbkdf2,它应该是 2^16(你有 1 个)。
这是一个与 WarpWallet 页面结果相同的版本(请注意,我在这里使用 scrypt
而不是 pyscrypt
,因为 pyscrypt
想吃掉我笔记本电脑的全部内存我修复了迭代次数):
s1 = scrypt.hash(password=phrase+'\x01', salt=saltPhrase+'\x01', N=1<<18, r=8, p=1, buflen=32)
s2 = pbkdf2(phrase+'\x02', saltPhrase+'\x02', 1<<16, keylen=32, prf='hmac-sha256')
key = ''.join(chr(ord(a) ^ ord(b)) for a,b in zip(s1,s2))
key_hex = hexlify(key)
newWallet = BitcoinKeypair(key_hex)
我已尝试在 Python
上重现此算法(双管道表示在密码短语中添加0x1或0x2)
s1 = scrypt(key=(passphrase||0x1), salt=(salt||0x1), N=2^18, r=8, p=1, dkLen=32)
s2 = pbkdf2(key=(passphrase||0x2), salt=(salt||0x2), c=2^16, dkLen=32, prf=HMAC_SHA256)
keypair = generate_bitcoin_keypair(s1 ⊕ s2)
我做了这个:
s1 = pyscrypt.hash(password=phrase+'\x01', salt=saltPhrase+'\x01', N=16, r=8, p=1, dkLen=32)
s2 = pbkdf2(phrase+'\x02', saltPhrase+'\x02', 1, keylen=32, prf='hmac-sha256')
newWallet = BitcoinKeypair.from_passphrase(''.join(chr(ord(a) ^ ord(b)) for a,b in zip(s1,s2)))
问题是它无法正常工作,因为它会生成此
bitcoin address: 1HvAip4QGWqPJoh8nxLmRAXtbuVj9AKGHq
Wif: 5Kd3D34oALv33x7RMAPrrsNtidZjQekdWHXWGXW6cs2SnRkKUR2
但正确的输出是这样的:
bitcoin address: 1MGKWPZEqJh9JzCPYYsKFEo9w8E2GXmzA7
Wif: 5KXwsERJKvUZde3qHboJFz1gF6B15Xt7TB22bRWoGzgN3FHxqyR
有人可以帮助我吗?谢谢。
完整代码如下:http://pastebin.com/QL0tQ83v
要使用此脚本,您需要安装这些库:
pip install pyscrypt passlib coinkit
这似乎是 WarpWallet 的一个实现,我猜这是您获得“正确”值的地方。你有两个问题。
首先BitcoinKeypair.from_passphrase
从密码生成一个密钥,但是你已经自己生成了密钥,所以你不需要这个——你可以只使用你拥有的密钥(你需要导入binascii
使用 hexlify
):
# xor the two subkeys as before.
key = ''.join(chr(ord(a) ^ ord(b)) for a,b in zip(s1,s2))
# Convert to a hex string first (coinkit / pybitcoin expects hex
# rather than raw bytes).
key_hex = hexlify(key)
# Create the keypair.
newWallet = BitcoinKeypair(key_hex)
(另外 BitcoinKeypair
现在似乎已被弃用,也许您应该考虑转向 pybitcoin 和 BitcoinPrivateKey
和 BitcoinPublicKey
)。
其次,您在两个 kdfs 中的工作因素都偏离了。对于 scrypt,它应该是 2^18(你有 16 个),对于 pbkdf2,它应该是 2^16(你有 1 个)。
这是一个与 WarpWallet 页面结果相同的版本(请注意,我在这里使用 scrypt
而不是 pyscrypt
,因为 pyscrypt
想吃掉我笔记本电脑的全部内存我修复了迭代次数):
s1 = scrypt.hash(password=phrase+'\x01', salt=saltPhrase+'\x01', N=1<<18, r=8, p=1, buflen=32)
s2 = pbkdf2(phrase+'\x02', saltPhrase+'\x02', 1<<16, keylen=32, prf='hmac-sha256')
key = ''.join(chr(ord(a) ^ ord(b)) for a,b in zip(s1,s2))
key_hex = hexlify(key)
newWallet = BitcoinKeypair(key_hex)