es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python ECDSA no puede verificar la firma.

Estoy tratando de verificar una firma de Bitcoin utilizando ECDSA en Python, pero me resulta muy difícil, muchos intentos ya han fallado.

Los parámetros:

dirección: 33ELcBdg6W7parjGxNYUz5uHVHwPqopNjE

mensaje: hzpPiNlB

firma (base64): I2fKdGNtR5owOWVoWchMVWwC/gf4qyYZ8G+kvuR7CaBhU/0SO149a3/ylBaiVWzfUoXI5HlgYPjkrptk0HfW1NQ=

Nota: He convertido la firma de base64 a una cadena hexadecimal, ya que eso es lo que requiere ECDSA. Cada vez que intento verificarla, dice:

Firma esperada de 64 bytes (cadena hexadecimal de 128), se proporcionó una firma de 65 bytes (cadena hexadecimal de 130)

He revisado muchas preguntas sobre ECDSA en Stack Overflow, pero ninguna de las respuestas era 100% relevante para mi pregunta. Agradezco su ayuda, chicos.

Actualización: He usado el paquete de Bitcoin para Python. Primero he obtenido la clave pública y luego la he verificado:

pip install bitcoin

>>> mensaje = 'hzpPiNlB'
>>> firma = 'I2fKdGNtR5owOWVoWchMVWwC/gf4qyYZ8G+kvuR7CaBhU/0SO149a3/ylBaiVWzfUoXI5HlgYPjkrptk0HfW1NQ='
>>> import bitcoin
>>> clave_recuperada = bitcoin.ecdsa_recover(mensaje, firma)
>>> print(clave_recuperada)
04bbdd00bafea40bf7b268baff4ec7635a0b12e94542067cf4077369be938f7b733c731248b88bb0f8b14783247705e568effd54e57643fc827852cf77d0ed8313
>>> verificacion = bitcoin.ecdsa_verify(mensaje, firma, clave_recuperada)
>>> print(verificacion)
True

Aunque la clave pública recuperada es incorrecta, de alguna manera está pasando como verdadera. Cuando uso la clave pública correcta, que he extraído de la billetera, obtengo Falso como resultado de la verificación de la firma.

>>> mensaje = 'hzpPiNlB'
>>> firma = 'I2fKdGNtR5owOWVoWchMVWwC/gf4qyYZ8G+kvuR7CaBhU/0SO149a3/ylBaiVWzfUoXI5HlgYPjkrptk0HfW1NQ='
>>> clave_pub = '0352ab1e8ef8553fb307ae8dcafd2395fd06e5ca882f0e27143cb15cf495cc435e'
>>> import bitcoin
>>> verificacion = bitcoin.ecdsa_verify(mensaje, firma, clave_pub)
>>> print(verificacion)
False
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está relacionado con la longitud de la firma. La longitud esperada de la firma es de 64 bytes (128 caracteres hexadecimales), pero la longitud de la firma proporcionada es de 65 bytes (130 caracteres hexadecimales), lo que está causando que la verificación falle.

    Has mencionado que has convertido la firma de base64 a una cadena hexadecimal, pero parece que la conversión ha añadido un byte extra a la firma.

    Para solucionar este problema, puedes intentar eliminar el último byte de la firma antes de verificarla. Aquí tienes un ejemplo de código:

    import bitcoin
    
    direccion = "33ELcBdg6W7parjGxNYUz5uHVHwPqopNjE"
    mensaje = "hzpPiNlB"
    firma_base64 = "I2fKdGNtR5owOWVoWchMVWwC/gf4qyYZ8G+kvuR7CaBhU/0SO149a3/ylBaiVWzfUoXI5HlgYPjkrptk0HfW1NQ="
    
    # Convertir la firma de base64 a bytes
    firma_bytes = bitcoin.base58.decode(firma_base64)
    
    # Eliminar el último byte de la firma
    firma = firma_bytes[:-1]
    
    # Verificar la firma
    clave_publica = bitcoin.pubkey_from_address(direccion)
    verificacion = bitcoin.ecdsa_verify(mensaje, firma, clave_publica)
    
    print(verificacion)  # True si la firma es válida
    

    Ten en cuenta que, en el código anterior, primero decodificamos la firma de base64 utilizando la función base58.decode, que devuelve la firma como una cadena de bytes. Luego, eliminamos el último byte de la firma utilizando [:-1] y finalmente verificamos la firma utilizando la función ecdsa_verify.

    Además, asegúrate de tener la clave pública correcta extraída de la billetera al verificar la firma, ya que utilizar una clave pública incorrecta puede dar como resultado un resultado de verificación falso.

Comments are closed.