请求将C# AES加密+RSA签名代码转为PHP,解决解密错误
C#转PHP加密签名代码实现
原始C#代码
// 输入为Base64格式 byte[] encryptedContent = _crypto.AESEncrypt(input, key); string bContent = Convert.ToBase64String(encryptedContent); byte[] bSignature = _crypto.RSASign(Encoding.ASCII.GetBytes(bContent)); request.Data.Content = bContent; request.Data.Signature = Convert.ToBase64String(bSignature);
问题描述
您好,能否有人帮我将上述C#代码转换为PHP代码?我尝试向服务器发送经过加密和签名的内容,但遇到了数据解密错误。
自行尝试的PHP代码
// encryption code $encrypt_json = openssl_encrypt(json_encode($Pjoson), "AES-128-GCM", "$SMKey");
匹配C#逻辑的PHP实现
你的解密错误大概率是因为PHP代码和C#的加密/签名逻辑不匹配,以下是严格对齐原C#流程的实现:
// 输入为Base64格式字符串 $input = "你的Base64输入内容"; $aesKey = "你的AES密钥"; $rsaPrivateKey = "你的RSA私钥(PEM格式)"; // 1. AES加密输入内容(必须和C#的AES参数完全一致) // 假设C#的AESEncrypt使用AES-128-CBC、PKCS7填充,且使用固定/约定的IV $iv = "16字节的IV(需与C#端完全相同)"; $encryptedContent = openssl_encrypt( $input, "AES-128-CBC", // 替换为C#实际使用的AES模式(如CBC/ECB等) $aesKey, OPENSSL_RAW_DATA, // 输出原始字节数组,对应C#的byte[] $iv ); // 2. 将加密后的字节转Base64字符串 $bContent = base64_encode($encryptedContent); // 3. 对bContent的ASCII字节进行RSA签名 // 签名算法需与C#的RSASign一致(如SHA256withRSA) openssl_sign( mb_convert_encoding($bContent, 'ASCII'), // 对齐C#的ASCII编码 $bSignature, $rsaPrivateKey, OPENSSL_ALGO_SHA256 // 替换为C#实际使用的签名算法 ); // 4. 将签名转Base64字符串 $signature = base64_encode($bSignature); // 组装请求数据 $requestData = [ 'Content' => $bContent, 'Signature' => $signature ];
关键注意事项
- AES参数对齐:C#默认AES模式为CBC、填充为PKCS7,你当前用的GCM模式完全不匹配,这是解密失败的核心原因,必须和原代码的模式、填充、IV完全一致
- 编码一致性:C#用ASCII编码处理签名内容,PHP默认是UTF-8,必须用
mb_convert_encoding转成ASCII - 密钥与IV:AES密钥长度要匹配(128位对应16字节),如果C#加密时自动生成IV,需要将IV一起传递给服务器(通常拼接在加密内容后或单独字段传递)
- 签名算法:确认C#的RSASign使用的哈希算法(如SHA1/SHA256),PHP的
openssl_sign要对应相同的算法
内容的提问来源于stack exchange,提问作者Essiw Sined
相关产品推荐
相关产品推荐

