从C#代码看AES加密算法的实现机制
在C#中,实现AES加密算法通常使用System.Security.Cryptography命名空间中的Aes类。以下是一个简单的示例,展示了如何使用Aes类进行AES加密和解密:
using System;
using System.Security.Cryptography;
using System.Text;
class AesEncryptionExample
{
static void Main()
{
string plainText = "Hello, World!";
byte[] key = Encoding.UTF8.GetBytes("16位长度的密钥");
byte[] iv = Encoding.UTF8.GetBytes("16位长度的初始向量");
byte[] encryptedData = Encrypt(plainText, key, iv);
string decryptedText = Decrypt(encryptedData, key, iv);
Console.WriteLine("原始文本: " + plainText);
Console.WriteLine("加密后的数据: " + Convert.ToBase64String(encryptedData));
Console.WriteLine("解密后的文本: " + decryptedText);
}
static byte[] Encrypt(string plainText, byte[] key, byte[] iv)
{
using (Aes aes = Aes.Create())
{
aes.Key = key;
aes.IV = iv;
ICryptoTransform encryptor = aes.CreateEncryptor();
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
{
byte[] plainData = Encoding.UTF8.GetBytes(plainText);
cs.Write(plainData, 0, plainData.Length);
}
return ms.ToArray();
}
}
}
static string Decrypt(byte[] encryptedData, byte[] key, byte[] iv)
{
using (Aes aes = Aes.Create())
{
aes.Key = key;
aes.IV = iv;
ICryptoTransform decryptor = aes.CreateDecryptor();
using (MemoryStream ms = new MemoryStream(encryptedData))
{
using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
{
byte[] decryptedData = new byte[encryptedData.Length];
int decryptedDataLength = cs.Read(decryptedData, 0, decryptedData.Length);
return Encoding.UTF8.GetString(decryptedData, 0, decryptedDataLength);
}
}
}
}
}
在这个示例中,我们首先创建了一个Aes对象,并设置了密钥(Key)和初始向量(IV)。然后,我们使用CreateEncryptor方法创建了一个加密器(ICryptoTransform),并使用MemoryStream和CryptoStream类将待加密的数据写入加密器。 我们将加密后的数据从MemoryStream中读取出来。
解密过程与加密过程类似,但是我们使用CreateDecryptor方法创建了一个解密器(ICryptoTransform),并使用MemoryStream和CryptoStream类将加密的数据读入解密器。 我们将解密后的数据从MemoryStream中读取出来。
需要注意的是,密钥和初始向量的长度必须符合AES算法的要求。AES算法支持三种密钥长度:128位、192位和256位。初始向量的长度通常与密钥长度相同。在这个示例中,我们使用了16位长度的密钥和初始向量,这对应于AES-128算法。