C#与OpenSSL的AES-128-CBC解密结果不一致求助
AES-CBC解密:C#与OpenSSL结果不一致问题
问题根源
你的C#代码中使用StreamReader读取解密后的字节流,而StreamReader默认会将字节按UTF-8编码解析为字符串。但解密后的原始字节并非合法的UTF-8序列,无法识别的字节被自动替换为0xEF 0xBF 0xBD(即你看到的EFBFBD),这就是导致与OpenSSL结果不一致的核心原因——OpenSSL直接输出原始解密字节,而C#这边被编码转换破坏了数据。
修正后的代码
直接读取解密后的原始字节数组,避免不必要的编码转换:
public static byte[] DecryptWithOpenSSL(byte[] cipherText, byte[] key, byte[] iv) { try { using (Aes aesAlg = Aes.Create()) { aesAlg.Key = key; aesAlg.IV = iv; aesAlg.Mode = CipherMode.CBC; aesAlg.Padding = PaddingMode.None; ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); using (MemoryStream msDecrypt = new MemoryStream(cipherText)) using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) using (MemoryStream resultStream = new MemoryStream()) { csDecrypt.CopyTo(resultStream); return resultStream.ToArray(); } } } catch (Exception ex) { Console.WriteLine("Error decrypting data: " + ex.Message); return null; } }
验证说明
- 修正后的方法返回原始字节数组,与OpenSSL输出的解密字节完全一致
- 若需将字节转换为字符串,需确保解密后的字节是对应编码的合法序列(如ASCII、UTF-16等);若仅需原始二进制数据,直接使用字节数组即可
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

