hash : Signature ECDSA et la valeur "z"


Le calcul des valeurs Z est assez compliqué pour le Joe moyen, j’ai donc créé un site Web pour le faire pour vous.

Les valeurs Z pour l’exemple ci-dessus se trouvent sur cette page.

///tx/

J’ai également séparé les valeurs R et S pour vous faciliter la tâche.

hash : Signature ECDSA et la valeur

Vous pouvez trouver les valeurs R, S et Z pour toutes les transactions bitcoin sur ce site.

D’autres exemples,

///tx/

///tx/

///tx/

///tx/

La réponse renvoie la réponse JSON standard que vous trouvez dans le client principal bitcoin, ainsi que quelques bits supplémentaires que j’ai ajoutés qui affichent les valeurs R, S et Z pour chaque entrée de transaction.

par exemple, voir les nœuds SizR, SigS et SigZ ci-dessous.

: «  », « version » : 1, « locktime » : 0, « vin » : « , « hex » :, « sequence » : 4294967295, « n » : 0, « addr » : «  », « valueSat » : 2500000, « value » : 0.025, « doubleSpentTxID » : null, « sigR » : «  », « sigS » : «  », « sigZ » :,: «  », « vout » : 0, « scriptSig » ::  » « , « hex » :, « sequence » : 4294967295, « n » : 1, « addr » : «  », « valueSat » : 2500000, « value » : 0.025, « doubleSpentTxID » : null, « sigR » : «  », « sigS » : «  », « sigZ » : «  » } ], « vout » : « type » :, « spentTxId » : «  », « spentIndex » : 0, « spentHeight » : 175915 } ], « blockhash » : «  », « blockheight » : 175915, « confirmations » : 309447, « time » : 1334602008, « blocktime » : 1334602008, « valueOut » : 0,05, « size » : 405, « valueIn » : 0,05, « frais » :

Lorsque je recherchais toutes les informations sur ce fil, j’ai créé quelques petites équations d’aide que j’ai beaucoup utilisées lors de mes expériences.

K = ((Z + (X * R)) / S) % N

X = (((S * K) – Z) / R) % N

Z = ((S * K) – (X * R)) % N

S = ((Z + (X * R)) / K) % N

R = (((S * K) – Z) / X) % N

Dans mes équations ci-dessus,

X est l’hexagone de la clé privée,

K multiplié par la valeur sep256k1 G produit un ECPoint dont la valeur x = R

Ainsi, à partir de R, vous pouvez vérifier que vous avez la bonne valeur K, et si vous avez la bonne valeur K, vous pouvez alors obtenir la bonne valeur X, qui est l’hexagone de la clé privée de l’adresse dans l’entrée de transaction.

Et voici un exemple de code C#.

utiliser le système ; en utilisant System.Linq ; en utilisant Org.BouncyCastle.Math ;; GrandEntier S = nouveau GrandEntier(StringToByteArray(«  »)); GrandEntier Z = nouveau GrandEntier(StringToByteArray(«  »)); GrandEntier X = nouveau GrandEntier(StringToByteArray(«  »)); GrandEntier K = nouveau GrandEntier(StringToByteArray(«  »)); GrandEntier N = nouveau GrandEntier(StringToByteArray(«  »)); //prouver R = (((S * K) – Z) / X) % N var verifyR = S.Multiply(K).Subtract(Z).Multiply(X.ModInverse(N)).Mod(N); Console.WriteLine(« R =  » + string.Concat(verifyR.ToByteArrayUnsigned().Select(b => b.ToString(« X2 »)))); //prouver S = ((Z + (X * R)) / K) % N var verifieS = Z.Add(X.Multiply(R)).Multiply(K.ModInverse(N)).Mod(N); Console.WriteLine(« S =  » + string.Concat(verifyS.ToByteArrayUnsigned().Select(b => b.ToString(« X2 »)))); //prouver Z = ((S * K) – (X * R)) % N var verifyZ = S.Multiply(K).Subtract(X.Multiply(R)).Mod(N); Console.WriteLine(« Z =  » + string.Concat(verifyZ.ToByteArrayUnsigned().Select(b => b.ToString(« X2 »)))); //prouver X = (((S * K) – Z) / R) % N var verifyX = S.Multiply(K).Subtract(Z).Multiply(R.ModInverse(N)).Mod(N); Console.WriteLine(« X =  » + string.Concat(verifyX.ToByteArrayUnsigned().Select(b => b.ToString(« X2 »)))); //prouver K = ((Z + (X * R)) / S) % N var verifyK = Z.Add(X.Multiply(R)).Multiply(S.ModInverse(N)).Mod(N); Console.WriteLine(« K =  » + string.Concat(verifyK.ToByteArrayUnsigned().Select(b => b.ToString(« X2 »)))); Console.ReadLine().Range(0, hex.Length).Where(x => x % 2 == 0).Select(x => Convert.ToByte(hex.Substring(x, 2), 16 )).ToArray();

Et le même code en python

bb) : dernierreste, reste = abs(aa), abs(bb) x, dernierx, y, dernier = 0, 1, 1, 0 tandis que reste : dernierreste, (quotient, reste) = reste, divmod (lastremainder, rest) x, lastx = lastx – quotient*x, x y, lasty = lasty – quotient*y, y return lastremainder, lastx * (-1 if aa < 0 else 1), lasty * (-1 if bb < 0 else 1) def modinv(a, m) : g, x. m) if g ! = 1 : raise ValueError return x % m R = S = Z = X = K = N = #proving R = (((S * K) - Z) / X) % N print hex((((S * K) - Z) * ​​modinv(X,N)) % N) #proving S = ((Z + (X * R)) / K) % N imprimer hex(((Z + (X * R)) * modinv(K,N)) % N) #prouver Z = ((S * K) - (X * R)) % N print hex(((S * K ) - (X * R)) % N) #prouver X = (((S * K) - Z) / R) % N print hex((((S * K) - Z) * ​​modinv(R,N) ) % N) #prouver K = ((Z + (X * R)) / S) % N print hex(((Z + (X * R)) * modinv(S,N)) % N)