способен ли PKCS8EncodedKeySpec читать закрытый ключ PKCS1 и PKCS8

Хотя название является вопросом, но мне просто удалось сделать это с тем же кодом, хотя я просто не уверен, предназначен ли PKCS8EncodedKeySpec для выполнения этой работы, или мой закрытый ключ сгенерирован случайно, чтобы заставить эту работу работать (ключ, сгенерированный openssl ).

мой код (pemPath - это путь к файлу закрытого ключа типа pem):

try (BufferedReader bufferedReader = new BufferedReader(new FileReader(pemPath))) {
    StringBuilder stringBuilder = new StringBuilder();
    String line;

    while ((line = bufferedReader.readLine()) != null) {
        if (!line.startsWith("--")) {
            stringBuilder.append(line);
        }
    }

    PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(
            Base64.getDecoder().decode(stringBuilder.toString()));
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    PrivateKey key = keyFactory.generatePrivate(priPKCS8);
}

А также вставляю содержимое файла PKCS1:

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAoRVeLT5PrbQmFbmbc1zLFJuz5Sx3yTc9IIem13/+gNcrdqqa
QVd/2noPmIm1xUkdQfvRm72k0Mm1s78bcadTsZt4XL2OvAKBA0hyox2re/PLLp05
NP2WKFyF+O2OteZhzQHPxQFBn/Nt1pYbYctV7bbw4RsdQXXz72TY+WBfIg6m/LeG
uPG/4UM5IAw9G2IEOkA/V00rsjOLzRvHyqu473zaFNbaObN9rnakCUFeU07L3Eeo
EBQoZPiIyTAJ8eN/EnaudLrvErOog2E4LcpAOpoUDBdi2XYT0iE0stDoj62zP+gL
ubZQKV81N0qk1KehxeLcHtpXtvlWaITnmIovVQIDAQABAoIBAFw/W2Z3h7PHNgQ8
/cvr+RS9MiFs/NBLhQMLDD3fO8VW87oKazo+PKbGPgYx3tmzTEEMT/ZrfWZgDWF5
cOL+WwycJyqdF4+Ns4pIw/WruRfL/rCcMzWof4Rvr/1lNdPvslRv1CdS190cz+sS
nW28v2HZ4UpYd8GUJfUTgLoXOYPLjYEQx8wri5tOPvAJuCFHCdpx59Fu0xaQP+Uz
3+CSAqdsBL4UKoz0lQ27128BEg/2a6kqhGvC/QHu+Mn0N4wbto8ndfpF8noSAhx2
s38q/E9gVYxKjA1g2yl74irPsPWT+gq97nQJ4jYRog2W4I+KYYDAL9xP3ux+kGis
6h1GWcECgYEA1Bh/EgwlamT+y5oJhZgYEQAFtCZEOjyjWuJRwYTuaKrTJjudk0xZ
KPsGy8+Wi3QYsGUowAsQNws+3hzD1dIqWO92CXgkaJ1iZ3mVMsR+xgdb67jFrzZM
PerqXK3wOlaDe/Mikfyqcp9KERuSVKi/XMv7G/1ZaYk4/SPElqcXy1ECgYEAwm2Z
1Wy/E0uQ8Aj7x1nujCUQjvmTWhkU2aHW/1+STjERfXv5XdaR2N6tFSpWRRHAezHG
5b1NmskNKHCtYAdWFuZC2TXUoCVpnhZnS5gAf1H+konKjeknlLgYIZDB59hzMmCE
uOGEHk/rtZQuB4nR0jYk1eE14IOCQe6j73EsmsUCgYEAoINBd6kVj+WLJw8WcbJf
VE5OAr6LF//YKOnqsagmvbO6RM8NO/Kl72u7AvfBmRxtquGD64Lz7JRoKbRfSSza
u5/OFvCDrWCenmzXSyqGPtxG5qhZg3Z2UM2+PBGvIpdivqWM3ir32/NNHJFfNw7W
dCYzjkU4K7ScGoe9Ob6PNWECgYBrm514sidO1pPxRgeT3gJZLmprt1YGl7sieKA1
1v9yp1W2zdbGSOuPzC6feD8nGxwdEv+yR4OcF4pgx3wtmeHb6rU04sY7nHlINb4V
6Jrd3NO45upkgJaXiQxSB3xKhVG8oA7VBHvLCxC5/rk7Etw+LBlXBr569E4zj5DM
BSdawQKBgQC55RdlSLarKyEF9bMVPQDQ0Qko6pS+pw2kmg2CMXhk7eBsTUAMuVh4
/FNu3h6QiGpHstV1NRmF9oPRTltd8Mh3aCy8JAOY9/hZ7NScxKy2j91jQl+geSOC
FPSvfPlyMwPDvR3urCQKYq3NMJ4jWqcle4YX0w/rG5yY05gpQNVWiQ==
-----END RSA PRIVATE KEY-----

и содержимое файла PKCS8:

-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQChFV4tPk+ttCYV
uZtzXMsUm7PlLHfJNz0gh6bXf/6A1yt2qppBV3/aeg+YibXFSR1B+9GbvaTQybWz
vxtxp1Oxm3hcvY68AoEDSHKjHat788sunTk0/ZYoXIX47Y615mHNAc/FAUGf823W
lhthy1XttvDhGx1BdfPvZNj5YF8iDqb8t4a48b/hQzkgDD0bYgQ6QD9XTSuyM4vN
G8fKq7jvfNoU1to5s32udqQJQV5TTsvcR6gQFChk+IjJMAnx438Sdq50uu8Ss6iD
YTgtykA6mhQMF2LZdhPSITSy0OiPrbM/6Au5tlApXzU3SqTUp6HF4twe2le2+VZo
hOeYii9VAgMBAAECggEAXD9bZneHs8c2BDz9y+v5FL0yIWz80EuFAwsMPd87xVbz
ugprOj48psY+BjHe2bNMQQxP9mt9ZmANYXlw4v5bDJwnKp0Xj42zikjD9au5F8v+
sJwzNah/hG+v/WU10++yVG/UJ1LX3RzP6xKdbby/YdnhSlh3wZQl9ROAuhc5g8uN
gRDHzCuLm04+8Am4IUcJ2nHn0W7TFpA/5TPf4JICp2wEvhQqjPSVDbvXbwESD/Zr
qSqEa8L9Ae74yfQ3jBu2jyd1+kXyehICHHazfyr8T2BVjEqMDWDbKXviKs+w9ZP6
Cr3udAniNhGiDZbgj4phgMAv3E/e7H6QaKzqHUZZwQKBgQDUGH8SDCVqZP7LmgmF
mBgRAAW0JkQ6PKNa4lHBhO5oqtMmO52TTFko+wbLz5aLdBiwZSjACxA3Cz7eHMPV
0ipY73YJeCRonWJneZUyxH7GB1vruMWvNkw96upcrfA6VoN78yKR/Kpyn0oRG5JU
qL9cy/sb/VlpiTj9I8SWpxfLUQKBgQDCbZnVbL8TS5DwCPvHWe6MJRCO+ZNaGRTZ
odb/X5JOMRF9e/ld1pHY3q0VKlZFEcB7McblvU2ayQ0ocK1gB1YW5kLZNdSgJWme
FmdLmAB/Uf6SicqN6SeUuBghkMHn2HMyYIS44YQeT+u1lC4HidHSNiTV4TXgg4JB
7qPvcSyaxQKBgQCgg0F3qRWP5YsnDxZxsl9UTk4CvosX/9go6eqxqCa9s7pEzw07
8qXva7sC98GZHG2q4YPrgvPslGgptF9JLNq7n84W8IOtYJ6ebNdLKoY+3EbmqFmD
dnZQzb48Ea8il2K+pYzeKvfb800ckV83DtZ0JjOORTgrtJwah705vo81YQKBgGub
nXiyJ07Wk/FGB5PeAlkuamu3VgaXuyJ4oDXW/3KnVbbN1sZI64/MLp94PycbHB0S
/7JHg5wXimDHfC2Z4dvqtTTixjuceUg1vhXomt3c07jm6mSAlpeJDFIHfEqFUbyg
DtUEe8sLELn+uTsS3D4sGVcGvnr0TjOPkMwFJ1rBAoGBALnlF2VItqsrIQX1sxU9
ANDRCSjqlL6nDaSaDYIxeGTt4GxNQAy5WHj8U27eHpCIakey1XU1GYX2g9FOW13w
yHdoLLwkA5j3+Fns1JzErLaP3WNCX6B5I4IU9K98+XIzA8O9He6sJApirc0wniNa
pyV7hhfTD+sbnJjTmClA1VaJ
-----END PRIVATE KEY-----

