Чтение закрытого ключа формата SSLeay с использованием надувного замка

InvalidKeyException возникает при попытке прочитать закрытый ключ формата SSLeay.

Ниже приведены подробности: - У меня есть закрытый ключ формата SSLeay. Формат pem начинается с файла ниже.

-----НАЧАТЬ ЗАКРЫТЫЙ КЛЮЧ RSA-----

Я пишу код, чтобы сохранить закрытый ключ в байтовом формате и преобразовать его в PrivateKey. Переменная privateKeyBytes содержит закрытый ключ в байтовом формате/

String pkStrFormat = new String(privateKeyBytes, "UTF-8");
pkStrFormat = pkStrFormat.replaceAll("(-----BEGIN RSA PRIVATE KEY-----\\r?\\n|-----END RSA PRIVATE KEY-----+\\r?\\n?)","");
byte[] keyBytesOfPrivateKey = org.bouncycastle.util.encoders.Base64
                    .decode(pkStrFormat.getBytes());
KeyFactory ecKeyFac = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytesOfPrivateKey);            
PrivateKey priKey = ecKeyFac.generatePrivate(keySpec);

Я получаю следующее исключение: -

Caused by: java.security.InvalidKeyException: IOException : version mismatch: (supported:     00, parsed:     01
    at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:350)
    at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:356)

Код отлично работает, когда используются ключи формата PKCS8.


person Manu    schedule 10.02.2015    source источник


Ответы (1)


Файлы PEM, начинающиеся с BEGIN RSA PRIVATE KEY, являются PKCS#1, а не PKCS#8. PKCS#1 по сути является PKCS#8 для фиксированного алгоритма RSA и, следовательно, с удаленным идентификатором алгоритма. Либо преобразуйте свой ключ, как в https://superuser.com/questions/606215/openssl-pkcs8-default-format-gives-rsa-private-key:

openssl pkcs8 -topk8 -inform pem -in file.key -outform pem -nocrypt -out file.pem

или используйте PEMParser, аналогичный Bouncy Castle: PEMReader =› PEMParser (без пароля)

person Drunix    schedule 10.02.2015