1

我有一个生成公钥+私钥对的客户端(android 设备)。它将公钥发送到服务器,服务器应该使用公钥加密一些数据并将其返回,以便客户端稍后可以使用私钥对其进行解密。我的 php 代码记录了一条警告,指出我提供的公钥无效。

在设备端,我生成密钥对如下 -

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(256);
KeyPair kp = kpg.generateKeyPair();
PublicKey publicKey = kp.getPublic();

然后我base64编码并发布它 -

String urlParameters = "productID=" + productID + "&publicKey="
                + URLEncoder.encode(Base64.encodeToString(publicKey.getEncoded(),
                        Base64.DEFAULT)); // without the URLEncoder, the + signs
                                          // are turned into spaces

在服务器端,我从 POST 参数中提取 publicKey 并尝试使用它来编码一些数据 -

$publicKey = $_POST['publicKey'];
$encryptedData = '';
$productData = 'test test test';
openssl_public_encrypt($productData, $encryptedData, $publicKey);

这最终会在日志中出现以下错误 -

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

我还尝试在将公钥用于加密之前为其添加前缀和后缀,但这也无济于事 -

$publicKey = "-----BEGIN PUBLIC KEY-----\r\n" . $publicKey . "\r\n-----END PUBLIC KEY-----";

有一段时间我对此感到头疼,我在网上遇到的任何建议似乎都没有帮助。任何想法都会很有帮助!

4

1 回答 1

1

最终通过进行 2 项更改来解决问题 -

  1. 不得不使用Base64.NO_WRAP标志而不是Base64.DEFAULT在 Java 端。
  2. 分块后在 php 中添加前缀/后缀 - $publicKey = "-----BEGIN PUBLIC KEY-----\r\n" . chunk_split($publicKey) . "-----END PUBLIC KEY-----";
于 2013-02-23T16:22:29.800 回答