Java 安卓键盘生成器+;php openssl\u公共\u加密

Java 安卓键盘生成器+;php openssl\u公共\u加密,java,php,android,openssl,rsa,Java,Php,Android,Openssl,Rsa,我有一个客户端(安卓设备),可以生成公钥+私钥对。它将公钥发送到服务器,服务器应使用公钥加密一些数据并返回,以便客户端稍后可以使用私钥解密。我的php代码记录了一条警告,指出我提供的公钥无效 在设备端,我生成密钥对,如下所示- KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); kpg.initialize(256); KeyPair kp = kpg.generateKeyPair(); PublicKey publicKey

我有一个客户端(安卓设备),可以生成公钥+私钥对。它将公钥发送到服务器,服务器应使用公钥加密一些数据并返回,以便客户端稍后可以使用私钥解密。我的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 = $_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-----";

有一段时间我对这件事感到很沮丧,而我在网上遇到的建议似乎都没有帮助。任何想法都会很有帮助

通过做两个更改,最终解决了这个问题-

  • 不得不在Java端使用
    Base64.NO_WRAP
    标志,而不是
    Base64.DEFAULT
  • 在区块分割之后在php中添加了前缀/后缀-
    $publicKey=“------开始公钥------\r\n”。区块分割($publicKey)。“----结束公钥------”

  • 通过进行2项更改,最终解决了问题-

  • 不得不在Java端使用
    Base64.NO_WRAP
    标志,而不是
    Base64.DEFAULT
  • 在区块分割之后在php中添加了前缀/后缀-
    $publicKey=“------开始公钥------\r\n”。区块分割($publicKey)。“----结束公钥------”

  • 叹息。。。PHP如何摆脱如此糟糕的文档?甚至连公钥的格式都没有说!注意,向另一方发送公钥是不足以避免中间人攻击的;您如何知道公钥来自正确的一方?任何人都可以给你发公钥…@owlstead:你说得很有道理。我向服务器发送了一个公钥,以便通过动态生成它们来避免在设备端硬编码/捆绑私钥。如果我改为使用对称密钥而不将其传递,我担心密钥可能会从android软件包中提取出来。我想我需要再考虑一下…叹气。。。PHP如何摆脱如此糟糕的文档?甚至连公钥的格式都没有说!注意,向另一方发送公钥是不足以避免中间人攻击的;您如何知道公钥来自正确的一方?任何人都可以给你发公钥…@owlstead:你说得很有道理。我向服务器发送了一个公钥,以便通过动态生成它们来避免在设备端硬编码/捆绑私钥。如果我改为使用对称密钥而不将其传递,我担心密钥可能会从android软件包中提取出来。我想我需要再考虑一下。。