从Java的RSAUtils.encryptByPublicKey迁移至PHP的openssl_public_encrypt遇无输出问题求助
解决PHP中openssl_public_encrypt无输出的问题
嘿,我来帮你搞定这个加密转换的问题!你用PHP的openssl_public_encrypt没得到输出,主要是因为Java和PHP的RSA加密在公钥格式、填充方式上有差异,咱们一步步来调整:
1. 先修复公钥格式
你提供的MerchantPublicSecretKey是原始的Base64编码公钥,PHP的openssl函数需要带标记的PEM格式。咱们得给它加上头部和尾部:
$merchantPublicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDrXM8q2qrEuH+xFVcEpeiV4yX7r/5+SsjgLD/OF3VPYqKA07xOklLXhJqT8Shjtu/uye9BahqajqOiP9PjqAsN1amGodE1POhsAO537Av+pIh1sX1ULr+0fzxWzwphE3SX2dImTwWWxdZZB45P2GMtR1F+jA4E2Ud8oO1KIaX++QIDAQAB'; // 转换为PEM格式 $pemPublicKey = "-----BEGIN PUBLIC KEY-----\n" . chunk_split($merchantPublicKey, 64, "\n") . "-----END PUBLIC KEY-----";
2. 正确处理待加密的JSON数据
Java里是把JSON对象转成UTF-8字节数组,PHP里要先把数组转成JSON字符串,再确保是UTF-8编码:
$userInfo = [ "payCardNo" => "test1", "payCardBank" => "test2", "payCardBranch" => "test3" ]; // 转成JSON字符串并确保UTF-8编码 $userInfoJson = json_encode($userInfo, JSON_UNESCAPED_UNICODE); $userInfoBytes = utf8_encode($userInfoJson);
3. 匹配Java的加密参数执行加密
Java的RSAUtils.encryptByPublicKey默认用的是RSA/ECB/PKCS1Padding填充方式,PHP里要明确指定这个填充模式,不然会用默认的可能不匹配:
$encrypted = ''; // 执行加密 $encryptSuccess = openssl_public_encrypt($userInfoBytes, $encrypted, $pemPublicKey, OPENSSL_PKCS1_PADDING); if ($encryptSuccess) { // 最后Base64编码,和Java的Base64Utils.encode对应 $sign = base64_encode($encrypted); echo $sign; } else { // 加密失败时可以打印错误信息排查 echo "加密失败:" . openssl_error_string(); }
可能踩的坑
- 如果还是失败,先检查
openssl_error_string()的输出,大概率是公钥格式不对或者填充不匹配 - 确保PHP的openssl扩展已经启用(可以用
phpinfo()查看) - json_encode的时候如果有中文,记得加
JSON_UNESCAPED_UNICODE避免转义,和Java的字节流保持一致
内容的提问来源于stack exchange,提问作者aaa
相关产品推荐
相关产品推荐

