Heim >Java >javaLernprogramm >Wie extrahiere ich einen privaten RSA-Schlüssel aus einer PEM-codierten Datei, wenn eine „InvalidKeySpecException' auftritt?

Wie extrahiere ich einen privaten RSA-Schlüssel aus einer PEM-codierten Datei, wenn eine „InvalidKeySpecException' auftritt?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-10 10:28:02809Durchsuche

How do I extract an RSA private key from a PEM encoded file when encountering an

Extrahieren des privaten RSA-Schlüssels aus einer PEM-codierten Datei

Problem:
Sie haben eine private Schlüsseldatei codiert im PEM BASE64-Format und möchten es in einem externen Kontext verwenden. Beim Versuch, den Schlüssel zu entschlüsseln, treten jedoch Fehler auf.

Codeausschnitt und Fehler:
Ihr Java-Codeausschnitt zum Lesen des privaten Schlüssels und zum Entschlüsseln der BASE64-Daten:

// Code omitted for brevity

Fehler aufgetreten:

InvalidKeySpecException: Inappropriate key specification: DerInputStream.getLength(): lengthTag=127, too big.

Lösung:

Der Fehler weist darauf hin, dass der Schlüssel im PKCS#1-Format vorliegt, was eine andere Handhabung erfordert als das angestrebte PKCS#8-Format Dein Code. Hier ist eine überarbeitete Lösung, die dieses Problem behebt:

import sun.security.util.DerInputStream;
import sun.security.util.DerValue;

// Code omitted for brevity

public static PrivateKey pemFileLoadPrivateKeyPkcs1OrPkcs8Encoded(File pemFileName) throws GeneralSecurityException, IOException {
    // PKCS#8 format
    final String PEM_PRIVATE_START = "-----BEGIN PRIVATE KEY-----";
    final String PEM_PRIVATE_END = "-----END PRIVATE KEY-----";

    // PKCS#1 format
    final String PEM_RSA_PRIVATE_START = "-----BEGIN RSA PRIVATE KEY-----";
    final String PEM_RSA_PRIVATE_END = "-----END RSA PRIVATE KEY-----";

    Path path = Paths.get(pemFileName.getAbsolutePath());

    String privateKeyPem = new String(Files.readAllBytes(path));

    if (privateKeyPem.indexOf(PEM_PRIVATE_START) != -1) { // PKCS#8 format
        // Code omitted for brevity
    } else if (privateKeyPem.indexOf(PEM_RSA_PRIVATE_START) != -1) {  // PKCS#1 format
        privateKeyPem = privateKeyPem.replace(PEM_RSA_PRIVATE_START, "").replace(PEM_RSA_PRIVATE_END, "");
        privateKeyPem = privateKeyPem.replaceAll("\s", "");

        DerInputStream derReader = new DerInputStream(Base64.getDecoder().decode(privateKeyPem));

        DerValue[] seq = derReader.getSequence(0);

        // Code omitted for brevity
    }

    throw new GeneralSecurityException("Not supported format of a private key");
}

Dieser aktualisierte Code verarbeitet sowohl die Formate PKCS#8 als auch PKCS#1, sodass Sie den privaten Schlüssel erfolgreich extrahieren und mit der beabsichtigten Verwendung fortfahren können.

Das obige ist der detaillierte Inhalt vonWie extrahiere ich einen privaten RSA-Schlüssel aus einer PEM-codierten Datei, wenn eine „InvalidKeySpecException' auftritt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn