首先,C#实现对AES加密和解密需要使用 System.Security.Cryptography 命名空间中提供的 Aes 类。下面是具体的实现步骤:
1. 导入命名空间
using System.Security.Cryptography;
2. 创建 Aes 对象
Aes aes = Aes.Create();
3. 设置密钥和向量
密钥和向量是 AES 加密时需要的两个参数,可以自己设置或者使用随机生成的值。需要注意的是,密钥和向量的长度必须符合 AES 算法要求。
// 设置密钥,默认长度为 256 位
aes.Key = Encoding.UTF8.GetBytes("12345678901234567890123456789012");
// 设置向量,默认长度为 128 位
aes.IV = Encoding.UTF8.GetBytes("1234567890123456");
4. 创建加密器和解密器
在创建加密和解密器之前,需要设置加密模式和填充方式。
// 设置加密模式为 CBC
aes.Mode = CipherMode.CBC;
// 设置填充方式为 PKCS7
aes.Padding = PaddingMode.PKCS7;
// 创建加密器
ICryptoTransform encryptor = aes.CreateEncryptor();
// 创建解密器
ICryptoTransform decryptor = aes.CreateDecryptor();
5. 加密数据
string plainText = "hello world";
// 转换明文数据为字节数组
byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
// 加密数据
byte[] cipherBytes = encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length);
// 转换加密后的字节数组为 Base64 编码的字符串
string cipherText = Convert.ToBase64String(cipherBytes);
6. 解密数据
// 转换 Base64 编码的字符串为字节数组
byte[] cipherBytes = Convert.FromBase64String(cipherText);
// 解密数据
byte[] plainBytes = decryptor.TransformFinalBlock(cipherBytes, 0, cipherBytes.Length);
// 转换解密后的字节数组为明文字符串
string plainText = Encoding.UTF8.GetString(plainBytes);
下面是两条具体的示例说明:
示例一:使用随机生成的密钥和向量加密和解密数据
// 创建 Aes 对象
Aes aes = Aes.Create();
// 设置加密模式和填充方式
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
// 随机生成密钥和向量
aes.GenerateKey();
aes.GenerateIV();
// 创建加密器和解密器
ICryptoTransform encryptor = aes.CreateEncryptor();
ICryptoTransform decryptor = aes.CreateDecryptor();
// 明文数据
string plainText = "hello world";
// 加密数据
byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
byte[] cipherBytes = encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length);
// 解密数据
byte[] decryptedBytes = decryptor.TransformFinalBlock(cipherBytes, 0, cipherBytes.Length);
string decryptedText = Encoding.UTF8.GetString(decryptedBytes);
Console.WriteLine("明文数据:{0}", plainText);
Console.WriteLine("加密后数据:{0}", Convert.ToBase64String(cipherBytes));
Console.WriteLine("解密后数据:{0}", decryptedText);
示例二:使用自定义密钥和向量加密和解密数据
// 创建 Aes 对象
Aes aes = Aes.Create();
// 设置加密模式和填充方式
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
// 设置密钥和向量
byte[] key = Encoding.UTF8.GetBytes("12345678901234567890123456789012");
byte[] iv = Encoding.UTF8.GetBytes("1234567890123456");
aes.Key = key;
aes.IV = iv;
// 创建加密器和解密器
ICryptoTransform encryptor = aes.CreateEncryptor();
ICryptoTransform decryptor = aes.CreateDecryptor();
// 明文数据
string plainText = "hello world";
// 加密数据
byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
byte[] cipherBytes = encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length);
// 解密数据
byte[] decryptedBytes = decryptor.TransformFinalBlock(cipherBytes, 0, cipherBytes.Length);
string decryptedText = Encoding.UTF8.GetString(decryptedBytes);
Console.WriteLine("明文数据:{0}", plainText);
Console.WriteLine("加密后数据:{0}", Convert.ToBase64String(cipherBytes));
Console.WriteLine("解密后数据:{0}", decryptedText);
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现对AES加密和解密的方法 - Python技术站