Mendapatkan Kunci Peribadi RSA daripada Fail Kunci Peribadi Dikodkan PEM
Dalam kes ini, kunci peribadi yang disediakan dikodkan dalam format PEM , khususnya menggunakan PKCS#1. Untuk mendapatkan semula kunci persendirian RSA daripada fail berkod PEM ini, anda boleh menggunakan salah satu daripada pendekatan berikut:
Pendekatan 1: Kod Diubah Suai dengan Penghuraian Jujukan DER
Yang disediakan Kod Java membaca kunci yang dikodkan PEM dan cuba menyahkodnya. Pengubahsuaian yang dicadangkan di bawah akan membolehkannya menghuraikan kunci persendirian 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); ...
Pendekatan 2: Kod yang Diperbaiki Menggunakan Pembekal Matahari
Penyelesaian alternatif ialah dengan memanfaatkan penyedia sun.security untuk penghuraian jujukan DER dan pakej java.security untuk penjanaan kunci. Pendekatan ini menyediakan pelaksanaan yang lebih ringkas dan patuh 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); }
Kod ini akan berjaya membaca dan menghuraikan kunci persendirian daripada fail PEM yang disediakan dan memberikan anda objek kunci persendirian RSA.
Atas ialah kandungan terperinci Bagaimana untuk Mengekstrak Kunci Peribadi RSA daripada Fail Dikodkan PEM?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!