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
PKCS#1 vs. PKCS#8 (ou SEC 1)
comumBytes de `RSA PRIVATE KEY` passados para `ImportPkcs8PrivateKey`, ou bytes de `PRIVATE KEY` passados para `ImportRSAPrivateKey`. As estruturas diferem no primeiro elemento (INTEGER vs. SEQUENCE).
Texto PEM ou base64 passado como DER
comumAplicar `Encoding.ASCII.GetBytes(pem)` ou `Convert.FromBase64String` ao arquivo inteiro, incluindo as linhas de delimitação do PEM, não produz DER.
Métodos de chave pública e de chave privada trocados
ocasionalUma chave privada passada para `ImportSubjectPublicKeyInfo`, ou um certificado (e não uma chave) passado para qualquer método de importação de chave.
Como corrigir
- 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.
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"