hash : Vérifier un Bitcoin TRX sur la ligne cmd Unix avec OpenSSL ?


Je souhaite utiliser openssl sur les systèmes Unixoide pour vérifier une transaction. Je marche sur des erreurs lorsque j'essaie de vérifier le hachage d'un bitcoin trx. Ici, je travaille sur Mac OSX et OpenSSL (1.0.2a 19 mars 2015).

Je sais que je peux utiliser le client QT, ou les différentes solutions python/php/java, ce n'est pas le but ici. Je comprends aussi que Bitcoin se déplace vers libsecp256k1… J'ai suivi l'exemple du Pizza trx ici :

Comment fonctionne l'algorithme de vérification ECDSA pendant la transaction ?

hash : Vérifier un Bitcoin TRX sur la ligne cmd Unix avec OpenSSL ?

La vérification n'a pas besoin de la clé privée, seulement de la clé publique, du hachage et de la signature. Openssl propose deux manières de vérifier un résultat :

openssl dgst -sha256 -verify pubkey.pem -signature tmpfile.sig sha256.txt

ou

openssl pkeyutl -verify -pubin -inkey pubkey.pem -sigfile tmpfile.sig -in sha256.txt

La partie délicate est de savoir comment passer de la clé de pub hexadécimale (« 042e930f39…ebcabb ») au format PEM, qu'openssl souhaite vérifier. À la fin, j'ai ajouté les étapes sur la façon dont j'ai transformé la clé hexagonale en PEM.

Lorsque j'utilise le bitocin double sha256 du Pizza trx mentionné (j'en ai également essayé plusieurs autres), j'obtiens cette erreur :

openssl dgst -sha256 -verify pubkey.pem -signature tmpfile.sig sha256.txt Erreur de vérification des données 140735175988048 : erreur : 0D0680A8 : routines d'encodage asn1 : ASN1_CHECK_TLEN : balise incorrecte : tasn_dec.c: 1198 : erreur : 0D07803A : routines d'encodage asn1 :ASN1_ITEM_EX_D2I:erreur asn1 imbriquée:tasn_dec.c:372:Type=ECDSA_SIG

ou avec pkeyutl :

openssl pkeyutl -verify -pubin -inkey pubkey.pem -sigfile tmpfile.sig -in sha256.txt Erreur d'opération de clé publique 140735175988048 : erreur : 0D0680A8 : routines d'encodage asn1 : ASN1_CHECK_TLEN : balise incorrecte : tasn_dec.c:1198 : :erreur: 0D07803A : routines d'encodage asn1 : ASN1_ITEM_EX_D2I : erreur asn1 imbriquée : tasn_dec.c:372 : Type = ECDSA_SIG

Lorsque je crée mes clés privée et pub avec openssl et que je signe une chaîne « demo sha256 », je peux vérifier correctement. Seules ces chaînes Bitcoin Sha256s ne fonctionnent pas. J'ai dû louper quelque chose…

sur la base de plusieurs lectures ici dans stackexchange, j'ai procédé à une ingénierie inverse des clés pem d'openssl. La clé au format pem veut un PEM_prestring (« 3056301006072a8648ce3d020106052b8104000a034200 ») et la clé publique attachée.

$ résultat = 3056301006072a8648ce3d020106052b8104000a034200042e930f39ba62c6534ee98ed20ca98959d34aa9e057cda01cfd422c6bab3667b76426529382c23f42 b9b08d7832d4fee1d6b437a8526e59667ce9c4e9dcebcabb $ result=$( echo $result | sed 's/[[:xdigit:]]\{2\}/\\x&/g' ) $ printf $result > tmpfile $ hexdump -C tmpfile 00000000 30 56 30 10 06 07 2a 86 48 ce 3d 02 01 06 05 2b |0V0…*.H .=….+| 00000010 81 04 00 0a 03 42 00 04 2e 93 0f 39 ba 62 c6 53 |…..B…..9.bS| 00000020 4e e9 8e d2 0c a9 89 59 d3 4a a9 e0 57 cd a0 1c |N……YJ.W…| 00000030 fd 42 2c 6b ab 36 67 b7 64 26 52 93 82 c2 3f 42 |.B,k.6g.d&R…?B| 00000040 b9 b0 8d 78 32 d4 fe e1 d6 b4 37 a8 52 6e 59 66 |…x2…..7.RnYf| 00000050 7c e9 c4 e9 dc eb ca bb ||…….|

Ce sera encodé en base64 et ajoutera un environnement agréable.

$ openssl enc -base64 -in tmpfile -out pubkey.pem $ cat pubkey.pem MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELpMPObpixlNO6Y7SDKmJWdNKqeBXzaAc /UIsa6s2Z7dkJlKTgsI/QrmwjXgy1P7h1rQ3qFJuWWZ86cTp3Ov Kuw==

et nous donnons à pubkey.pem un environnement agréable, pour que cela ressemble à ceci :

—–DEBUT CLÉ PUBLIQUE—– MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELpMPObpixlNO6Y7SDKmJWdNKqeBXzaAc /UIsa6s2Z7dkJlKTgsI/QrmwjXgy1P7h1rQ3qFJuWWZ86cTp3OvKuw== —–FIN PUBLIC CLÉ —–

et vérifiez via asn la structure :

$ openssl asn1parse -in pubkey.pem 0:d=0 hl=2 l= 86 contre : SÉQUENCE 2:d=1 hl=2 l= 16 contre : SÉQUENCE 4:d=2 hl=2 l= 7 prim : OBJET :id-ecPublicKey 13:d=2 hl=2 l= 5 prim : OBJET :secp256k1 20:d=1 hl=2 l= 66 prim : CHAÎNE DE BITS

Les fichiers que j'ai utilisés :

$ cat pubkey.pem —–BEGIN PUBLIC KEY—– MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELpMPObpixlNO6Y7SDKmJWdNKqeBXzaAc /UIsa6s2Z7dkJlKTgsI/QrmwjXgy1P7h1rQ3qFJuWWZ86cTp3OvKuw== –FIN CLÉ PUBLIQUE—– $ cat tmpfile.sig 30450221009908144ca6539e09512b9295c8a27050d478fbb96f8addbc3d075544dc41328702201aa528be2b907d316d2da068dd9eb1 e23243d97e444d59290d2fddf25269ee0e $ chat sha256.txt 692678553d1b85ccf87d4d4443095f276cdf600f2bb7dd44f6effbd7458fd4c2