La firma ECDSA más corta

Quiero crear una firma ECDSA {r,s}donde rsea muy baja (por ejemplo 1) y se pueda codificar en formato DER en un byte.

¿Cómo calcular el kvalor? Me parece que no depende de nada. ¿Cuál es el valor de klo que produce r=1?

Nota: No me preocupo por la seguridad de mi clave privada mientras publico esta firma.

Respuestas (2)

¿Cuál es el valor de klo que produce r=1?

Es imposible saber eso. Si pudiera derivar rvalores arbitrarios, entonces ECDSA se rompería fundamentalmente. Lo mejor que puede hacer es moler khasta que obtenga una rque tenga una codificación corta.

Por el bien del ejercicio:

k: 55573144136627188774517374788342221967869962622835886499477787746883063622036
r: 771676860789419846973923839003663416737624455477806040640071960112246091

Este nonce será un poco más pequeño que la mayoría cuando esté codificado, pero, por supuesto, si intenta usarlo en una firma, habrá expuesto su clave privada . Si genera esto en secreto, solo puede usar el kvalor una vez y el resultado podría ser, en el mejor de los casos, una diferencia de un par de bytes en la transacción codificada.

Apenas parece valer la pena para ser honesto.

Encontrar r=1es "imposible" en el mismo contexto que la mayoría de las suposiciones criptográficas con respecto a los espacios de búsqueda. Podría ser posible encontrar ese valor si convirtieras cada pieza de materia en el universo cercano en una computadora, pero el esfuerzo para hacerlo es tan irracionalmente grande que no es práctico que alguien lo intente. También es posible crear una billetera que reutilice una sola ktanto como sea posible (y tendría una aceleración no trivial al firmar transacciones), pero esto es demasiado peligroso para usar y, por lo tanto, nunca se sugiere en una conversación seria.
Nada es "grave". Todo es solo un "juego".
Lo suficientemente grave como para describirlo como una respuesta no es apropiado. Además, sería una fuga de privacidad, ya que cada firma identificaría de manera única e irrefutable la billetera que la firmó. Dudo que la velocidad de firma haya sido alguna vez una consideración en una billetera, una sola CPU sería suficiente para volver a firmar cada transacción en todo el historial de la red de Bitcoin en un par de horas (incluso más rápido que verificarlas).
Tengo derecho a hacer con mi clave privada/mis fondos/mi dinero lo que quiera. En este momento quiero usar un kvalor específico para firmar mis transacciones
@PieterWuille Oh, gracias, me lo perdí por completo.
Para tu información : blockchain.info/tx/… rlen=0x15
@PieterWuille hay puntos en secp256k1 con x=1,2,3,4,6,... pero no x=0,5,7,... La otra respuesta da un ejemplo en cadena para x=1 . Curiosamente, aunque no hay ningún punto con x=7, sí lo hay con r=7 (ya que r = x mod n, y x=n+7 sí tiene puntos).

las salidas ecdsa secp256k1 más cortas que he visto tienen

x value = 3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63

0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0 --> 0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63, 0x3f3979bf72ae8202983dc989aec7f2ff2ed91bdd69ce02fc0700ca100e59ddf3
0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1 --> 0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63, 0xc0c686408d517dfd67c2367651380d00d126e4229631fd03f8ff35eef1a61e3c

en su función ecdsa, si usa

p = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141

entonces puedes derivar los resultados anteriores usando

((p-1)/2) = 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0

o

((p+1)/2) = 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1

Si hay algo más pequeño, me gustaría verlo.

Editar

debido a los comentarios, he sido dirigido a un testnet tx que sugiere que tal vez pueda obtener R = 1. gracias a amaclin.

testnet tx c6c232a36395fa338da458b86ff1327395a9afc28c5d2daa4273e410089fd433

este tx parece validar, tambien hay otros, c42bea01f1387072772759f32ad860a680e0eea5664732bf2057a66780e7a25d 23202c2534be0567d4b339142f8a9a53545123eb61f61717cdedbef08

tal vez incluso más, por favor agregue a los comentarios si es así.

si valido la firma de clave pública

026d2204a9535443657a88a0724fbd49a0e78d305f50a82f2cc9dd9bea10a6c5cd

tomado de testnet tx

c6c232a36395fa338da458b86ff1327395a9afc28c5d2daa4273e410089fd433

da este punto donde x = 1

(0x01, 0xbde70df51939b94c9c24979fa7dd04ebd9b3572da7802290438af2a681895441)

Si bien no puedo verificar que este punto esté realmente en la curva sep256k1, parece comportarse como lo está, por lo que es muy interesante.

si multiplico este punto varias veces por 0x5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72 ( valor lambda de aquí )

produce este ciclo de puntos (3 puntos con la misma Y)

(0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee, 0xbde70df51939b94c9c24979fa7dd04ebd9b3572da7802290438af2a681895441)

(0x851695d49a83f8ef919bb86153cbcb16630fb68aed0a766a3ec693d68e6afa40, 0xbde70df51939b94c9c24979fa7dd04ebd9b3572da7802290438af2a681895441)

(0x01, 0xbde70df51939b94c9c24979fa7dd04ebd9b3572da7802290438af2a681895441)

si hago lo mismo con el inverso del punto, obtengo estos (inversos de arriba)

(0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee, 0x4218f20ae6c646b363db68605822fb14264ca8d2587fdd6fbc750d587e76a7ee)

(0x851695d49a83f8ef919bb86153cbcb16630fb68aed0a766a3ec693d68e6afa40, 0x4218f20ae6c646b363db68605822fb14264ca8d2587fdd6fbc750d587e76a7ee)

(0x1, 0x4218f20ae6c646b363db68605822fb14264ca8d2587fdd6fbc750d587e76a7ee)

el valor x

0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee 

en algunos de esos resultados, también pasa a ser el valor beta de aquí

testnet.smartbit.com.au/tx/… - la firma en esta transacción es 30060201010201 (R=1, S=1) y es válida :)
No pude encontrar el rawtx para este tx desde ningún lado. Sospecho que el tx en realidad no verifica, y el generador que generó r = 1, probablemente no fue ecdsa secp256k1. pero creo que podría modificar el valor p y otras variables en la función ecdsa para generar un 1. Este tx probablemente se creó utilizando una función ecdsa personalizada, o simplemente se codificó directamente en él.