ECB模式加密
需要密钥(自定义)
密钥支持 (16字节) 128位 、(24字节)192位 、(32字节)256位
/// <summary>
/// Aes加密-ECB模式
/// </summary>
/// <param name="encryString">待加密字符</param>
/// <param name="secretKey">密钥</param>
public void EncryptionECB(string encryString, string secretKey)
{
//加密后的字节数组
byte[] encryByte;
using (Aes aes = Aes.Create())
{
//密钥
aes.Key = Encoding.UTF8.GetBytes(secretKey);
//加密模式
aes.Mode = CipherMode.ECB;
//填充模式
aes.Padding = PaddingMode.PKCS7;
//加密器
ICryptoTransform encryptor = aes.CreateEncryptor();
//创建内存流
using (MemoryStream memoryStream = new MemoryStream())
{
//创建加密流(存储在内存流中)
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
{
//将待加密字符写入加密流进行加密
using (StreamWriter streamWriter = new StreamWriter(cryptoStream))
{
streamWriter.Write(encryString);
}
}
encryByte = memoryStream.ToArray();
}
}
// 编码为Base64字符串
string base64String = Convert.ToBase64String(encryByte);
Console.WriteLine("\n加密:" + base64String);
}
ECB模式解密
/// <summary>
/// Aes解密-ECB模式
/// </summary>
/// <param name="decryString">待解密字符</param>
/// <param name="secretKey">密钥</param>
public void DecryptionECB(string decryString, string secretKey)
{
string str = string.Empty;
using (Aes aes = Aes.Create())
{
//密钥
aes.Key = Encoding.UTF8.GetBytes(secretKey);
//加密模式
aes.Mode = CipherMode.ECB;
//填充模式
aes.Padding = PaddingMode.PKCS7;
//解密器
ICryptoTransform decryptor = aes.CreateDecryptor();
//密文
byte[] encryByte = Convert.FromBase64String(decryString);
//创建内存流
using (MemoryStream memoryStream = new MemoryStream(encryByte))
{
//创建解密流
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
{
using (StreamReader streamReader = new StreamReader(cryptoStream))
{
str = streamReader.ReadToEnd();
}
}
}
}
Console.WriteLine("\n解密:" + str);
}
CBC模式加密
需要密钥及向量IV(自定义) ;
密钥支持 (16字节) 128位 、(24字节)192位 、(32字节)256位
向量IV支持(16字节) 128位
/// <summary>
/// Aes加密-CBC模式
/// </summary>
/// <param name="encryString">待加密字符</param>
/// <param name="secretKey">密钥</param>
/// <param name="iv">初始化向量</param>
public void EncryptionCBC(string encryString, string secretKey, string iv)
{
//加密后的字节数组
byte[] encryByte;
//(Create时,IV会调用GenerateIV()初始化成随机数,Key会调用GenerateKey()初始化成随机数)
using (Aes aes = Aes.Create())
{
//密钥
aes.Key = Encoding.UTF8.GetBytes(secretKey);
//加密模式
aes.Mode = CipherMode.CBC;
//填充模式
aes.Padding = PaddingMode.PKCS7;
//设置向量
aes.IV = Encoding.UTF8.GetBytes(iv);
//加密器
ICryptoTransform encryptor = aes.CreateEncryptor();
//创建内存流
using (MemoryStream memoryStream = new MemoryStream())
{
//创建加密流(存储在内存流中)
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
{
//将待加密字符写入加密流进行加密
using (StreamWriter streamWriter = new StreamWriter(cryptoStream))
{
streamWriter.Write(encryString);
}
}
encryByte = memoryStream.ToArray();
}
}
// 编码为Base64字符串
string base64String = Convert.ToBase64String(encryByte);
Console.WriteLine("\n加密:" + base64String);
}
CBC模式解密
/// <summary>
/// Aes解密-CBC模式
/// </summary>
/// <param name="decryString">待解密字符</param>
/// <param name="secretKey">密钥</param>
/// <param name="iv">初始化向量</param>
public void DecryptionCBC(string decryString, string secretKey, string iv)
{
string str = string.Empty;
//(Create时,IV会调用GenerateIV()初始化成随机数,Key会调用GenerateKey()初始化成随机数)
using (Aes aes = Aes.Create())
{
//密钥
aes.Key = Encoding.UTF8.GetBytes(secretKey);
//加密模式
aes.Mode = CipherMode.CBC;
//填充模式
aes.Padding = PaddingMode.PKCS7;
//设置向量
aes.IV = Encoding.UTF8.GetBytes(iv);
//解密器
ICryptoTransform decryptor = aes.CreateDecryptor();
//密文
byte[] encryByte = Convert.FromBase64String(decryString);
//创建内存流
using (MemoryStream memoryStream = new MemoryStream(encryByte))
{
//创建解密流
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
{
using (StreamReader streamReader = new StreamReader(cryptoStream))
{
str = streamReader.ReadToEnd();
}
}
}
}
Console.WriteLine("\n解密:" + str);
}
在CBC模式中,每次加密均使用不同向量,可以让相同的内容加密后密文不同
注意:解密时的向量和密钥必须和加密时一致