Escribí mi propio algoritmo de firma ECDSA solo con el propósito de crear pruebas unitarias.
Con él creé dos firmas que entraron en la transacción 56ec7ca7df... , enviando desde 1GXFXm3es... . Estas firmas utilizaron los mismos valores de k, aunque los valores de k nunca deben reutilizarse.
Más tarde, alguien pudo robar 0.0016 btc de 1GXFXm3es.... y enviarlos a 17WRjamox6VhTUaHsTWfFnMNDYHvwCtWio.
Entonces, alguien debe estar monitoreando la cadena de bloques en busca de errores como este y robando fondos si los encuentra.
¿Cómo deriva la clave privada de dos firmas que comparten el mismo valor k?
Las firmas ECDSA son pares (r,s) donde r=(k G).x mod n, y s = (m + r x)/k mod n, donde x es la clave secreta, k es el nonce aleatorio y m es el mensaje.
Si tiene dos valores s1 y s2 para la misma clave secreta y con el mismo nonce k (y por lo tanto el mismo valor r), se cumple lo siguiente:
De ahí podemos derivar:
Entonces, no solo hizo que sea trivial detectar firmas con el mismo nonce (tienen un valor r reconocible), hay una fórmula trivial para calcular la clave privada una vez que alguien ve dos firmas.
Este tipo de ataque se conoce y explota activamente en la red Bitcoin desde al menos 2013: https://bitcointalk.org/index.php?topic=271486.0 . No reutilice los valores de k. Utilice RFC6979 para generarlos de manera determinista pero segura.
También tenga en cuenta que no es suficiente que los nonces sean diferentes . Tampoco pueden estar relacionados de una manera conocida. Por ejemplo, no puede usar k para una firma y k+1 para el siguiente trabajo.
Si conoce dos firmas sobre un número aleatorio, puede calcular la clave privada.
¡¡Es simple!!
2. https://2xoin.com/getRSZfromRawTX/
"sigR": "00db0c51cc634a4096374b0b895584a3ca2fb3bea4fd0ee2361f8db63a650fcee6",
"sigS": "59a23e4521da413a2c7d0f9a668eedc2e5eac88347c67c48dcca0128fda1cad7",
"sigZ": "4b2cdf712dc7d3fac8e7ed63b3a2e806556ca7d5c30ed5f4b34dbb2a12b0c18f",
"pubKey": "02ac75a5bd9640d55b8300fad347740ac447e4604fbc59260c2dce39f356a0558f",
"sigR": "00db0c51cc634a4096374b0b895584a3ca2fb3bea4fd0ee2361f8db63a650fcee6",
"sigS": "39d5e056231a5823dc0957e3d0fa3923ce71f781ad67140a6433fe6829bdf811",
"sigZ": "1cd506860c52d7e042f56b33a856b94fdefa3bcc808a06dd3b82619db2c01969",
"pubKey": "02ac75a5bd9640d55b8300fad347740ac447e4604fbc59260c2dce39f356a0558f",
posible k = 539
Clave pública: C 02db0c51cc634a4096374b0b895584a3ca2fb3bea4fd0ee2361f8db63a650fcee6
posible k = fffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0363c08
Clave pública: C 03db0c51cc634a4096374b0b895584a3ca2fb3bea4fd0ee2361f8db63a650fcee6 !!!!!
Clave privada = 79c7f119413edb1a9a9a2ea655196e0e3b6380b6d612dcc69c7c143816c8ef29
C L1JSKFNgNh7FyNw642ofHzivm8ua4EqpEqZyVQ8rmC6q6S9RgzYj
¡Aqui esta la respuesta a tu pregunta!
David Grayson
k
valores teniendo en cuenta la maleabilidad de las transacciones, consulte mi respuesta: bitcoin.stackexchange.com/a/35850/6091