Pular para o conteúdo
ecdsa.com
.NET System.Security.Cryptography.NET

Mensagem de erro

System.Security.Cryptography.CryptographicException: ASN1 corrupted data.

Também aparece como

  • ASN1 corrupted data.
  • Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: ASN1 corrupted data.

No Linux e no macOS, o tipo é `CryptographicException`; no Windows, ele pode aparecer como `WindowsCryptographicException`, com o mesmo texto. A exceção interna diz, por exemplo, “The provided data is tagged with 'Universal' class value '2', but it should have been 'Universal' class value '16'.”

.NET System.Security.Cryptography — ImportSubjectPublicKeyInfo / ImportPkcs8PrivateKey / ImportRSAPrivateKey / ImportECPrivateKey

O que significa

Os bytes que você passou para um dos métodos `Import…` não são a estrutura ASN.1 que esse método decodifica. Cada método lê exatamente uma estrutura — PKCS#8, PKCS#1, SEC 1 ou SubjectPublicKeyInfo — e o DER externo não corresponde a ela, por isso o .NET informa que os dados estão corrompidos, mesmo que a chave em si possa estar perfeitamente correta em outro formato. A exceção interna `AsnContentException` aponta a divergência de tags.

Por que acontece

Como corrigir

  1. 1.

    Usar ImportFromPem para arquivos PEM

    Ele se orienta pelo rótulo do PEM e evita escolher à mão o decodificador DER errado. Já os certificados passam por `X509Certificate2`.

    csharp
    // .NET 5+: ImportFromPem reads the label and picks the right decoder
    // (PRIVATE KEY, RSA PRIVATE KEY, EC PRIVATE KEY, PUBLIC KEY, RSA PUBLIC KEY).
    using var key = ECDsa.Create();
    key.ImportFromPem(File.ReadAllText("key.pem"));
  2. 2.

    Escolher o método de acordo com a estrutura DER

    Se você precisa lidar com DER bruto, escolha o método de importação de acordo com o que os dados realmente são; um visualizador de ASN.1 mostra qual estrutura você tem.

    csharp
    // DER input: choose the method by structure
    rsa.ImportPkcs8PrivateKey(der, out _);        // "PRIVATE KEY"
    rsa.ImportRSAPrivateKey(der, out _);          // "RSA PRIVATE KEY"
    rsa.ImportSubjectPublicKeyInfo(der, out _);   // "PUBLIC KEY"
    rsa.ImportRSAPublicKey(der, out _);           // "RSA PUBLIC KEY"
    ecdsa.ImportECPrivateKey(der, out _);         // "EC PRIVATE KEY"

Erros relacionados

Ver toda a base de erros de assinatura