我有一个生成公钥+私钥对的客户端(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-----";
我已经打破了这个问题一段时间,我在网上遇到的任何建议都没有帮助。任何想法都会有所帮助!
答案 0 :(得分:1)
通过进行2次更改来管理最终解决问题 -
Base64.NO_WRAP
标志而不是Base64.DEFAULT
。$publicKey = "-----BEGIN PUBLIC KEY-----\r\n" . chunk_split($publicKey) . "-----END PUBLIC KEY-----";