Comment décompresser une clé publique ?


Les points sont décompressés en résolvant y dans l'équation utilisée pour la courbe elliptique de secp256k1 où x correspond aux 32 derniers octets de votre clé publique. L'équation est y^2 = x^3 + 7. Vous obtiendrez 2 valeurs y possibles, une paire et une impaire. La bonne est indiquée par l'octet de préfixe de votre clé publique qui indique si y est pair ou impair.

Notez que toutes les opérations doivent être modulo p qui est défini par la spécification secp256k1 comme étant.

Ce script python décompressera les deux clés publiques que vous avez postées  :

Comment décompresser une clé publique ?

from_bytes(pk[1 :33]byteorder= »big ») y_sq = (pow(x (p + 1) // 4 byteorder= »big ») return b'unhexlify('unhe xlify(''))).decode())

Les clés publiques non compressées sont  :

04

La décompression Pubkey est complètement différente et n'a aucun rapport avec la génération d'adresses. Les adresses sont générées en prenant une clé publique telle quelle (comprimée ou non), en la hachant, puis en l'encodant. La compression est importante car le public sérialisé résultant produira un hachage (et donc une adresse) lorsqu'il est compressé, et un hachage différent (et donc une adresse différente) lorsqu'il est décompressé.

Les adresses sont codées en hachant la clé publique sérialisée avec SHA256 puis avec RIPEMD160. Le hachage résultant est codé à l’aide du codage Base58 Check.

Dans la transaction que vous avez fournie, les trois clés publiques  :

022

ont respectivement les hachages suivants  :

Encodage de celles-ci en tant qu'adresses de version 0 avec Base 58. Vérifiez les résultats d'encodage dans les adresses que vous attendez  :

Le code que j'ai utilisé pour cela est :

new('sha256', s).digest() def ripemd160(s) : return hashlib.new('ripemd160 ', s).digest() def hash256(s) : return sha256(sha256(s)) def hash160(s) : return ripemd160(sha256(s)) def encode(b) : # Convertir les octets big-endian en entier n = int('0x0' + binascii.hexlify(b).decode('utf8'), 16) # Divisez cet entier en bas58 res = []

join(res[ ::-1]) # Encodez les zéros non significatifs en zéros base58 import sys czero = b' version) : data = version + b somme de contrôle = hash256(data)[0 :4]

b' b' b'\x00'))

com/bitcoin-core/HWI/blob/master/hwilib/base58.py)

Comme vous pouvez le voir, cela n’effectue aucune compression ou décompression ponctuelle. Au lieu de cela, il prend la clé publique telle quelle et la code.