我們一起聊聊 C# AES 加密與解密
常用屬性與方法
AesManaged類提供了許多屬性和方法,以下是一些常用的:
- Key:獲取或設(shè)置加密算法的密鑰。
- IV:獲取或設(shè)置加密算法的初始化向量。
- BlockSize:獲取加密算法的塊大?。ㄒ晕粸閱挝唬?。
- KeySize:獲取或設(shè)置加密算法的密鑰大?。ㄒ晕粸閱挝唬?。
- Padding:獲取或設(shè)置加密算法的填充模式。
- CreateEncryptor():創(chuàng)建用于加密數(shù)據(jù)的ICryptoTransform對象。
- CreateDecryptor():創(chuàng)建用于解密數(shù)據(jù)的ICryptoTransform對象。
基本用法
以下是一個簡單的示例代碼,演示了如何使用AES加密和解密數(shù)據(jù):
static void Main()
{
// 原始文本
string plainText = "Hello, world!";
// 生成隨機的密鑰和初始化向量
byte[] key = GenerateRandomKey();
byte[] iv = GenerateRandomIV();
// 加密數(shù)據(jù)
byte[] encryptedData = Encrypt(Encoding.UTF8.GetBytes(plainText), key, iv);
// 解密數(shù)據(jù)
string decryptedText = Decrypt(encryptedData, key, iv);
// 輸出結(jié)果
Console.WriteLine("Original Text: " + plainText);
Console.WriteLine("Encrypted Data: " + Convert.ToBase64String(encryptedData));
Console.WriteLine("Decrypted Text: " + decryptedText);
}
// 生成隨機的密鑰
static byte[] GenerateRandomKey()
{
using (AesManaged aes = new AesManaged())
{
aes.GenerateKey();
return aes.Key;
}
}
// 生成隨機的初始化向量
static byte[] GenerateRandomIV()
{
using (AesManaged aes = new AesManaged())
{
aes.GenerateIV();
return aes.IV;
}
}
// 使用指定的密鑰和初始化向量加密數(shù)據(jù)
static byte[] Encrypt(byte[] data, byte[] key, byte[] iv)
{
using (AesManaged aes = new AesManaged())
{
aes.Key = key;
aes.IV = iv;
using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write))
{
cryptoStream.Write(data, 0, data.Length);
cryptoStream.FlushFinalBlock();
return memoryStream.ToArray();
}
}
}
}
// 使用指定的密鑰和初始化向量解密數(shù)據(jù)
static string Decrypt(byte[] data, byte[] key, byte[] iv)
{
using (AesManaged aes = new AesManaged())
{
aes.Key = key;
aes.IV = iv;
using (MemoryStream memoryStream = new MemoryStream(data))
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateDecryptor(), CryptoStreamMode.Read))
{
byte[] decryptedData = new byte[data.Length];
int bytesRead = cryptoStream.Read(decryptedData, 0, decryptedData.Length);
return Encoding.UTF8.GetString(decryptedData, 0, bytesRead);
}
}
}
}
圖片
AES通用類
public class AesHelper
{
private byte[] key;
private byte[] iv;
public AesHelper(byte[] key, byte[] iv)
{
this.key = key;
this.iv = iv;
}
public byte[] Encrypt(byte[] data)
{
using (AesManaged aes = new AesManaged())
{
aes.Key = key;
aes.IV = iv;
using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write))
{
cryptoStream.Write(data, 0, data.Length);
cryptoStream.FlushFinalBlock();
return memoryStream.ToArray();
}
}
}
}
public byte[] Decrypt(byte[] data)
{
using (AesManaged aes = new AesManaged())
{
aes.Key = key;
aes.IV = iv;
using (MemoryStream memoryStream = new MemoryStream(data))
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateDecryptor(), CryptoStreamMode.Read))
{
byte[] decryptedData = new byte[data.Length];
int bytesRead = cryptoStream.Read(decryptedData, 0, decryptedData.Length);
return decryptedData[..bytesRead];
}
}
}
}
}
static void Main()
{
byte[] key = Encoding.UTF8.GetBytes("MySecretKey12345");
byte[] iv = Encoding.UTF8.GetBytes("1234567890ABCDEF");
AesHelper aesHelper = new AesHelper(key, iv);
string plainText = "Hello, world!";
byte[] encryptedData = aesHelper.Encrypt(Encoding.UTF8.GetBytes(plainText));
byte[] decryptedData = aesHelper.Decrypt(encryptedData);
string decryptedText = Encoding.UTF8.GetString(decryptedData);
Console.WriteLine("Original Text: " + plainText);
Console.WriteLine("Encrypted Data: " + Convert.ToBase64String(encryptedData));
Console.WriteLine("Decrypted Text: " + decryptedText);
}
注意:iv長度
System.Security.Cryptography.CryptographicException: 'Specified initialization vector (IV) does not match the block size for this algorithm.'
這個異常通常是因為指定的初始化向量(IV)的長度與所使用的算法的塊大小不匹配導(dǎo)致的。AES算法的塊大小為128位(16字節(jié)),因此初始化向量的長度應(yīng)為16字節(jié)。
圖片
總結(jié)
使用C#中的AesManaged類,我們可以輕松地實現(xiàn)AES加密和解密。本文介紹了基本的用法,包括生成隨機密鑰和IV、加密和解密數(shù)據(jù)等操作。此外,還介紹了一些常用的屬性和方法,以便更好地理解和使用AesManaged類。根據(jù)實際需求和場景,我們可以靈活地使用這些功能來保護敏感數(shù)據(jù)的安全性。