使用Scrypt和PBKDF2-Python的算法

使用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

我已经尝试在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 = 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)