【问题标题】:Algorithm with Scrypt and PBKDF2 - Python使用 Scrypt 和 PBKDF2 的算法 - Python
【发布时间】:2023-03-16 20:23:01
【问题描述】:

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

【问题讨论】:

  • 请解释它是如何无法正常工作的。

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


【解决方案1】:

这似乎是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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-19
    • 2016-12-18
    • 2013-09-14
    • 2018-05-28
    • 2018-01-01
    • 1970-01-01
    • 2013-06-17
    • 2019-08-17
    相关资源
    最近更新 更多