Comment est déterminée la clef publique ?
Bitcoin en utilise une particulière, la secp256k1. Sur cette courbe on définit l'opération "addition de point" et on y prend un point précis, appelé G.
Une clé privée pk est seulement un nombre.
La clé publique est alors (pk * G), c'est-à-dire (G + G + G + ... + G).
C'est donc un point avec deux coordonnées: x et y. Lorsque qu'on veut la transformer en "texte", il y a deux façons de faire (une clé publique, et donc une clé privée correspond donc à DEUX adresses): une méthode "non-compressée" (ce qui a été utilisé par défaut au début) et une "compressée".
- Non-compressée: préfixe+X+Y
- préfixe = '04'
- X est la valeur de x en hexadécimal, de longueur 32 octets (64 caractères hexadécimaux, on remplit de '0' à gauche si x est trop petit)
- Y est la valeur de y en hexadécimal, de longueur 32 octets (64 caractères hexadécimaux, on remplit de '0' à gauche si y est trop petit)
- Compressée: préfixe+X
- préfixe = '02' si Y est pair, et '03' si Y est impair
- X est la valeur de x en hexadécimal, de longueur 32 octets (64 caractères hexadécimaux, on remplit de '0' à gauche si x est trop petit)
Par exemple:
Prenons la clé privée 14063D4FCF4C0F0BFDB1E152BC18EBE286FE7CDA3B0E4115062EAE81D573048A en hexadécimal, c'est-à-dire 9057281212247872144055363307744826308390942297983618612007248844883030639754 en décimal (preuve)
La clé publique est le point ayant pour coordonnées:
- x=92696E83591C650907DCDFFBF966F8FA932C16462F0D248E05F8C6F4C3CC82DA en hexadécimal
- y=8898735D0F504066F2F1ED97C14C257A30E920D0D03F81B69614ACF699544965 en hexadécimal
Les équivalents en texte sont donc:
- 0292696E83591C650907DCDFFBF966F8FA932C16462F0D248E05F8C6F4C3CC82DA8898735D0F504 066F2F1ED97C14C257A30E920D0D03F81B69614ACF699544965
- 038898735D0F504066F2F1ED97C14C257A30E920D0D03F81B69614ACF699544965 (03 car y est impair)
Les hash160 correspondants sont ripemd160(sha256(publickey)) où publickey est la version binaire des 02xxx et 03xxx ci-dessus. La conversion est primordiale!
Ce qui donne '4a8299e0b5e21692a99b99cc552a8f77df6ee307' et 'aa1abed018c83ff17055fdfbe9fed3e0530c4512'
Liens utiles:
https://www.bitaddress.org
http://www.fileformat.info/tool/hash.htm
http://fr.wikipedia.org/wiki/Cryptographie_sur_les_courbes_elliptiques
http://fr.wikipedia.org/wiki/Courbe_elliptique