Scrypt和PBKDF2算法 - Python

时间:2017-03-08 16:01:43

标签: python cryptography python-2.x pbkdf2 scrypt

我试图在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

1 个答案:

答案 0 :(得分:1)

这似乎是WarpWallet的一个实现,我猜你正在获得“正确”值。你有两个问题。

首先BitcoinKeypair.from_passphrase从密码短语中生成一个密钥,但您已经自己生成了密钥,因此您不需要这个 - 您只需使用您拥有的密钥(您需要导入{{ 1}}使用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) 似乎已被弃用,或许你应该考虑转向pybitcoin以及BitcoinKeypairBitcoinPrivateKey)。

其次,你在两个kdf中的工作因素都很偏僻。对于scrypt它应该是2 ^ 18(你有16)而对于pbkdf2它应该是2 ^ 16(你有1)。

这是一个与WarpWallet页面提供相同结果的版本(注意我在这里使用的是BitcoinPublicKey而不是scrypt,因为当我修复时pyscrypt想吃我的笔记本电脑的整个内存迭代计数):

pyscrypt