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

Java AES/CBC/PKCS5Padding加密转C#结果不匹配问题求助

差异点梳理
  • 核心错误:加密内容写入逻辑错误:你的C#代码中使用StreamWriter的Write方法传入byte[]类型的token字节数组。StreamWriter是文本写入类,传入非字符串类型时会自动调用ToString()方法,最终写入加密流的是"System.Byte[]"这个字符串的编码结果,完全不是你预期的token原始字节,这是加密结果不一致的最主要原因。
  • 可选适配:Base64结果修剪:Java代码中使用StringsKt.trim修剪了Base64结果的首尾空白(Java端Base64.DEFAULT参数会默认在编码结果末尾追加换行符),C#的Convert.ToBase64String默认不会生成换行符,建议增加Trim()调用保证逻辑完全对齐。
  • 配置顺序建议:AES实例的Mode、Padding属性建议在赋值Key、IV之前配置,避免部分框架实现中配置属性触发密钥/IV重置的问题。
  • 填充模式无影响:你查阅的结论正确,AES场景下PKCS5Padding和PKCS7Padding完全等效,填充模式不是问题原因。
修正后可正常运行的代码
public static string Encrypt(string token)
{
    if (string.IsNullOrEmpty(token))
    {
        throw new ArgumentNullException(nameof(token));
    }
    byte[] key = new byte[] { 55, 66, 53, 68, 55, 66, 67, 50, 52, 66, 53, 67, 52, 69, 51, 65, 56, 48, 70, 66, 66, 67, 50, 65, 49, 49, 53, 54, 69, 52, 51, 55 };
    using (Aes aesAlg = Aes.Create())
    {
        // 先配置模式和填充
        aesAlg.Mode = CipherMode.CBC;
        aesAlg.Padding = PaddingMode.PKCS7;
        aesAlg.Key = key;
        // 测试时替换为固定IV的字节:Encoding.UTF8.GetBytes("h62PmLFO5Yq4SxQw")
        aesAlg.IV = GenerateIv(16);
        byte[] IV = aesAlg.IV;
        
        var encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
        byte[] inputBytes = Encoding.UTF8.GetBytes(token);
        byte[] encrypted = encryptor.TransformFinalBlock(inputBytes, 0, inputBytes.Length);

        StringBuilder sb = new StringBuilder();
        sb.Append(Encoding.UTF8.GetString(IV));
        string encodedString = Convert.ToBase64String(encrypted).Trim();
        sb.Append(encodedString);
        return sb.ToString();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:24:04