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

