2017-03-08 110 views
0

我試圖重現Python的算法Scrypt和PBKDF2 - 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 
0它不能正常工作

,但正確的輸出是這樣的:

bitcoin address: 1MGKWPZEqJh9JzCPYYsKFEo9w8E2GXmzA7 

Wif: 5KXwsERJKvUZde3qHboJFz1gF6B15Xt7TB22bRWoGzgN3FHxqyR 

有人能幫助我嗎?謝謝。

這裏有整個代碼:http://pastebin.com/QL0tQ83v


要使用這個腳本,你需要安裝這些庫:

pip install pyscrypt passlib coinkit 
+0

請解釋它如何無法正常工作。 –

回答

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)。

其次,你們在kdfs中的工作因素還有一段路要走。對於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)