¿Cómo deriva la clave privada de dos firmas que comparten el mismo valor k?

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?

Para obtener más información sobre cómo encontrar kvalores teniendo en cuenta la maleabilidad de las transacciones, consulte mi respuesta: bitcoin.stackexchange.com/a/35850/6091

Respuestas (3)

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:

  • s1 = (m1 + r*x)/k
  • s2 = (m2 + r*x)/k

De ahí podemos derivar:

  • s1 * k = m1 + r*x
  • s2 * k = m2 + r*x
  • (s1 - s2) * k = m1 - m2
  • k = (m1 - m2) / (s1 - s2)
  • x = (s1 * (m1 - m2) / (s1 - s2) - m1) / r
  • x = (m1 s2 - m2 s1) / (r*(s1 - s2)) (todos mod n)

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.

Gracias. Quería firmas deterministas, así que simplemente ingresé un número fijo para mis pruebas unitarias. Pero RFC6979 es una solución mucho mejor.
Terminé implementando RFC6979 y facilitó mucho la interacción con las firmas.

Si conoce dos firmas sobre un número aleatorio, puede calcular la clave privada.

¡¡Es simple!!

1. https://blockchain.info/tx/56ec7ca7dfea1c105acf0974331686e973b737e1fd97fc7f970a0cf0882ba7ac?format=hex

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!