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

.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));
        }
    }
}

关键修复细节

  1. 修正变量名拼写,确保正确读取输入字符串的字节数组。
  2. 用BinaryWriter替代StreamWriter,正确写入二进制数据到加密流。
  3. 使用using语句包裹所有实现IDisposable的对象,自动完成流的刷新和关闭,保证数据全部写入MemoryStream。
  4. 将加密后的二进制数组转换为Base64字符串,这是二进制数据转字符串的通用安全方式,避免UTF8编码导致的异常。
  5. 添加输入空值检查,避免空引用异常。

内容的提问来源于stack exchange,提问作者8K Tek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:52:29