.NET 7下C# AES加密程序返回空字符串问题求助
修复.NET 7 AES加密返回空字符串的问题
你的代码存在几个关键问题,导致加密结果为空,以下是问题分析和修复方案:
问题点说明
- 变量名拼写错误:代码中
Encoding.UTF8.GetBytes(necriptat)里的necriptat是笔误,应该是定义好的unencrypted变量,这会导致无法正确获取输入字符串的字节数据。 - 错误使用StreamWriter写入字节:StreamWriter用于处理字符数据,直接传入byte数组会调用
byte[].ToString(),写入的是字符串System.Byte[]而非实际字节内容,完全偏离加密逻辑。 - 未刷新/关闭加密流:CryptoStream和StreamWriter的缓冲区数据未写入MemoryStream就调用
memoryStream.ToArray(),导致获取的是空数组。 - 加密字节直接转UTF8字符串:加密后的字节是二进制数据,并非合法的UTF-8编码字符,直接转换会导致乱码或空值。
修复后的代码
using System; using System.Security.Cryptography; using System.Text; using System.IO; internal class Program { private static void Main(string[] args) { string unencrypted = Console.ReadLine(); if (string.IsNullOrEmpty(unencrypted)) { Console.WriteLine("输入不能为空"); return; } byte[] inputBytes = Encoding.UTF8.GetBytes(unencrypted); string cipherText; // using语句自动释放资源,确保流被正确刷新和关闭 using (Aes aes = Aes.Create()) using (MemoryStream memoryStream = new MemoryStream()) { ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV); using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) using (BinaryWriter writer = new BinaryWriter(cryptoStream)) { writer.Write(inputBytes); } // 加密后的二进制数据转Base64字符串,避免编码问题 cipherText = Convert.ToBase64String(memoryStream.ToArray()); // 注意:如果需要后续解密,必须保存Key和IV(此处打印仅用于演示) Console.WriteLine("加密结果: " + cipherText); Console.WriteLine("AES密钥(Base64): " + Convert.ToBase64String(aes.Key)); Console.WriteLine("AES向量(Base64): " + Convert.ToBase64String(aes.IV)); } } }
关键修复细节
- 修正变量名拼写,确保正确读取输入字符串的字节数组。
- 用
BinaryWriter替代StreamWriter,正确写入二进制数据到加密流。 - 使用
using语句包裹所有实现IDisposable的对象,自动完成流的刷新和关闭,保证数据全部写入MemoryStream。 - 将加密后的二进制数组转换为Base64字符串,这是二进制数据转字符串的通用安全方式,避免UTF8编码导致的异常。
- 添加输入空值检查,避免空引用异常。
内容的提问来源于stack exchange,提问作者8K Tek
相关产品推荐
相关产品推荐

