Открытый ключ RSA, сгенерированный в Java, недопустим в php - PullRequest
0 голосов
/ 27 декабря 2018

Я создаю пару ключей RSA в Java и хочу использовать ее в PHP.Код Java выглядит следующим образом:

public static boolean keyGen() throws NoSuchAlgorithmException, IOException, OperatorCreationException, InvalidKeySpecException {
    KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA");  
    kpGen.initialize(2048, new SecureRandom());  
    KeyPair keyPair = kpGen.generateKeyPair();  

    PublicKey pub = keyPair.getPublic();
    byte[] pubBytes = pub.getEncoded();
    SubjectPublicKeyInfo spkInfo = SubjectPublicKeyInfo.getInstance(pubBytes);
    ASN1Primitive primitive = spkInfo.parsePublicKey();
    byte[] publicKeyPKCS1 = primitive.getEncoded();
    PemObject pemObject = new PemObject("RSA PUBLIC KEY", publicKeyPKCS1);
    StringWriter stringWriter = new StringWriter();
    PemWriter pemWriter = new PemWriter(stringWriter);
    pemWriter.writeObject(pemObject);
    pemWriter.close();
    String pemString = stringWriter.toString();
    FileOutputStream fos2 = new FileOutputStream("pubk.key");  
    fos2.write(pemString.getBytes());  
    fos2.flush();  
    fos2.close();
}

Сгенерированный открытый ключ выглядит следующим образом:

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAh8cQcRitRdEIzcWDpgDhGTxU4e/4CnFcCi4pEi8Pitme4+9MlVOQ
EtwpiaH54nbxBLZX6m/Z0EETqE9hJm02L8cgvp6/T08atJ9NAayEkN5TFSgdmh3Y
CwGa0ckHlO1lzN3jghUTxLnYEHOvBXVaY1SpDEUlLUi6WKsyklqHK+r6fPa9X1sY
6847VPTQX8ORC13LEzdZrGSR39473HTBhR6SzyTET47AgHPy2Q+FMIvN7DeuX5dK
XtQUlvAjJ7KVQJIXuFEzNvHQfUzjJj+LO2MHX77KbGg6Ytz06CnsWS2f6YKBY3Bg
BQ2zqjE2ON1jDLUcika+2ihEzpfXFGLY9wIDAQAB
-----END RSA PUBLIC KEY-----

И я импортирую сохраненный файл ключа с помощью PHP следующим образом:

 $keyString = file_get_contents($filePath);
 openssl_pkey_get_public($keyString);

А при попытке шифрования с использованием openssl_public_encrypt выдает ошибку

openssl_public_encrypt (): параметр ключа не является допустимым открытым ключом

ОднакоЯ попробовал то же самое с файлом ключа, сгенерированным JavaScript, и он работает хорошо.Любая помощь?

1 Ответ

0 голосов
/ 28 декабря 2018

Ключ, очевидно, должен быть в формате SubjectPublicKeyInfo, иногда называемом форматом «X.509» - но не то же самое, что сертификат X.509 - просто чтобы добавить к общей путанице.Я получил эту информацию не из документации , а из комментариев пользователей ниже.

К счастью, для создания этого кода требуется еще меньше строк, как показывает этот небольшой фрагмент кода, адаптированный из вашего кода:

    PublicKey pub = keyPair.getPublic();
    byte[] pubBytes = pub.getEncoded();
    PemObject pemObject = new PemObject("PUBLIC KEY", pubBytes);
    StringWriter stringWriter = new StringWriter();
    PemWriter pemWriter = new PemWriter(stringWriter);
    pemWriter.writeObject(pemObject);
    pemWriter.close();
    System.out.println(stringWriter.toString());
...