Saltar al contenido
ecdsa.com
.NET System.Security.Cryptography.NET

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

Cómo solucionarlo

  1. 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. 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"

Errores relacionados

Explorar toda la base de datos de errores de firma