C#怎么加密解密TXT文件_C#如何使用AES算法保护本地数据【附源码】

穿越時空

穿越時空

2026-04-23

440人浏览

原创

aes.create() 可能返回 null,应判空回退为 new aesmanaged();iv 必须每次随机生成并随密文存储;key 应用 rfc2898derivebytes 派生,长度严格匹配(如 aes-256 需 32 字节);加解密端 ciphermode、paddingmode、编码必须一致。

c#怎么加密解密txt文件_c#如何使用aes算法保护本地数据【附源码】

Aes.Create() 可能返回 null,别直接 new Aes() —— 用判空回退更稳

在 .NET Framework 4.5 以下、Unity IL2CPP 构建、或某些 AOT 编译环境里,Aes.Create() 会返回 null,不是你漏了 using 或写错了语法。硬写 new Aes() 会编译失败,因为 Aes 是抽象类。

  • 正确做法是:var aes = Aes.Create() ?? new AesManaged();
  • AesManaged 是纯托管实现,.NET Core 3.1+ 和 .NET 5/6/7/8 全支持,跨平台无坑;AesCryptoServiceProvider 调 Windows CryptoAPI,Linux/macOS 上直接抛 PlatformNotSupportedException,别乱换
  • .NET 6+ 推荐优先用 Aes.Create(),但必须判空——这是生产环境最常被忽略的兼容性断点

IV 必须随每次加密随机生成,且和密文一起存,不能硬编码

iv = Encoding.UTF8.GetBytes("1234567890123456") 写死在代码里,等于把 AES 降级成“带密码的凯撒位移”。攻击者拿到一个密文就能批量解密所有历史文件。

  • 加密时调用 aes.GenerateIV(),之后 aes.IV 就是安全随机值
  • 保存密文前,把 IV 拼在密文前面(比如前 16 字节),解密时先读出这 16 字节当 IV,再读剩余部分当密文
  • 示例序列化逻辑:var combined = new byte[16 + cipherBytes.Length]; Array.Copy(iv, 0, combined, 0, 16); Array.Copy(cipherBytes, 0, combined, 16, cipherBytes.Length);
  • 别用字符串拼接 IV 和 Base64 密文——Base64 编码后长度不可控,解码时无法准确定位 IV 边界

CryptoStream 解密时读不到完整内容?检查流关闭顺序和 StreamReader 编码

C函数速查手册(CHM版)
C函数速查手册(CHM版)

C函数速查手册(CHM版)

下载

常见现象:解密后 StreamReader.ReadToEndAsync() 返回空字符串或截断,但没报错。根源往往是流生命周期管理混乱,或编码不匹配。

  • CryptoStream 必须在 StreamReader 之前被 using 包裹,否则 StreamReader 关闭时可能触发 CryptoStream 的 flush 逻辑失败
  • StreamReader 默认用 UTF-8,但如果原始明文是 GB2312 或含 BOM 的 UTF-16,解密后就会乱码或提前终止;显式传入编码:new StreamReader(cryptoStream, Encoding.UTF8)
  • 确保文件流以 FileMode.Open 打开,且位置在开头;如果文件开头存了 IV,记得用 fileStream.Position = 16 跳过它再创建 CryptoStream
  • 别在 CryptoStream 外层套 BufferedStream——它会干扰块对齐,导致 CryptographicException: The input data is not a complete block

Key 长度不匹配是 CryptographicException 最高频原因

看到 CryptographicException 提示 “key size not valid” 或 “specified key is not a valid size”,基本就是 Key 字节数错了。AES-128 要 16 字节,AES-256 要 32 字节,差 1 字节都不行。

  • 别用 Encoding.UTF8.GetBytes("mykey123") 直接转字符串——长度不可控,且含可预测字符
  • 生产环境用 Rfc2898DeriveBytes 从口令派生 Key:给定 salt(至少 16 字节随机)和迭代次数(≥100000),输出指定字节数
  • 设置 aes.KeySize = 256 后,必须确保传给 aes.Key 的字节数组长度是 32;否则运行时报错,且错误信息不提示具体缺多少字节
  • 密钥和 IV 的编码、长度、模式(CipherMode.CBC)、填充(PaddingMode.PKCS7)三者必须在加解密两端完全一致,Java/Python 互操作时尤其注意对方是否用了 NoPaddingPKCS5

IV 的随机性和 Key 的派生方式,比选 CBC 还是 GCM 更容易被忽视——它们一旦出错,问题不会立刻暴露,而是让整个加密体系形同虚设。

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

2023.08.08

528

5

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

2023.08.31

1180

3

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

2024.03.13

556

8

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2024.03.14

1051

11

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

2026.02.03

148

18

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

2026.02.06

202

20

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

2026.03.11

526

24

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

2026.04.13

138

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RabbitMQ 教程手册
RabbitMQ 教程手册

共0课时 | 0人学习

Linux man-pages 项目
Linux man-pages 项目

共0课时 | 0人学习

C# 教程
C# 教程

共94课时 | 20.2万人学习