Кстати, оба закрытых ключа успешно расшифровывают один и тот же зашифрованный текст.
И команда openssl:

openssl genrsa -out rsa_private_key_2048.pem 2048
openssl pkcs8 -topk8 -in rsa_private_key_2048.pem -out pkcs8_rsa_private_key_2048.pem -nocrypt

person xuanzhui    schedule 13.03.2017    source источник
comment
Java не поддерживает загрузку ключей pkcs1. Как вы его загрузили?   -  person pedrofb    schedule 13.03.2017
comment
@pedrofb Я вставил свой код, просто проигнорируйте строки -----BEGIN RSA PRIVATE KEY----- и -----END RSA PRIVATE KEY-----, затем соедините другую строку, декодируйте окончательную строку с помощью инструмента base64 в массив байтов, который будет параметром конструктора PKCS8EncodedKeySpec. Просто чтобы уточнить, я использую java8.   -  person xuanzhui    schedule 13.03.2017
comment
Запуск вашего примера с помощью java8 и клавиши -----BEGIN RSA PRIVATE KEY----- вызывает Caused by: java.security.InvalidKeyException: IOException : algid parse error, not a sequence. Убедитесь, что вы читаете правильный файл, потому что вы не сможете загрузить ключ pkcs1.   -  person pedrofb    schedule 13.03.2017
comment
@pedrofb, спасибо за ваш тест, я просто обнаружил, что у меня есть статическое выражение static { Security.addProvider(new BouncyCastleProvider()); }, которое используется для других целей, похоже, оно влияет на поведение по умолчанию. После того, как я удаляю заявление, я получаю ту же ошибку в вашем комментарии.   -  person xuanzhui    schedule 13.03.2017
comment
Bouncycastle может загружать ключи PCKS#1, поэтому ваш код использовал криптографический провайдер BouncyCastle вместо JVM по умолчанию. Подводя итог, чтобы загрузить ключ pkcs1, вы можете преобразовать его в pkcs8 с помощью openssl или использовать Bouncycastle.   -  person pedrofb    schedule 13.03.2017
comment
Проверьте код KeyFactory.getInstance, он будет перебирать доступных провайдеров, во время процесса возникнет исключение, но оно будет перехвачено до тех пор, пока не будет найден способный провайдер или не будет достигнут последний провайдер. Это должно быть причиной того, что добавление BouncyCastleProvider работает.   -  person xuanzhui    schedule 13.03.2017
comment
Хорошо, теперь ясно   -  person pedrofb    schedule 14.03.2017
comment
Вот решение: stackoverflow.com/a/55339208/975386   -  person Jean-Alexis Aufauvre    schedule 25.03.2019


Ответы (1)


Что делать, если строка закрытого ключа в формате PEM (формат PKCS # 1) передается на входе полезной нагрузки json. PKCS8EncodedKeySpec в настоящее время работает как для PKCS#1, так и для PKCS#8. Поставщик — SunRsaSign.

person Vikas Rai    schedule 20.02.2019
comment
Это не дает ответа на вопрос. Вы можете выполнить поиск похожих вопросов или обратиться к связанным и связанным вопросам в правой части страницы, чтобы найти ответ. Если у вас есть похожий, но другой вопрос, задайте новый вопрос и включите ссылку на этот вопрос, чтобы обеспечить контекст. См.: Задавайте вопросы, получайте ответы, не отвлекайтесь - person Zoe; 20.02.2019