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

请求将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:55:19