760 字
4 分钟
AES 加密与解密:保障数据安全的利器

在现代开发中,保护敏感数据(如用户信息、支付凭证)的机密性是核心任务。AES(Advanced Encryption Standard) 作为目前全球最广泛使用的对称加密算法,是每个开发者必须掌握的“安全利器”。


一、 AES 算法深度解析#

AES 是一种对称加密算法,意味着加密和解密使用同一个密钥。它基于 Rijndael 算法,处理数据块的大小固定为 128 位。

1. 核心要素#

  • 密钥长度:支持 128、192 和 256 位。位数越高,破解难度指数级增加。
  • 工作模式 (Mode):如 CBC, ECB, GCM 等。
  • 填充模式 (Padding):如 PKCS7,确保明文长度符合块大小要求。
  • IV (初始化向量):增加加密的随机性,防止相同的明文生成相同的密文。

2. 加密轮次#

AES 不是一次性加密完成的,而是通过多轮迭代:

  1. 字节替换 (SubBytes):通过 S-Box 进行非线性映射。
  2. 行移位 (ShiftRows):打乱矩阵行顺序。
  3. 列混合 (MixColumns):对列进行线性变换。
  4. 轮密钥加 (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 模式。


四、 开发者的最佳实践总结#

  1. 密钥管理:不要将密钥硬编码在源码中!应使用环境变量、Azure Key Vault 或 AWS KMS。
  2. IV 的唯一性:每次加密应生成一个新的随机 IV,并将其附加在密文头部(解密时再取出来)。
  3. 使用 256 位密钥:虽然 128 位目前仍安全,但 256 位是应对未来量子计算威胁的推荐选择。
  4. 优先使用 GCM:如果你在 .NET Core 3.1+ 开发,考虑使用 AesGcm 类,它提供“关联数据的认证加密”,能同时保证机密性和完整性(防止密文被篡改)。

总结#

掌握 AES 不仅是学会调用 API,更要理解 IV、模式和填充 的意义。正确使用 AES,能为你的应用建立起一道不可逾越的数据防线。

AES 加密与解密:保障数据安全的利器
https://sw.rscclub.website/posts/csharpaesjjm/
作者
杨月昌
发布于
2019-03-26
许可协议
CC BY-NC-SA 4.0