AES加密解密C#代码实现详解
AES(Advanced Encryption Standard)是一种对称分组加密算法,广泛用于保护敏感数据。在C#中,.NET框架提供了System.Security.Cryptography命名空间,内含AES算法的完整实现。本文将详细介绍如何使用C#编写AES加密和解密代码,包括密钥和初始化向量(IV)的生成、加密模式、填充模式等关键配置。
一、AES加密解密基础概念
AES加密使用固定长度的密钥(128位、192位或256位)对数据进行分组加密(分组大小为128位)。加密时需要一个初始化向量(IV)来增加加密结果的随机性,防止相同的明文产生相同的密文。常用的加密模式有CBC(密码分组链接模式)和ECB(电子密码本模式),推荐使用CBC模式。填充模式用于处理数据长度不是分组大小整数倍的情况,常见的有PKCS7。
二、C#中实现AES加密解密的步骤
在C#中,使用Aes类(或AesManaged、AesCryptoServiceProvider)进行加密解密。基本步骤如下:
创建
Aes实例。设置密钥(Key)和初始化向量(IV)。
选择加密模式(Mode)和填充模式(Padding)。
创建加密器或解密器(
ICryptoTransform)。对字节流进行加密或解密操作。
将结果转换为需要的格式(如Base64字符串)。
三、完整的C# AES加密解密示例
以下代码演示了如何使用AES-256-CBC模式进行加密和解密,密钥和IV通过安全随机数生成器创建。所有数据最终以Base64字符串形式输出。
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
public class AesEncryption
{
// 生成随机密钥(256位,即32字节)
public static byte[] GenerateRandomKey()
{
using (var aes = Aes.Create())
{
aes.KeySize = 256;
aes.GenerateKey();
return aes.Key;
}
}
// 生成随机初始化向量(128位,即16字节)
public static byte[] GenerateRandomIV()
{
using (var aes = Aes.Create())
{
aes.GenerateIV();
return aes.IV;
}
}
// AES加密:将明文字符串转换为Base64密文
public static string Encrypt(string plainText, byte[] key, byte[] iv)
{
if (plainText == null || plainText.Length <= 0)
throw new ArgumentNullException(nameof(plainText));
if (key == null || key.Length <= 0)
throw new ArgumentNullException(nameof(key));
if (iv == null || iv.Length <= 0)
throw new ArgumentNullException(nameof(iv));
byte[] encrypted;
using (var aes = Aes.Create())
{
aes.Key = key;
aes.IV = iv;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
// 创建加密器
ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
using (var msEncrypt = new MemoryStream())
{
using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (var swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(plainText);
}
encrypted = msEncrypt.ToArray();
}
}
}
return Convert.ToBase64String(encrypted);
}
// AES解密:将Base64密文还原为明文字符串
public static string Decrypt(string cipherText, byte[] key, byte[] iv)
{
if (cipherText == null || cipherText.Length <= 0)
throw new ArgumentNullException(nameof(cipherText));
if (key == null || key.Length <= 0)
throw new ArgumentNullException(nameof(key));
if (iv == null || iv.Length <= 0)
throw new ArgumentNullException(nameof(iv));
// 将Base64密文转换为字节数组
byte[] cipherBytes = Convert.FromBase64String(cipherText);
string plaintext = null;
using (var aes = Aes.Create())
{
aes.Key = key;
aes.IV = iv;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
// 创建解密器
ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
using (var msDecrypt = new MemoryStream(cipherBytes))
{
using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (var srDecrypt = new StreamReader(csDecrypt))
{
plaintext = srDecrypt.ReadToEnd();
}
}
}
}
return plaintext;
}
// 测试示例
static void Main(string[] args)
{
try
{
// 生成密钥和IV
byte[] key = GenerateRandomKey();
byte[] iv = GenerateRandomIV();
Console.WriteLine("密钥(Base64): " + Convert.ToBase64String(key));
Console.WriteLine("IV(Base64): " + Convert.ToBase64String(iv));
string original = "Hello, AES Encryption in C#! 这是一段测试文本。";
Console.WriteLine("原始文本: " + original);
// 加密
string encrypted = Encrypt(original, key, iv);
Console.WriteLine("加密后(Base64): " + encrypted);
// 解密
string decrypted = Decrypt(encrypted, key, iv);
Console.WriteLine("解密后: " + decrypted);
Console.WriteLine("加密解密成功:" + (original == decrypted));
}
catch (Exception ex)
{
Console.WriteLine("错误:" + ex.Message);
}
}
}四、代码要点说明
密钥和IV的生成:使用
Aes.GenerateKey()和Aes.GenerateIV()方法生成密码学安全的随机字节。生产环境中密钥应安全存储(如环境变量、密钥管理服务),IV可以与密文一起传输(不必保密,但必须唯一)。加密模式:代码中显式设置为
CipherMode.CBC,避免使用默认的CBC或可能不安全的ECB模式。填充模式:
PaddingMode.PKCS7是常用且安全的填充方式。流处理:使用
CryptoStream配合MemoryStream处理内存中的字节数据,避免了手动管理缓冲区的复杂性。Base64编码:密文用Base64编码输出,便于在文本协议中传输(如JSON、XML)。
五、注意事项与安全建议
切勿硬编码密钥或IV在源代码中,应使用安全的密钥管理方案。
IV必须是随机的且每个加密操作使用不同的IV,否则可能泄露明文信息。
生产环境中建议使用认证加密模式(如GCM)以防止密文被篡改,.NET中可通过
AesGcm类实现(需要.NET Core 3.0+或.NET 5+)。存储密钥时,可使用Windows的数据保护API(DPAPI)或Azure Key Vault等服务。
对于大量数据,考虑使用流式加密而非一次性加载整个内存。
六、结语
通过上述代码,您可以在C#项目中快速集成AES对称加密功能。理解AES的参数配置和安全性要求是正确使用加密的关键。在实际开发中,请根据应用场景选择合适的密钥长度、加密模式和认证机制,确保数据的机密性和完整性。