使用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());
答案 0 :(得分:0)
这很简单,因为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。但是,在这种情况下,您必须自己执行流处理。
答案 1 :(得分:0)
解决。以下对我有用。
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;
}