Как расшифровать закрытый ключ в Java (без BC openssl)

Возможно ли расшифровать зашифрованные закрытые ключи RSA (или другие, не имеющие значения) с помощью JCE и / или поставщика BouncyCastle (не используя пакет openssl)?

Я могу читать незашифрованные ключи просто отлично, используя PrivateKeyFactory.

Поискивая это, дают мне примеры использования PEMReader (из пакета BC openssl), к которому применен пароль, но - я не хочу использовать пакет openssl, не обязательно хочу использовать формат PEM, и я могу декодировать PEM, используя PemReader (из комплекта провайдера). Это то, что я могу сделать с этим потом, вопрос.

Я ищу какую-то мега-функцию или ее серию, которая может это сделать, то есть я не собираюсь анализировать ASN1 зашифрованного ключа, выяснять метод шифрования, передавать ввод через шифр и т. Д.

1 ответ

Решение

Если у вас зашифрованный ключ PKCS#8 в двоичном формате (т.е. не в формате PEM), следующий код показывает, как получить закрытый ключ:

public PrivateKey decryptKey(byte[] pkcs8Data, char[] password) throws Exception {
    PBEKeySpec pbeSpec = new PBEKeySpec(password);
    EncryptedPrivateKeyInfo pkinfo = new EncryptedPrivateKeyInfo(pkcs8Data);
    SecretKeyFactory skf = SecretKeyFactory.getInstance(pkinfo.getAlgName());
    Key secret = skf.generateSecret(pbeSpec);
    PKCS8EncodedKeySpec keySpec = pkinfo.getKeySpec(secret);
    KeyFactory kf = KeyFactory.getInstance("RSA");
    return kf.generatePrivate(keySpec);
}

Если у вас есть формат PEM, удалите верхний колонтитул (первая строка), нижний колонтитул (последняя строка) и преобразуйте оставшийся контент из base64 в обычный байтовый массив.

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