¿Cómo recuperar el público de la firma tx (r, s) y verificar la firma?

Mi primera pregunta es cómo verificar la firma usando solo r, s y el parámetro de curva elíptica, y una dirección (que tiene un hash de clave pública, por lo que no puede recuperar la clave pública de la dirección).

La siguiente pregunta es, ¿por qué ethereum (también creo que bitcoin) usa una clave pública hash como dirección en lugar de usar directamente la clave pública como dirección?

Respuestas (3)

Tal vez esta respuesta pueda ayudarlo: https://ethereum.stackexchange.com/a/33346/16729

El modelo de seguridad de Ethereum se basa en la criptografía de curva elíptica (ECC) para firmar y validar transacciones. En ECC, la clave pública y privada se utilizan para firmar y verificar. No tiene concepto de direcciones. Al firmar y verificar transacciones no necesita direcciones. El documento original de bitcoin no menciona direcciones en absoluto. Aparecen más tarde en un esfuerzo por hacerlos más fáciles de recordar (la clave pública comprimida es de 32 bytes frente a la dirección de 20 bytes). Ahora puede ocultar completamente la clave pública de la interacción del usuario y solo tener claves y direcciones privadas. Pero internamente ethereum sigue usándolos para validar transacciones.

Pero internamente sigue usándolos para validar Tx... Todavía no lo entiendo. Debido a que la carpeta del almacén de claves (donde está cifrada la clave privada y la clave pública se guarda como un archivo) solo se encuentra en mi nodo, no en todos los nodos. Pero, ¿cómo otros nodos conocen mi clave pública para validar mi transacción?
Hay un desafío donde habla de direcciones y cuentas. Todavía no puedo leer el hilo porque no terminé el desafío y no quiero leer spoilers. Pero creo que te puede ser útil. Aquí está el reddit: reddit.com/r/capturetheether
@Kronos Ethereum usa una propiedad matemática para recuperar la clave pública de una transacción firmada y luego deriva la dirección aplicando la función hash keccak256 (busque la recuperación de la clave pública ECDSA para los detalles matemáticos).
  1. En términos de seguridad:

La clave pública en todos los esquemas criptográficos está relacionada con la clave privada . La única medida segura que impide que un usuario calcule su clave privada a partir de su clave pública es la suposición de que el logaritmo discreto es "imposible de resolver".

Todos sabemos que la criptografía cuántica se acerca cada día más, y el problema que esto presenta es que resolver logaritmos discretos es "fácil" si estás ejecutando una PC/CPU cuántica . Entonces, teniendo el Pk, será posible obtener el Sk (clave privada).

Para anticipar eso, si solo tiene acceso al hash del Pk, no lo sabe, por lo que incluso con la criptografía cuántica (hasta ahora parece que el cuántico no podrá pasar funciones hash tan fácilmente ), estás seguro.

Más información sobre la resistencia de las funciones hash a la criptografía cuántica aquí.

  1. En términos de gasto de gas.

La longitud de una clave pública es mucho mayor que su hash, que siempre es una variable de 256 bits . Entonces, si cuenta todas las transacciones que se realizan en un día, está ahorrando mucho combustible en las transacciones porque las claves públicas harán que los mineros y los nodos procesen/almacenen muchos más datos porque son mucho más grandes que sus hashes.

Puedo ampliar más la explicación si lo necesita, pero esencialmente, esto es todo.

EDIT COMO estás pidiendo en los comentarios, aquí tienes un tema en el que se explica cómo recuperar el Pk de su hash.

Obtenga la clave pública de cualquier cuenta de ethereum

Espero eso ayude.

