使用Scrypt和PBKDF2-Python的算法
我已经尝试在Python上复制这个算法 (双管道意味着在密码短语中添加0x1或0x2) 我做了这个:使用Scrypt和PBKDF2-Python的算法,python,cryptography,python-2.x,pbkdf2,scrypt,Python,Cryptography,Python 2.x,Pbkdf2,Scrypt,我已经尝试在Python上复制这个算法 (双管道意味着在密码短语中添加0x1或0x2) 我做了这个: 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 = BitcoinKeypai
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
有人能帮我吗?谢谢
下面是完整的代码:
要使用此脚本,您需要安装以下库:
pip install pyscrypt passlib coinkit
这似乎是的一个实现,我猜这就是您获得“正确”值的地方。你有两个问题 首先,
BitcoinKeypair.from_passphrase
从一个passphrase生成一个密钥,但是您自己已经生成了密钥,所以您不需要它,只需使用您拥有的密钥即可(您需要导入binascii
来使用hexlify
):
(另外,BitcoinKeypair
现在似乎已被弃用,或许您应该考虑转向pybitcoin和bitcoinprovatekey
和BitcoinPublicKey
)
其次,您在这两个KDF中的工作因素都相去甚远。对于scrypt,它应该是2^18(您有16个),对于pbkdf2,它应该是2^16(您有1个)
这是一个与WarpWallet页面的结果相同的版本(注意,我在这里使用的是scrypt
,而不是pyscrypt
,因为pyscrypt
在固定迭代次数时想要吃掉我笔记本电脑的全部内存):
s1=scrypt.hash(密码=phrase+'\x01',salt=saltPhrase+'\x01',N=1请解释它是如何工作不正常的。
pip install pyscrypt passlib coinkit
# 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)
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)