You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 17:27:50