Abrufen des privaten RSA-Schlüssels aus einer PEM-codierten privaten Schlüsseldatei
In diesem Fall ist der bereitgestellte private Schlüssel im PEM-Format codiert , insbesondere unter Verwendung von PKCS#1. Um den privaten RSA-Schlüssel aus dieser PEM-codierten Datei abzurufen, können Sie einen der folgenden Ansätze verwenden:
Ansatz 1: Modifizierter Code mit DER-Sequenzanalyse
Die bereitgestellten Java-Code liest den PEM-codierten Schlüssel und versucht, ihn zu dekodieren. Mit der unten vorgeschlagenen Änderung können private Schlüssel im PKCS#1-Format analysiert werden:
... // Skip version seq[0]; BigInteger modulus = seq[1].getBigInteger(); BigInteger publicExp = seq[2].getBigInteger(); BigInteger privateExp = seq[3].getBigInteger(); ... RSAPrivateCrtKeySpec keySpec = new RSAPrivateCrtKeySpec(modulus, publicExp, privateExp, prime1, prime2, exp1, exp2, crtCoef); KeyFactory factory = KeyFactory.getInstance("RSA"); return factory.generatePrivate(keySpec); ...
Ansatz 2: Verbesserter Code mithilfe von Sun-Anbietern
Eine alternative Lösung ist: Nutzen Sie die sun.security-Anbieter für das DER-Sequenz-Parsing und das java.security-Paket für die Schlüsselgenerierung. Dieser Ansatz bietet eine präzisere und FIPS-kompatiblere Implementierung:
import java.io.File; import java.io.IOException; import java.security.GeneralSecurityException; import java.security.PrivateKey; public static PrivateKey pemFileLoadPrivateKeyPkcs1(File pemFileName) throws GeneralSecurityException, IOException { // PKCS#1 format String PEM_RSA_PRIVATE_START = "-----BEGIN RSA PRIVATE KEY-----"; String PEM_RSA_PRIVATE_END = "-----END RSA PRIVATE KEY-----"; Path path = Paths.get(pemFileName.getAbsolutePath()); String privateKeyPem = new String(Files.readAllBytes(path)); 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); if (seq.length < 9) { throw new GeneralSecurityException("Could not parse a PKCS1 private key."); } // Skip version seq[0]; BigInteger modulus = seq[1].getBigInteger(); BigInteger publicExp = seq[2].getBigInteger(); BigInteger privateExp = seq[3].getBigInteger(); BigInteger prime1 = seq[4].getBigInteger(); BigInteger prime2 = seq[5].getBigInteger(); BigInteger exp1 = seq[6].getBigInteger(); BigInteger exp2 = seq[7].getBigInteger(); BigInteger crtCoef = seq[8].getBigInteger(); RSAPrivateCrtKeySpec keySpec = new RSAPrivateCrtKeySpec(modulus, publicExp, privateExp, prime1, prime2, exp1, exp2, crtCoef); KeyFactory factory = KeyFactory.getInstance("RSA"); return factory.generatePrivate(keySpec); }
Dieser Code liest und analysiert erfolgreich den privaten Schlüssel aus der bereitgestellten PEM-Datei und stellt Ihnen ein RSA-Privatschlüsselobjekt zur Verfügung.
Das obige ist der detaillierte Inhalt vonWie extrahiere ich einen privaten RSA-Schlüssel aus einer PEM-codierten Datei?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!