Java, как использовать файл закрытого ключа вместо PEM для расшифровки?
Используя Java и Bouncy Castle 1.52, я могу загрузить закрытый ключ через сертификат PEM, используя следующий код. У меня также есть файл private.key того же формата PKCS8. Какой код использовать файл 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());
2 ответа
Решено. Следующее сработало для меня.
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);
Метод полностью ReadFIle:
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;
}
Это просто, поскольку сама 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. В этом случае, однако, вы должны выполнить обработку потока самостоятельно.