No estoy preguntando cómo recuperar la clave privada de la clave pública. Estoy preguntando cómo verificar la firma sin clave pública. Porque el minero solo conoce su dirección, no la clave pública. Pero la dirección está truncada por hash, por lo que no es posible recuperar la clave pública de una dirección.
@Kronos Tiene razón, no puede obtener una clave pública de una dirección. Pero puede obtener la clave pública de una transacción enviada por esa dirección. Entonces, en la práctica, solo es posible obtener la clave pública de una dirección si esa dirección ha enviado al menos 1 transacción.
¿Sabes cómo obtener la clave pública de un tx? Porque también verifiqué el valor de la transacción usando eth.getTransaction, pero no veo ninguna pista para recuperar un público de él.
@JesseBusman tiene razón, lo recupera de los detalles de tx, los mira en los registros o en etherscan. Una cosa a agregar es que como está formulada tu pregunta, no tiene sentido el comentario que dejaste. Usted preguntó por qué los Pk tienen hash, y esta fue la respuesta a esa pregunta.
@ CPereez19 ¿Qué significan Pk y Sk en su explicación? Como tanto la "clave pública" como la "clave privada" se abreviarían como "PK" o "pk", no es tan distinto para mí.
crypto.stackexchange.com/questions/18105/… esta podría ser la respuesta a mi pregunta.
@TorstenS dado que la "clave privada" también se abrevia como pk, no puede distinguir entre los dos. Es por eso que las claves privadas se denominan "claves secretas", abreviadas Sk
@ CPereez19 de etherscan, solo hay direcciones, hash de bloque y hash de tx, aviso, eso es todo. Todavía no puedo entender cómo obtener el público de tx.
@Kronos, esto es lo que está buscando: github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md Y aún pensando que le respondí correctamente, su pregunta no era buena para recuperar el Pk de es hachís..
@ CPereez19 Un hash truncado no aumenta la seguridad, tiene 2^160 direcciones para 2^256 claves privadas, lo que significa que tiene 2^96 claves privadas que comparten la misma dirección.
@Ismael Estoy hablando de la resistencia de las funciones Hash a la criptografía cuántica frente a los criptosistemas reales como El-Gamal, Diffie Helman, ECDSA, DSA, RSA, etc. Aquí tiene una referencia: crypto.stackexchange.com/questions/59375/…
@ CPereez19 Tal vez para bitcoin, las direcciones solo tienen un uso, tiene sentido, pero para ethereum no es muy útil, porque si alguna vez firmó una transacción, cualquiera puede calcular la clave pública.
No me explico bien por lo que veo.. Hoy en día, si tienes la clave pública, no puedes hacer casi nada (existen pocos ataques de complejos de trazabilidad pero no es el propósito de explicarlos). Pero aparte del ahorro de memoria (Hash es más corto que Pk) con la criptografía cuántica, puede obtener fácilmente el Sk del Pk. Con el H (Pk), puede realizar la transacción de manera segura y, como dijo, ahora su dirección pública puede ser visible para cualquier persona, por lo que puede mover el éter a otra cuenta y mantenerlo seguro hasta la próxima transacción. Por eso se recomienda no reutilizar una cuenta.
@ CPereez19 Dices que el logaritmo discreto para ECC se resuelve en computadoras cuánticas, por lo que con Pk obtienes fácilmente Sk. Y con H (Pk) y una transacción firmada, puede aplicar la recuperación de ECDSA y obtener Pk de manera trivial. Por lo tanto, tener H() aplicado aumenta la seguridad, pero solo cuando no reutiliza las direcciones, es decir, Bitcoin. Si reutiliza direcciones como en Ethereum, no aumenta la seguridad.

Descubrí cómo recuperar la clave pública de tx (firma, r y s) y su dirección.

Primero, así es como se genera la firma, el público es B, y la clave privada es d, donde B = dA. (multiplicación en curva elíptica). Es REALMENTE difícil (o simple, porque no sabemos si P=NP o no), por lo que no podemos recuperar dde By A.

ingrese la descripción de la imagen aquí

Y el público se puede recuperar de la siguiente manera, y el número de candidatos de clave pública es dos, porque solo conocemos la coordenada x de R. Por lo tanto, es fácil encontrar una clave pública cuya clave pública sea real a partir de la dirección.

ingrese la descripción de la imagen aquí

la prueba es la siguiente,

ingrese la descripción de la imagen aquí

por favor corrígeme si algo está mal. Parece que hay una función útil en https://github.com/cryptocoinjs/secp256k1-node.recover(Buffer message, Buffer signature, Number recovery [, Boolean compressed = true]) para recuperar la clave pública .

Eso es ECDSA basado en la curva secp256k1. Solo puede recuperar la información si conoce el período del generador del grupo Cyclyc. De lo contrario, hoy en día es imposible conseguirlo. Esto es lo mismo que decir en RSA que solo puede recibir el mensaje si conoce el Sk. porque el logaritmo discreto es muy difícil de resolver. Además, decirte que Pk y Sk son puntos de la curva elíptica. A partir de aquí es donde nacen los maridajes y demás componentes principales de ZkSnarks. Aquí tienes buenas conferencias para aprender sobre eso.
@ CPereez19 Así es, necesito saber qué curva se usa (todos los parámetros que necesito saber) para recuperar la clave pública.