带有SCRYPT和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和BitcoinPrivateKeyBitcoinPublicKey)。

其次,您在两个KDF中的工作因素都处于遥不可及的状态。对于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)

相关内容

  • 没有找到相关文章

最新更新