用Java生成的RSA公钥在php中无效 [英] RSA public key generated in Java is not valid in php

查看:77
本文介绍了用Java生成的RSA公钥在php中无效的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在用Java创建RSA密钥对,并想在PHP中使用它.Java代码如下:

I'm creating a RSA key pair in Java and want to use it in PHP. Java code is as follows:

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导入保存的密钥文件,如下所示:

And I'm importing the saved key file using PHP as follows:

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

当尝试使用 openssl_public_encrypt 进行加密时,它给我错误

And when try to encrypt using openssl_public_encrypt it gives me the error

openssl_public_encrypt():密钥参数不是有效的公共密钥

openssl_public_encrypt(): key parameter is not a valid public key

但是,我尝试使用JavaScript生成的密钥文件进行同样的操作,并且效果很好.有帮助吗?

However I tried the same with a JavaScript generated key file and it works well. Any help?

推荐答案

密钥显然需要采用SubjectPublicKeyInfo格式,有时也称为"X.509"格式-但与X.509证书不同-只是增加了混乱的海洋.我不是从文档获取此信息,而是从用户在下面的评论.

The key evidently needs to be in SubjectPublicKeyInfo format, sometimes referred to as "X.509" format -- but not the same thing as an X.509 certificate -- just to add to the general sea of confusion. I got this info not from the documentation but from the user comments below.

幸运的是,生成此代码所需的行数甚至更少,因为从您的代码改编而成的这段代码片段说明了这一点:

Fortunately this takes even fewer lines of Java code to produce, as this little code fragment adapted from your code illustrates:

    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());

这篇关于用Java生成的RSA公钥在php中无效的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