Original topic : Bitcoin Message Tool - command-line signer & verifier
Introduction
Un outil léger entièrement open-source en CLI pour signer et vérifier vos messages Bitcoin. Le message Bitcoin est le moyen le plus simple et le plus naturel de prouver la propriété d'une adresse donnée sans révéler d'informations confidentielles.
Cet outil suit de près les spécifications décrites par BIP137 :
"...Bien qu'aucun BIP n'ait été rédigé sur la manière de signer numériquement des messages avec des clés privées Bitcoin avec des adresses P2PKH, il s'agit d'un processus assez bien compris. Cependant, avec l'introduction des adresses Segwit (sous la forme de P2SH et bech32), il n'est pas clair comment distinguer une adresse P2PKH, P2SH, ou bech32 d'une autre. Ce BIP propose un format de signature standard qui permettra aux utilisateurs de faire la distinction entre les différents formats d'adresse."
Il convient de noter que :
"Comme ce format inclut les clés P2PKH, il est rétrocompatible, mais il faut garder à l'esprit que certains logiciels vérifient les plages d'en-têtes et signalent les nouveaux types d'en-têtes segwit comme des erreurs."
Vous pouvez trouver plus d’informations ici : https://github.com/bitcoin/bips/blob/master/bip-0137.mediawiki
Les wallets qui prennent en charge les signatures de type BIP137 sont :
1) Trezor
2) Sparrow Wallet
3) Coldcard?
4) ...
Le but de cet outil est d'essayer d'étendre l'utilisation de cette norme.
Installation
1) Pour l'installer avec pip, exécutez :
pip install bitcoin-message-tool
Vous pouvez créer un environnement virtuel pour cette application et l'exécuter à partir de là, par exemple en utilisant Poetry.
Créez un nouveau dossier (bmt pour raccourcir Bitcoin Message Tool ou le nom de votre choix) :
poetry new bmt
cd ./bmt
Créez un nouvel environnement virtuel :
poetry install
poetry shell
Téléchargez l’application depuis PyPi avec la commande suivante :
poetry add bitcoin-message-tool
Pour l'exécuter à partir du terminal, utilisez la commande suivante :
python3 -m bitcoin_message_tool
Lorsque vous exécutez l'application sans consignes spécifiques, un message d'aide s'affiche.
2) Sinon, vous pouvez télécharger le code source directement depuis GitHub via cette commande :
git clone https://github.com/shadowy-pycoder/bitcoin_message_tool.git
ou vous pouvez forker le repo et ensuite cloner la version forkée
Installer les dépendances avec cette commande :
pip install -r /path/to/requirements.txt
Pour exécuter une application à partir du repo forké ou cloné, vous pouvez simplement utiliser ce qui suit :
python3 /path/to/bmt.py -h
Comment utiliser Bitcoin Message Tool ?
Le test suivant devrait donner une image claire de la façon de signer et de vérifier les messages avec cet outil en ligne de commande.
Usage basique :
python -m bitcoin_message_tool -h
ou
python bmt.py -h
usage: python3 bmt.py [-h] {sign,verify} ...
Bitcoin message signing/verification tool
Consignes :
{sign,verify}
options:
-h, --help Montre ce message d'aide et termine la commande.
Signer un message :
python bmt.py sign -h
usage: python3 bmt.py sign [-h] -p -a {p2pkh,p2wpkh-p2sh,p2wpkh} -m [MESSAGE ...] [-d] [-v]
options:
-h, --help Montre ce message d'aide et termine la commande.
Signer un messsage:
-p, --privkey Clé privée en format WIF
-a {p2pkh,p2wpkh-p2sh,p2wpkh}, --addr_type {p2pkh,p2wpkh-p2sh,p2wpkh}
Type d'adresse Bitcoin
-m [MESSAGE ...], --message [MESSAGE ...]
Message à signer
-d, --deterministic Signer (RFC6979)
-v, --verbose Afficher le message signé à l'écran
Exemple : Signature pour une clé privée compressée et une adresse p2pkh
$python bmt.py sign -p -a p2pkh -m ECDSA is the most fun I have ever experienced
PrivateKey(WIF):
Cela affiche en output :
Bitcoin address: 175A5YsPUdM71mnNCC3i8faxxYJgBonjWL
Message: ECDSA is the most fun I have ever experienced
Signature: IBuc5GXSJCr6m7KevsBAoCiX8ToOjW2CDZMr6PCEbiHwQJ237LZTj/REbDHI1/yelY6uBWEWXiOWoGnajlgvO/A=
Le même output avex -v/--verbose :
-----BEGIN BITCOIN SIGNED MESSAGE-----
ECDSA is the most fun I have ever experienced
-----BEGIN BITCOIN SIGNATURE-----
175A5YsPUdM71mnNCC3i8faxxYJgBonjWL
IBuc5GXSJCr6m7KevsBAoCiX8ToOjW2CDZMr6PCEbiHwQJ237LZTj/REbDHI1/yelY6uBWEWXiOWoGnajlgvO/A=
-----END BITCOIN SIGNATURE-----
Vérification d’un message :
python bmt.py verify -h
usage: python3 bmt.py verify [-h] -a ADDRESS -m [MESSAGE ...] -s SIGNATURE [-v] [-r]
options:
-h, --help Montre ce message d'aide et termine la commande.
Verify messsage:
-a ADDRESS, --address ADDRESS
Adresse Bitcoin spécifiée.
-m [MESSAGE ...], --message [MESSAGE ...]
Message à vérifier.
-s SIGNATURE, --signature SIGNATURE
Signature Bitcoin en format base64.
-v, --verbose Afficher le message complet.
-r, --recpub Récupérer la clé publique.
Exemple : Vérification d’un message en mode « verbose »
python bmt.py verify -a 175A5YsPUdM71mnNCC3i8faxxYJgBonjWL \
> -m ECDSA is the most fun I have ever experienced \
> -s HyiLDcQQ1p2bKmyqM0e5oIBQtKSZds4kJQ+VbZWpr0kYA6Qkam2MlUeTr+lm1teUGHuLapfa43JjyrRqdSA0pxs= \
> -v
Output :
True
Message verified to be from 175A5YsPUdM71mnNCC3i8faxxYJgBonjWL
D'autres exemples et le code source sont disponibles ici : https://github.com/shadowy-pycoder/bitcoin_message_tool
Tests avec Sparrow Wallet
Vérifions une signature SegWit avec un vrai wallet :
Résultat :
Vérifions une signature SegWit créée par cet outil :
Résultat :