Я хочу сгенерировать закрытый ключ из строки (файл .pem
) в Java.Как сгенерировать секретный ключ RSA из строки * pem в Java
private static final String test = "-----BEGIN RSA PRIVATE KEY-----\n" +
"MIIEpAIBAAKCAQEAvcCH8WsT1xyrZqq684VPJzOF3hN5DNbowZ96Ie//PN0BtRW2\n" +
// and so on
"-----END RSA PRIVATE KEY-----";
try {
String privKeyPEM = test.replace("-----BEGIN RSA PRIVATE KEY-----\n", "");
privKeyPEM = privKeyPEM.replace("-----END RSA PRIVATE KEY-----", "");
byte [] encoded = Base64.decode(privKeyPEM);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey privKey = kf.generatePrivate(keySpec);
}
catch (Exception e) {
e.printStackTrace();
}
Последняя строка (функция generatePrivate) бросает это исключение:
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(Unknown Source)
at java.security.KeyFactory.generatePrivate(Unknown Source)
at Test.main(Test.java:52)
Caused by: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
at sun.security.pkcs.PKCS8Key.decode(Unknown Source)
at sun.security.pkcs.PKCS8Key.decode(Unknown Source)
at sun.security.rsa.RSAPrivateCrtKeyImpl.<init>(Unknown Source)
at sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(Unknown Source)
at sun.security.rsa.RSAKeyFactory.generatePrivate(Unknown Source)
... 3 more
Если изменить секретный ключ к значению из .der
файла он работает правильно, но мне нужно, чтобы сформировать частный файл ключа из файла .pem
.
Я приложил скриншот байтов, напечатанных как строка (один раз жестко закодированный с \ n и один раз жестко закодированный без \ n) и один раз из файла.
Странная вещь, что выход из файла отличается от выхода из строк.
Если я попытаюсь закодировать файл .der
с Base64, результат будет отличаться от строки в файле .pem
. Почему это так?
Вы нашли ответ вообще? –
@ SankarP nope не очень. – Niklas
в порядке. Я нашел решение. Ключи, начинающиеся с «----- BEGIN RSA PRIVATE KEY», являются файлами, закодированными pkcs1. Эта кодировка pkcs1 не поддерживается Java, если вы не используете внешнюю библиотеку, такую как BouncyCastle. Я столкнулся с тем же вопросом вчера и примерно через 8 часов нашел решение. Если вы закодируете закрытый ключ с помощью pkcs8, он начнется как «--- BEGIN PRIVATE KEY ---», который будет обрабатываться java. НТН. –