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
相关产品推荐
相关产品推荐

