PKCS8EncodedKeySpec способен декодировать RSA PrivateKey в формате PKCS # 1 и PKCS # 8.Но не для алгоритма Ec - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть сценарий, в котором я помещаю закрытый ключ RSA / EC (созданный openssl) в полезную нагрузку JSON.У меня есть настроенный парсер, где я ищу баннеры и извлекаю информацию между ними.

Теперь для ключа RSA, независимо от того, PKCS # 1 (по умолчанию openssl) или PKCS # 8, работает следующий код:

KeyFactory factory = KeyFactory.getInstance("RSA"); 
PrivateKey privateKey  = factory.generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes));

, где privateKeyBytes - декодированный base64 байт закрытого ключа.Закрытый ключ имеет формат PEM, который я вставил в полезную нагрузку JSON.

Однако, когда я создаю закрытый ключ для алгоритма EC через openssl, тот же фрагмент кода выдает следующую ошибку:

java.security.spec.InvalidKeySpecException:
    java.security.InvalidKeyException: IOException : version mismatch:
    (supported: 00, parsed: 01)

КогдаЯ конвертирую созданный pem в формат PKCS # 8 с помощью (openssl pkcs8 команда), затем он работает.

Примечание. В моем коде используется поставщик "SUNRSA" для алгоритма RSA и "SUNEC" поставщик для алгоритма EC.

Ключи RSA, например, генерируются следующим образом: Примечание: KeySize - это размер ключа, который вы хотите сгенерировать, т.е. 1024/2048 и т. Д.

   ` public static KeyPair generateRsaKeyPair(int keySizeInBits) throws NoSuchAlgorithmException {
    KeyPairGenerator r = KeyPairGenerator.getInstance("RSA");
    r.initialize(keySizeInBits, RandomUtil.getSecureRandom());
    KeyPair keypair = r.generateKeyPair();
    return keypair;
}`

И пара ключей EC генерируется следующим образом:Примечание: CurveType - это тип кривой, используемой для генерации пары ключей алгоритма EC, например: prime256v1

    public static KeyPair generateEcKeyPair(String curveType) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC","BC");

ECGenParameterSpec ecsp = new ECGenParameterSpec(curveType);
kpg.initialize(ecsp, new SecureRandom());

KeyPair kpU = kpg.generateKeyPair();
return kpU;
}
...