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

PHP生成RSA签名XML,C#验证不通过问题求助

问题根源及解决方案

导致PHP签名无法被C#验证的核心原因有两点,以下是针对性修复方案:

关键问题分析

  • 字符编码不匹配:C#使用Encoding.Unicode(即UTF-16小端字节序)将字符串转换为字节数组,而PHP默认采用UTF-8编码,二者输入的原始字节完全不同。
  • 重复哈希操作:C#的SignData方法会自动对输入字节执行SHA256哈希后再签名;你的PHP代码先手动哈希一次,再调用sign方法,导致数据被双重哈希,签名逻辑完全不符。

修正后的PHP签名代码

$rsa = new Crypt_RSA();
// 注意:如果私钥是C#导出的XML格式,需先转换为PEM格式再加载
$rsa->loadKey($privateKey);

$rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
$rsa->setHash('sha256');

// 1. 将字符串转为C#一致的UTF-16LE编码
$unicodeData = mb_convert_encoding($encryptedData, 'UTF-16LE', 'UTF-8');
// 2. 直接对原始编码字节签名,无需手动哈希
$signature = base64_encode($rsa->sign($unicodeData));

额外注意事项

如果你的$privateKey是C#导出的XML格式(以<RSAKeyValue>开头),Crypt_RSA无法直接识别,需要先将其转换为PEM格式(可通过工具或代码转换),确保PHP能正确加载密钥。

内容的提问来源于stack exchange,提问作者tawfiq_albatsh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:30:56