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  :

c : 1198  : erreur  : 0D07803A  : routines d'c :372 :Type=ECDSA_SIG

ou avec pkeyutl  :

c :1198  : :erreur : 0D07803A  : routines d'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…

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

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

pem un environnement agréable, pour que cela ressemble à ceci  :

  • —DEBUT CLÉ PUBLIQUE—– /UIsa6s2Z7dkJlKTgsI/== —–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—– /UIsa6s2Z7dkJlKTgsI/== –FIN CLÉ PUBLIQUE—– $ cat tmpfile.sig $ chat sha256.txt