Android KeyPairGenerator + php openssl_public_encrypt

时间:2013-02-23 14:08:05

标签: java php android openssl rsa

我有一个生成公钥+私钥对的客户端(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-----";

我已经打破了这个问题一段时间,我在网上遇到的任何建议都没有帮助。任何想法都会有所帮助!

1 个答案:

答案 0 :(得分:1)

通过进行2次更改来管理最终解决问题 -

  1. 必须在Java端使用Base64.NO_WRAP标志而不是Base64.DEFAULT
  2. 在块分割后添加了php中的前缀/后缀 - $publicKey = "-----BEGIN PUBLIC KEY-----\r\n" . chunk_split($publicKey) . "-----END PUBLIC KEY-----";
相关问题