Maison >Java >javaDidacticiel >Comment extraire une clé privée RSA d'un fichier codé PEM ?
Obtention de la clé privée RSA à partir d'un fichier de clé privée codé PEM
Dans ce cas, la clé privée fournie est codée au format PEM , en utilisant spécifiquement PKCS#1. Pour récupérer la clé privée RSA de ce fichier codé PEM, vous pouvez utiliser l'une des approches suivantes :
Approche 1 : Code modifié avec analyse de séquence DER
Le code fourni Le code Java lit la clé codée PEM et tente de la décoder. La modification suggérée ci-dessous lui permettra d'analyser les clés privées au format PKCS#1 :
... // 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); ...
Approche 2 : Code amélioré à l'aide des fournisseurs Sun
Une solution alternative consiste à exploitez les fournisseurs sun.security pour l’analyse des séquences DER et le package java.security pour la génération de clés. Cette approche fournit une implémentation plus concise et conforme à la FIPS :
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); }
Ce code lira et analysera avec succès la clé privée du fichier PEM fourni et vous fournira un objet de clé privée RSA.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!