在C#中,使用AES(高级加密标准)对数据进行加密是一种常见的做法。以下是一个使用AES加密和解密数据的简单示例。这个示例将使用System.Security.Cryptography
命名空间中的类。
步骤 1: 创建AES密钥和IV(初始化向量)
AES加密需要一个密钥(Key)和一个初始化向量(IV)。密钥是加密和解密过程中使用的秘密信息,而IV则是一个随机值,用于确保即使对相同的明文进行多次加密,也会产生不同的密文。
步骤 2: 加密数据
使用AES加密数据时,需要创建一个Aes
对象,并设置其密钥和IV。然后,使用CreateEncryptor
方法创建一个加密器,并用它来加密数据。
步骤 3: 解密数据
解密是加密的逆过程。你需要再次创建一个Aes
对象,并使用相同的密钥和IV。然后,使用CreateDecryptor
方法创建一个解密器,并用它来解密数据。
示例代码
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
class Program
{
static void Main()
{
string original = "Hello, World!";
byte[] encrypted;
byte[] decrypted;
// 使用AES加密
using (Aes myAes = Aes.Create())
{
// 加密密钥和IV(通常应该从安全的地方获取)
byte[] key = Encoding.UTF8.GetBytes("1234567890123456"); // 16 bytes key for AES-128
byte[] iv = myAes.IV; // 随机生成IV
// 加密
ICryptoTransform encryptor = myAes.CreateEncryptor(key, iv);
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(original);
}
encrypted = msEncrypt.ToArray();
}
}
// 解密
ICryptoTransform decryptor = myAes.CreateDecryptor(key, iv);
using (MemoryStream msDecrypt = new MemoryStream(encrypted))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
decrypted = Encoding.UTF8.GetBytes(srDecrypt.ReadToEnd());
}
}
}
Console.WriteLine($"Original: {original}");
Console.WriteLine($"Encrypted: {Convert.ToBase64String(encrypted)}");
Console.WriteLine($"Decrypted: {Encoding.UTF8.GetString(decrypted)}");
}
}
}
注意:
密钥管理:在这个示例中,密钥是硬编码的,这在实际应用中是不安全的。密钥应存储在安全的位置,并尽可能避免硬编码。
IV的管理:IV不需要保密,但它需要随机生成并与密文一起存储或传输,以便解密时能正确恢复数据。
加密和解密模式:AES支持多种模式和填充方式。在上面的示例中,我们使用了默认的模式(CBC)和填充(PKCS#7)。
性能:对于大量数据的加密和解密,应考虑使用更高效的内存管理和流处理技术。
异常处理:在生产环境中,应该添加适当的异常处理逻辑来处理加密/解密过程中可能出现的错误。