Fehlermeldung
System.Security.Cryptography.CryptographicException: ASN1 corrupted data.
Auch ausgegeben als
- ASN1 corrupted data.
- Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: ASN1 corrupted data.
Unter Linux und macOS ist der Typ `CryptographicException`; unter Windows kann er als `WindowsCryptographicException` mit demselben Text erscheinen. Die innere Exception lautet etwa „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
Was der Fehler bedeutet
Die Bytes, die du einer der Methoden `Import…` übergeben hast, sind nicht die ASN.1-Struktur, die diese Methode dekodiert. Jede Methode liest genau eine Struktur – PKCS#8, PKCS#1, SEC 1 oder SubjectPublicKeyInfo –, und das äußere DER passt nicht dazu. Deshalb meldet .NET die Daten als beschädigt, obwohl der Schlüssel selbst in einem anderen Format völlig in Ordnung sein kann. Die innere `AsnContentException` nennt die nicht passenden Tags.
Warum der Fehler auftritt
PKCS#1 vs. PKCS#8 (oder SEC 1)
häufigBytes aus einem Block `RSA PRIVATE KEY` wurden an `ImportPkcs8PrivateKey` übergeben oder Bytes aus `PRIVATE KEY` an `ImportRSAPrivateKey`. Die Strukturen unterscheiden sich in ihrem ersten Element (INTEGER vs. SEQUENCE).
PEM-Text oder base64 als DER übergeben
häufig`Encoding.ASCII.GetBytes(pem)` oder `Convert.FromBase64String` über die ganze Datei einschließlich der BEGIN- und END-Zeilen ergibt kein DER.
Methoden für öffentliche und private Schlüssel vertauscht
gelegentlichEin privater Schlüssel, der an `ImportSubjectPublicKeyInfo` übergeben wird, oder ein Zertifikat (kein Schlüssel), das an irgendeine Methode für den Schlüsselimport übergeben wird.
So behebst du den Fehler
- 1.
ImportFromPem für PEM-Dateien verwenden
Die Methode verzweigt anhand des PEM-Labels und verhindert, dass du von Hand den falschen DER-Decoder auswählst. Zertifikate laufen stattdessen über `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.
Methode passend zur DER-Struktur wählen
Musst du rohes DER verarbeiten, wähle die Importmethode danach, was die Daten tatsächlich sind; ein ASN.1-Viewer zeigt dir, welche Struktur du vor dir hast.
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"