У меня есть сценарий, в котором я помещаю закрытый ключ 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;
}