1.带初始化向量
csharp
public class AesEncryption
{
private readonly byte[] aesKey = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 };
private readonly string key = "0123456789abcdef"; // 必须是16, 24, 或 32 个字符
private readonly string iv = "0000000000000000"; // 必须是16个字符
public string Encrypt(string plainText)
{
using (Aes aesAlg = Aes.Create())
{
//aesAlg.Key = aesKey;
aesAlg.Key = Encoding.UTF8.GetBytes(key);
aesAlg.IV = Encoding.UTF8.GetBytes(iv);
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(plainText);
}
byte[] encrypted = msEncrypt.ToArray();
return Convert.ToBase64String(encrypted);
}
}
}
public string Decrypt(string cipherText)
{
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Encoding.UTF8.GetBytes(key);
aesAlg.IV = Encoding.UTF8.GetBytes(iv);
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msDecrypt = new MemoryStream(Convert.FromBase64String(cipherText)))
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
return srDecrypt.ReadToEnd();
}
}
}
}
csharp
private void test_aes()
{
string original = "This is the data to be encrypted.";
//using (AesEncryption aes = new AesEncryption())
AesEncryption aes = new AesEncryption();
{
string encrypted = aes.Encrypt(original);
Console.WriteLine($"Encrypted: {encrypted}");
string decrypted = aes.Decrypt(encrypted);
Console.WriteLine($"Decrypted: {decrypted}");
}
}
2.不带初始化向量, ECB, 128bit, base64
csharp
public class AESNoIVExample
{
public byte[] GenerateRandomSalt()
{
byte[] salt = new byte[16];
using (var rng = new RNGCryptoServiceProvider())
{
rng.GetBytes(salt);
}
// 注意:在实际应用中,你应该存储并重用这个盐值,而不是每次都生成一个新的。
// 但在这个例子中,为了简化,我们每次都生成一个新的盐值。
// 这意味着每次运行程序时,即使密码相同,生成的密钥也会不同。
// 这只是为了演示目的,不应该在实际加密场景中使用。
return salt;
}
public byte[] Encrypt(string plainText, byte[] Key)
{
if (plainText == null || plainText.Length <= 0)
throw new ArgumentNullException(nameof(plainText));
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException(nameof(Key));
byte[] encrypted;
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Key;
// 不设置IV(不推荐)
// aesAlg.IV = ...; // 不使用IV
aesAlg.Mode = CipherMode.ECB; // 使用ECB模式(不推荐,因为它不安全)
aesAlg.Padding = PaddingMode.PKCS7;
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, null); // 传入null作为IV
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(plainText);
}
encrypted = msEncrypt.ToArray();
}
}
return encrypted;
}
public string Decrypt(byte[] cipherText, byte[] Key)
{
if (cipherText == null || cipherText.Length <= 0)
throw new ArgumentNullException(nameof(cipherText));
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException(nameof(Key));
string plaintext = null;
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Key;
// 不设置IV(不推荐)
// aesAlg.IV = ...; // 不使用IV
aesAlg.Mode = CipherMode.ECB; // 使用ECB模式(不推荐,因为它不安全)
aesAlg.Padding = PaddingMode.PKCS7;
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, null); // 传入null作为IV
using (MemoryStream msDecrypt = new MemoryStream(cipherText))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
plaintext = srDecrypt.ReadToEnd();
}
}
}
return plaintext;
}
}
csharp
private void test_aes()
{
//2. AES NoIV
string plaintext = "This is the data to be encrypted.";
string password = "0123456789abcdef"; // 用于生成密钥的密码
AESNoIVExample ase2 = new AESNoIVExample();
// 生成密钥
byte[] key = Encoding.UTF8.GetBytes(password);
// 加密
byte[] encrypted2 = ase2.Encrypt(plaintext, key);
string base64Encrypted = Convert.ToBase64String(encrypted2);
Console.WriteLine("Encrypted (Base64): " + base64Encrypted);
// 解密
byte[] decryptedBytes = Convert.FromBase64String(base64Encrypted);
string decrypted2 = ase2.Decrypt(decryptedBytes, key);
Console.WriteLine("Decrypted: " + decrypted2);
}