Saltar al contenido
ecdsa.com
Python cryptographycryptography de Python

Mensaje de error

cryptography.exceptions.InvalidSignature

La excepción se lanza sin texto de mensaje: el traceback termina con el nombre de la clase, sin más (reproducido con cryptography 50.0).

Python cryptography — raised by verify()

Qué significa

public_key.verify(signature, data, ...) determinó que la firma no se verifica para estos datos con esta clave. Todo se analizó correctamente; simplemente, la comprobación falló. Como la excepción no lleva detalles por diseño, el diagnóstico consiste en probar cada entrada por separado: la clave, los bytes de los datos, la codificación de la firma y el hash.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Convertir las firmas raw a DER

    Si la firma tiene 64 bytes (P-256), divídela en r y s y vuelve a codificarla como DER antes de verificarla.

    python
    from cryptography.hazmat.primitives.asymmetric.utils import encode_dss_signature
    
    r = int.from_bytes(raw_sig[:32], "big")
    s = int.from_bytes(raw_sig[32:], "big")
    der_sig = encode_dss_signature(r, s)
    public_key.verify(der_sig, message, ec.ECDSA(hashes.SHA256()))
  2. 2.

    Usar Prehashed para resúmenes precalculados

    Si tienes el resumen en lugar del mensaje, indícalo explícitamente; si no, la biblioteca calcula el hash de tu hash.

    python
    from cryptography.hazmat.primitives.asymmetric import utils
    
    public_key.verify(
        der_sig,
        digest_bytes,                                    # already SHA-256(message)
        ec.ECDSA(utils.Prehashed(hashes.SHA256())),
    )
  3. 3.

    Averiguar qué entrada es incorrecta

    Pega la clave, el mensaje y la firma en la herramienta de diagnóstico de errores de abajo: prueba las hipótesis de discrepancia habituales —hash incorrecto, raw frente a DER, doble hash, normalización high-S, curva incorrecta— e indica cuál hace que tu firma se verifique.

Errores relacionados

Explorar toda la base de datos de errores de firma