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. В этом случае, однако, вы должны выполнить обработку потока самостоятельно.

Другие вопросы по тегам