Se puede firmar un mensaje y recuperar su clave pública de firma dada la firma y el hash del mensaje...
signature = web3.personal.sign(<account>,<message hash>)
pubKey = web3.personal.ecRecover(<message hash>, <signature>)
¿Hay alguna forma de recuperar el hash del mensaje con una firma y una clave pública?
No, no puede recuperar el hash del mensaje de una firma ECDSA. La firma se calcula generando (x, y) = kG
donde k
es el nonce secreto y G
es el generador de la curva. Entonces r = x
y s = k^(-1)(z + rd)
donde z
esta el mensaje y d
esta la clave privada. Podemos recuperar la clave pública dG
al ver eso r^(-1) (kGs - zG) = dG
. Pero tratar de hacer lo mismo z
solo resultará en zG
, ya que no lo sabemos k
, solo kG
. El resultado z
dado zG
es exactamente el DLP en la curva elíptica y no es factible de calcular.
Edición 2: se debe tener en cuenta que, si bien calcular el hash del mensaje no es factible, es posible verificar las conjeturas, si el mensaje no se saltó antes del hash (que generalmente no lo es). Entonces, si el mensaje proviene de un pequeño conjunto de posibilidades, entonces se puede recuperar.
Editar: enlaces para leer más
https://en.m.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm
Malone