2017-03-08 1 views
0

J'ai essayé de reproduire cet algorithme sur Pythonalgorithme avec Scrypt et PBKDF2 - Python

(tuyaux signifi ajouter 0x1 ou 0x2 à la passphrase)

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) 

Et je fait ceci:

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

Le problème est que cela ne fonctionne pas correctement, car il génère cette

bitcoin address: 1HvAip4QGWqPJoh8nxLmRAXtbuVj9AKGHq 

Wif: 5Kd3D34oALv33x7RMAPrrsNtidZjQekdWHXWGXW6cs2SnRkKUR2 

mais la sortie correcte est la suivante:

bitcoin address: 1MGKWPZEqJh9JzCPYYsKFEo9w8E2GXmzA7 

Wif: 5KXwsERJKvUZde3qHboJFz1gF6B15Xt7TB22bRWoGzgN3FHxqyR 

quelqu'un peut me aider? Merci.

Ici il y a le code entier: http://pastebin.com/QL0tQ83v


Pour utiliser ce script, vous devez installer ces bibliothèques:

pip install pyscrypt passlib coinkit 
+0

veuillez expliquer comment cela ne fonctionne pas correctement. –

Répondre

1

Cela semble être une mise en œuvre de WarpWallet, qui est l'endroit où je suppose vous obtenez vos "bonnes" valeurs. Vous avez deux problèmes.

Tout d'abord BitcoinKeypair.from_passphrase génère une clé à partir d'un mot de passe, mais vous avez déjà généré la clé vous-même, de sorte que vous n'avez pas besoin, vous pouvez simplement utiliser la touche que vous avez (vous aurez besoin d'importer binascii utiliser 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) 

(également BitcoinKeypair semble être dépréciée maintenant, peut-être vous devriez examiner et de passer à pybitcoin BitcoinPrivateKey et BitcoinPublicKey). Deuxièmement, vos facteurs de travail dans les deux kdfs sont loin. Pour scrypt il devrait être 2^18 (vous avez 16) et pour pbkdf2 il devrait être 2^16 (vous avez 1).

est ici une version qui donne le même résultat que la page WarpWallet (note que je utilise scrypt ici plutôt que pyscrypt, comme pyscrypt voulait manger toute la mémoire de mon ordinateur portable quand je fixe le nombre d'itérations):

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)