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

如何让C# AES加密方法返回结果与指定Java方法完全一致

问题核心错误点

你之前的C#实现存在两个致命偏差,导致结果和Java不一致:

  • 模式选择错误:Java中调用Cipher.getInstance("AES")时,若不指定模式和填充规则,JDK默认使用AES/ECB/PKCS5Padding方案,而非CBC模式。ECB模式不需要初始化向量(IV),你之前强制使用CBC模式,即便传入null作为IV,.NET运行时也会自动生成随机IV,直接导致每次加密结果不同。你调试拿到的cipher.getIV(): null也正好印证了当前Java实现未使用需要IV的链式加密模式。
  • 密钥解析错误:Java端是将十六进制格式的密钥字符串通过hexStringToByteArray转为16字节的二进制密钥,你之前直接将密钥字符串做UTF8编码后截取前16字节,得到的密钥和Java端完全不一致。

注:Java的PKCS5Padding和C#的PKCS7Padding对AES(16字节块长)完全兼容,填充规则一致,不需要调整。

修正后的C#代码
// 与Java端完全一致的十六进制格式密钥
private const string KeyHex = "0123456789ABCDEF0123456789ABCDEF";

public static string Encrypt(string text)
{
    // 1. 和Java逻辑对齐:将十六进制密钥转为二进制字节数组,不要直接用UTF8编码密钥字符串
    byte[] key = HexStringToByteArray(KeyHex);
    byte[] plainBytes = Encoding.UTF8.GetBytes(text);

    using (Aes aes = Aes.Create())
    {
        // 2. 匹配Java默认配置:ECB模式、PKCS7填充(对应Java端PKCS5Padding)
        aes.Mode = CipherMode.ECB;
        aes.Padding = PaddingMode.PKCS7;
        aes.KeySize = 128;
        aes.BlockSize = 128;
        aes.Key = key;
        // ECB模式不需要IV,无需设置IV属性,运行时不会自动生成随机值

        using (ICryptoTransform encryptor = aes.CreateEncryptor())
        using (MemoryStream ms = new MemoryStream())
        using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
        {
            cs.Write(plainBytes, 0, plainBytes.Length);
            cs.FlushFinalBlock();
            byte[] cipherBytes = ms.ToArray();
            // 3. 和Java逻辑对齐:将密文字节数组转为十六进制字符串返回
            return ByteArrayToHexString(cipherBytes);
        }
    }
}

// 保留你已经实现的两个十六进制转换方法即可,不需要修改逻辑
private static byte[] HexStringToByteArray(string hex) { /* 原有实现 */ }
private static string ByteArrayToHexString(byte[] bytes) { /* 原有实现 */ }
验证结果

传入明文Password123时,上述代码会稳定返回密文6836A38816248A0C7DD89400A997251A,和Java端输出完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:09:27