Java如何使用私钥文件而不是PEM来解密?

使用Java和Bouncy Castle 1.52,我可以使用以下代码通过PEM证书加载私钥。 我还有一个PKCS8格式的private.key文件。 直接使用private.key文件而不是PEM的代码是什么?

String keyPath = "C:\\RSA7\\privatenopass.pem"; BufferedReader br = new BufferedReader(new FileReader(keyPath)); PEMParser pp = new PEMParser(br); PEMKeyPair pemKeyPair = (PEMKeyPair) pp.readObject(); KeyPair kp = new JcaPEMKeyConverter().getKeyPair(pemKeyPair); pp.close(); cipher.init(Cipher.DECRYPT_MODE, kp.getPrivate()); 

这很简单,因为Java本身已经使用PKCS#8编码来编码RSA私钥。

请注意,此示例仅使用PKCS#8的内部编码 。 PKCS#8密钥实际上由一个分层结构组成(内部编码表示密钥类型,它被包装,外部编码表示使用的包装机制)。

它还使用Java 7/8中的一些便捷方法来从文件中读取字节。 您可以将其替换为任何代码以从文件中读取所有字节。

 Path path = (new File("privatenopass.pkcs8")).toPath(); byte[] pkcs8Data = Files.readAllBytes(path); KeyFactory kf = KeyFactory.getInstance("RSA"); PKCS8EncodedKeySpec keyspec = new PKCS8EncodedKeySpec(pkcs8Data); RSAPrivateKey pk = (RSAPrivateKey) kf.generatePrivate(keyspec); 

您直接将文件阅读器提供给Bouncy Castle以解码PEM。 但是,在这种情况下,您必须自己执行流处理。

解决。 以下对我有用。

 File mypkfile = new File("C:\\myfolder\\private.key"); byte[] myPK = fullyReadFile(mypkfile); PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(myPK); KeyFactory kf = KeyFactory.getInstance("RSA"); PrivateKey privKey = kf.generatePrivate(privateKeySpec); cipher.init(Cipher.DECRYPT_MODE, privKey); 

fullyReadFIle方法:

 public static byte[] fullyReadFile(File file) throws IOException { DataInputStream dis = new DataInputStream(new FileInputStream(file)); byte[] bytesOfFile = new byte[(int) file.length()]; dis.readFully(bytesOfFile); dis.close(); return bytesOfFile; }