在.NET开发中,处理敏感数据的安全存储和传输时,AES对称加密算法是常用的解决方案,它加密速度快、安全性高,适合对大量数据进行加密处理。下面我们一步步实现完整的AES加密解密功能。

AES加密的核心参数说明
AES加密属于对称加密,加密和解密使用相同的密钥,同时还需要初始化向量(IV)来保证加密结果的安全性,几个核心参数需要注意:
- Key(密钥):长度支持128位、192位、256位,对应16、24、32字节,密钥需要妥善保管,泄露会导致数据被破解。
- IV(初始化向量):长度为16字节,不需要保密,但每次加密最好使用随机生成的IV,避免相同明文生成相同密文。
- 模式(Mode):常用的有CBC模式,需要确保加密解密使用相同模式。
- 填充(Padding):常用的PKCS7填充,处理明文长度不是块大小整数倍的情况。
实现AES加密方法
首先编写AES加密的方法,输入明文和密钥,返回加密后的Base64字符串,代码如下:
using System.Security.Cryptography;
using System.Text;
public static string AesEncrypt(string plainText, byte[] key)
{
// 创建AES实例
using (Aes aes = Aes.Create())
{
aes.Key = key;
// 生成随机的初始化向量
aes.GenerateIV();
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
// 创建加密器
ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
// 将明文转换为字节数组
byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
// 执行加密
byte[] encryptedBytes;
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
{
cs.Write(plainBytes, 0, plainBytes.Length);
cs.FlushFinalBlock();
}
encryptedBytes = ms.ToArray();
}
// 将IV和加密结果拼接后转Base64,方便后续解密时提取IV
byte[] resultBytes = new byte[aes.IV.Length + encryptedBytes.Length];
Array.Copy(aes.IV, 0, resultBytes, 0, aes.IV.Length);
Array.Copy(encryptedBytes, 0, resultBytes, aes.IV.Length, encryptedBytes.Length);
return Convert.ToBase64String(resultBytes);
}
}
实现AES解密方法
解密方法需要接收加密后的Base64字符串和密钥,先提取IV再执行解密,代码如下:
public static string AesDecrypt(string cipherText, byte[] key)
{
// 将Base64字符串转回字节数组
byte[] totalBytes = Convert.FromBase64String(cipherText);
using (Aes aes = Aes.Create())
{
aes.Key = key;
// 提取前16字节作为IV
byte[] iv = new byte[16];
Array.Copy(totalBytes, 0, iv, 0, iv.Length);
aes.IV = iv;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
// 创建解密器
ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
// 提取加密后的数据部分
byte[] encryptedBytes = new byte[totalBytes.Length - iv.Length];
Array.Copy(totalBytes, iv.Length, encryptedBytes, 0, encryptedBytes.Length);
// 执行解密
using (MemoryStream ms = new MemoryStream(encryptedBytes))
{
using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
{
using (StreamReader sr = new StreamReader(cs, Encoding.UTF8))
{
return sr.ReadToEnd();
}
}
}
}
}
使用示例
下面是调用加密解密方法的完整示例,包含密钥的生成和使用:
class Program
{
static void Main(string[] args)
{
// 生成32字节的密钥(对应256位AES)
byte[] key = new byte[32];
using (RandomNumberGenerator rng = RandomNumberGenerator.Create())
{
rng.GetBytes(key);
}
string plainText = "这是需要加密的敏感数据内容";
Console.WriteLine("原始明文:" + plainText);
// 执行加密
string encrypted = AesEncrypt(plainText, key);
Console.WriteLine("加密后结果:" + encrypted);
// 执行解密
string decrypted = AesDecrypt(encrypted, key);
Console.WriteLine("解密后结果:" + decrypted);
}
}
注意事项
- 密钥的生成需要使用安全的随机数生成器,不要使用简单的字符串直接转字节作为密钥,避免被暴力破解。
- 加密和解密的密钥、模式、填充方式必须完全一致,否则会解密失败。
- 如果需要跨平台使用加密结果,需要确保两端使用的AES参数配置相同,Base64编码方式也一致。
- 敏感数据不要硬编码在代码中,密钥最好存储在安全的配置服务或者密钥管理服务中。
AES加密解密.NETCryptographybyte_array修改时间:2026-07-24 03:03:29