Échec du codage de mon convertisseur de clé privée en clé publique (Pyhon)


Je suis actuellement en train de parcourir le livre « Programming Bitcoin by Jimmy Song », je suis resté bloqué à la page 61 (chapitre 3), mais j’ai terminé l’exercice 5 du chapitre 3. ou dans Github

Même si le livre est idéal pour comprendre différents concepts, le code OOP très abstrait du livre rend un peu plus difficile l’acquisition de l’intuition des concepts fondamentaux de bas niveau derrière les principes clés. C’est pourquoi, en plus de faire des exercices, j’aime aussi coder mes propres fonctions procédurales qui résolvent les mêmes problèmes.

J’ai essayé de coder une fonction de conversion de clé priv-to-pub ECC Secp256k1, mais mon implémentation. ne fonctionne tout simplement pas.

Échec du codage de mon convertisseur de clé privée en clé publique (Pyhon)

Il convertit les petits nombres de manière incorrecte et ne convertit pas du tout les gros chiffres.

Le code du script est en bas, j’ai surligné la partie où la fonction s’arrête

#Secp256k1 Bitcoin private to public key converter script a = 0 b = 7 #Order of the finite field prime = 2**256 – 2**32 – 977 #G coordinates gx = gy = #Order of the group G n = #n -1 => est le nombre de toutes les clés privées possibles privées = currentY est None : renvoie None elif currentX == gx et currentY ! = gy : renvoie None elif currentX == gx et currentY == gy et currentY == 0 : renvoie None elif currentX == gx et currentY == gy : s1 = (3 * (gx ** 2) + a) % prime s2 = (gy * 2) % prime #La fonction s’arrête sur s = (s1 * s2 ** (prime – 2)) % prime #Sur cette ligne print( « Addition 1 ») currentX = (s ** 2 – 2 * gx) % prime curre ntY = (s * (gx – courantX) – gy) % prime elif courantX ! = gx : s1 = (courantY – gy) s2 = (courantX – gx) s = (s1 * s2 ** (prime – 2)) % prime currentX = ((s ** 2) – gx – currentX) % prime currentY = ((s * (gx – currentX)) – gy) % prime return (currentX, currentY) def (privateKey, gx, gy, a, b, prime) : si gy**2%prime ! = (gx**3 + a*gx + b)%prime : retourne « Le point n’est pas sur la courbe » coef = privateKey currentX, currentY = gx, gy resultX, resultY = None, None while coef : if coef & 1 : resultX, resultY = addition(currentX, currentY, gx, gy, a, b, prime) currentX, currentY = addition(currentX, currentY, gx, gy, a, b, prime) coef >>= 1 return (resultX, resultX) #privateKey, gx, gy, a, b, prime #Petits nombres (pas Secp256k1). Fonctionne, mais de manière incorrecte. La bonne sortie pour ceci est : (49, 71) print((8, 47, 71, a, b, 223)) #Bigger numbers (Secp256k1). Ne fonctionne pas print((privateKey, gx, gy, a, b, prime))

La fonction principale utilise la technique « Extension binaire », mais il semble que le problème réside dans la fonction « Addition » qui ne l’a pas.

Pour voir quelques résultats, j’ai copié le code OOP du livre, je l’ai refactorisé un peu téléchargé sur github et ça marche :

///MaltoonYezi/Python-DSA/blob/main/Cryptography/SECP256K1OOP.py

J’ai essayé de déboguer le 1er code par moi-même, mais j’ai échoué. Si vous pouviez aider, j’apprécierais !