760 字
4 分钟
AES 加密与解密:保障数据安全的利器
在现代开发中,保护敏感数据(如用户信息、支付凭证)的机密性是核心任务。AES(Advanced Encryption Standard) 作为目前全球最广泛使用的对称加密算法,是每个开发者必须掌握的“安全利器”。
一、 AES 算法深度解析
AES 是一种对称加密算法,意味着加密和解密使用同一个密钥。它基于 Rijndael 算法,处理数据块的大小固定为 128 位。
1. 核心要素
- 密钥长度:支持 128、192 和 256 位。位数越高,破解难度指数级增加。
- 工作模式 (Mode):如 CBC, ECB, GCM 等。
- 填充模式 (Padding):如 PKCS7,确保明文长度符合块大小要求。
- IV (初始化向量):增加加密的随机性,防止相同的明文生成相同的密文。
2. 加密轮次
AES 不是一次性加密完成的,而是通过多轮迭代:
- 字节替换 (SubBytes):通过 S-Box 进行非线性映射。
- 行移位 (ShiftRows):打乱矩阵行顺序。
- 列混合 (MixColumns):对列进行线性变换。
- 轮密钥加 (AddRoundKey):与轮密钥异或。
二、 C# 实战:标准 CBC 模式加密
在 .NET 中,推荐使用 System.Security.Cryptography.Aes 类,它是目前性能和安全性平衡最好的选择。
1. 高安全性的加密实现
public static string Encrypt(string plainText, string keyString, string ivString){ // 将 Key 和 IV 转换为 byte[] byte[] key = Encoding.UTF8.GetBytes(keyString.PadRight(32)).Take(32).ToArray(); byte[] iv = Encoding.UTF8.GetBytes(ivString.PadRight(16)).Take(16).ToArray();
using (Aes aes = Aes.Create()) { aes.Key = key; aes.IV = iv; aes.Mode = CipherMode.CBC; // CBC 模式 aes.Padding = PaddingMode.PKCS7;
ICryptoTransform encryptor = aes.CreateEncryptor();
using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) { byte[] data = Encoding.UTF8.GetBytes(plainText); cs.Write(data, 0, data.Length); cs.FlushFinalBlock(); return Convert.ToBase64String(ms.ToArray()); } } }}三、 警惕:关于“无向量” ECB 模式
你在某些代码中可能会看到无 IV 的 ECB (Electronic Codebook) 模式。
⚠️ 安全警告:ECB 模式下,相同的明文块会生成完全相同的密文块。这会导致模式泄漏(如加密图像时仍能看出轮廓),极易受到重放攻击。
什么时候可以用 ECB?
仅当加密的数据非常短(小于一个块大小,16 字节)且不重复时。生产环境强烈建议优先使用 CBC 或 GCM 模式。
四、 开发者的最佳实践总结
- 密钥管理:不要将密钥硬编码在源码中!应使用环境变量、Azure Key Vault 或 AWS KMS。
- IV 的唯一性:每次加密应生成一个新的随机 IV,并将其附加在密文头部(解密时再取出来)。
- 使用 256 位密钥:虽然 128 位目前仍安全,但 256 位是应对未来量子计算威胁的推荐选择。
- 优先使用 GCM:如果你在 .NET Core 3.1+ 开发,考虑使用
AesGcm类,它提供“关联数据的认证加密”,能同时保证机密性和完整性(防止密文被篡改)。
总结
掌握 AES 不仅是学会调用 API,更要理解 IV、模式和填充 的意义。正确使用 AES,能为你的应用建立起一道不可逾越的数据防线。
AES 加密与解密:保障数据安全的利器
https://sw.rscclub.website/posts/csharpaesjjm/