【问题标题】:RSA public key generated in Java is not valid in php用 Java 生成的 RSA 公钥在 php 中无效
【发布时间】:2018-12-27 15:52:31
【问题描述】:

我正在用 Java 创建一个 RSA 密钥对,并希望在 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(): key 参数不是一个有效的公钥

不过,我对 JavaScript 生成的密钥文件进行了同样的尝试,并且效果很好。有什么帮助吗?

【问题讨论】:

  • 您的描述有问题。您在 Java 中输出一个 公钥,然后声称您已成功调用了 openssl_pkey_get_private(...),并且仅在您尝试使用此密钥时收到错误。
  • @JamesKPolk 谢谢,那是个错误。应该是openssl_pkey_get_public(...)。我编辑了这个问题。有什么提示吗?
  • $keyString 长什么样子?
  • 另外,显示您的 PHP 代码。你是如何尝试加密的?你在用openssl_pkey_get_public做什么?
  • 看起来你得到了答案。这就是我要说的。您需要一个带有“PUBLIC KEY”标头而不是“RSA PUBLIC KEY”的公钥

标签: java php bouncycastle public-key-encryption php-openssl


【解决方案1】:

密钥显然需要采用 SubjectPublicKeyInfo 格式,有时称为“X.509”格式——但与 X.509 证书不同——只是为了增加一般的混乱。我不是从documentation 那里得到这个信息,而是从下面的用户 cmets 那里得到的。

幸运的是,生成的 Java 代码行数更少,正如这个改编自您的代码的小代码片段所示:

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

【讨论】:

    最近更新 更多