Pular para o conteúdo
ecdsa.com
Python cryptographyPython (cryptography)

Mensagem de erro

cryptography.exceptions.InvalidSignature

A exceção é lançada sem texto de mensagem — o traceback termina no nome da classe, sem mais nada (reproduzido com cryptography 50.0).

Python cryptography — raised by verify()

O que significa

public_key.verify(signature, data, ...) concluiu que a assinatura não passa na verificação para estes dados com esta chave. Tudo foi lido sem erro; a verificação simplesmente falhou. Como a exceção não traz detalhes por design, o diagnóstico exige testar cada entrada separadamente — chave, bytes dos dados, codificação da assinatura, hash.

Por que acontece

Como corrigir

  1. 1.

    Converter assinaturas raw para DER

    Se a assinatura tem 64 bytes (P-256), divida-a em r e s e codifique de novo em DER antes de verificar.

    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 digests já calculados

    Quando você tem o digest em vez da mensagem, diga isso explicitamente — senão a biblioteca calcula o hash do seu 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.

    Descobrir qual entrada está errada

    Cole a chave, a mensagem e a assinatura no explicador de erros abaixo: ele testa as hipóteses de divergência mais comuns — hash errado, raw vs. DER, hash duplo, normalização high-S, curva errada — e aponta aquela que faz sua assinatura passar na verificação.

Erros relacionados

Ver toda a base de erros de assinatura