Mensaje de error
System.Security.Cryptography.CryptographicException: ASN1 corrupted data.
También se muestra como
- ASN1 corrupted data.
- Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: ASN1 corrupted data.
En Linux y macOS el tipo es `CryptographicException`; en Windows puede aparecer como `WindowsCryptographicException` con el mismo texto. La excepción interna dice, por ejemplo, «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
Qué significa
Los bytes que pasas a uno de los métodos `Import…` no tienen la estructura ASN.1 que decodifica ese método. Cada método lee exactamente una estructura —PKCS#8, PKCS#1, SEC 1 o SubjectPublicKeyInfo— y el DER exterior no coincide, así que .NET informa de que los datos están corruptos aunque la clave en sí pueda ser perfectamente válida en otro formato. La excepción interna `AsnContentException` indica qué etiquetas no coinciden.
Por qué ocurre
PKCS#1 frente a PKCS#8 (o SEC 1)
frecuenteBytes de `RSA PRIVATE KEY` pasados a `ImportPkcs8PrivateKey`, o bytes de `PRIVATE KEY` pasados a `ImportRSAPrivateKey`. Las estructuras difieren en su primer elemento (INTEGER frente a SEQUENCE).
Texto PEM o base64 pasado como DER
frecuente`Encoding.ASCII.GetBytes(pem)` o `Convert.FromBase64String` aplicados a todo el archivo, incluidas las líneas delimitadoras del PEM, no producen DER.
Métodos de clave pública y de clave privada intercambiados
ocasionalUna clave privada pasada a `ImportSubjectPublicKeyInfo`, o un certificado (no una clave) pasado a cualquier método de importación de claves.
Cómo solucionarlo
- 1.
Usar ImportFromPem para archivos PEM
Decide qué hacer según la etiqueta PEM y evita elegir a mano el decodificador DER equivocado. Los certificados, en cambio, pasan 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.
Elegir el método según la estructura DER
Si tienes que trabajar con DER sin procesar, elige el método de importación según lo que contienen los datos; un visor de ASN.1 te dice qué estructura tienes.
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"