Чтение зашифрованной PKCS8 SpongyCastle Java

1

Я следую за кодом в: qaru.site/questions/1491469/... но я получаю исключение в следующей строке:

FileInputStream fis = new FileInputStream(priv);
DataInputStream dis = new DataInputStream(fis);
byte[] keyBytes = new byte[(int)priv.length()];
dis.readFully(keyBytes);
dis.close();
javax.crypto.EncryptedPrivateKeyInfo encryptPKInfo = new EncryptedPrivateKeyInfo(keyBytes);
//Exception: 
org.apache.harmony.security.asn1.ASN1Exception: Wrong content length

Я пытаюсь прочитать файл.key/.pem PKCS8, который:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK Info: AES-256-CBC,8AFF348907C84F2F6370A216DC0D55D9

1VIjJD3dZ5/wYnIm0mtp8d22RC24yGcY9LXgeHUDbyPJQa8PjupubFqKrpOodvQx
dPfE1F3XeY8oVG42ZfR4287X4V16n++BQCeDiuvyrwacLMAuQz6PFLT4b/Py89Cm
761UZpaWnH0PHfJqB9CHqC+pGAGfRF5vj7UtdNchCwBmo+7gvU5iGyYXNRJ/hPnU
V+8QDzro4kFIMOlDzHaJ3KN1Ftbb9LDjDNE/NShbRrAFAWJMZSY/ZjF8mfqggkoZ
            %%%%%  SKIPPED MOST OF IT %%%%%%%%%%
BMIl0y5XVgPwkApA30EdgV4YAZEJ+wQLnYIZfCklqzvCfyjxHFViVW6d41WNm8bx
wl28v4QJKlnf7KNcmmGwSmjKo7BEASSZ+XVYRu0R6FaE+Job5YzPrtUI+p/kf7et
Y+jUDbZ4BPvB8j2ZscNRs+pJkEXxPt5JKW/oQMQZPlbTtSV5K1IqiuVcRi9TbCzk
nWDSfI/wxt6cK3X9XvyOpOZDCDPchkIhDhCzfitd7fzkM1VBekwsliJwjgc1bwbc
nI4AhQcNb8li7oX1M2osyeR3zF25BDb2A04Zm1lMrWkFrypb24DKkSJxYEH33Gpu
-----END RSA PRIVATE KEY-----
Теги:
rsa
pem
spongycastle

2 ответа

1
Лучший ответ

После долгого поиска решения я наткнулся на библиотеку, которая помогает мне и работает на Android. Пока еще не Commons

http://juliusdavies.ca/commons-ssl/

FileInputStream in = new FileInputStream( "/path/to/pkcs8_private_key.der" );

PKCS8Key pkcs8 = new PKCS8Key( in, "changeit".toCharArray() );

byte[] decrypted = pkcs8.getDecryptedBytes();
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec( decrypted );

// A Java PrivateKey object is born.
PrivateKey pk = null;
if ( pkcs8.isDSA() )
{
   pk = KeyFactory.getInstance( "DSA" ).generatePrivate( spec );
}
else if ( pkcs8.isRSA() )
{
   pk = KeyFactory.getInstance( "RSA" ).generatePrivate( spec );
}
// For lazier types (like me):
pk = pkcs8.getPrivateKey();
0

javax.crypto.EncryptedPrivateKeyInfo ожидает DER-кодированный вход, в то время как содержимое вашего файла, очевидно, находится в кодировке PEM.

Связь между PEM и DER заключается в следующем:

  • DER - это фактические данные, закодированные ASN.1, в виде последовательности байтов.
  • PEM основан на тексте со всеми этими -----BEGIN SOMETHING----- и -----END SOMETHING----- заголовками и Base64-кодированными данными внутри. В принципе, PEM - это заголовок + Base64 (DER) +footer.

Вам нужно преобразовать ваш ключ в формат DER, например, используя команду OpenSSL pkey:

openssl pkey -in key.pem -outform DER -out key.der
  • 0
    Это делается в Android и Spongycastle, мне нужно избегать использования openssl в качестве необходимого. То, как я это делаю, это первая попытка, но я бы не отказался от изменений.
  • 0
    Конвертируйте ключ один раз на рабочий стол и после этого просто используйте файл der на Android.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню