using System.Security.Cryptography;
public static void Main()
string plainText = "Hello world!!";
string key = "rfh06LQNQmIAp0CKJHfEftuhBVNUw2we";
string iv = "rfh06LQNQmIAp0CK";
Console.WriteLine("key = " + key + ", length = " + key.Length);
Console.WriteLine("iv = " + iv + ", length = " + iv.Length);
key = GenerateNewAESKey(32);
Console.WriteLine("plainText = " + plainText);
Console.WriteLine("key = " + key + ", length = " + key.Length);
Console.WriteLine("iv = " + iv + ", length = " + iv.Length);
byte[] keyBytes = Encoding.ASCII.GetBytes(key);
byte[] ivBytes = Encoding.ASCII.GetBytes(iv);
Console.WriteLine("keyBytes length = " + keyBytes.Length);
Console.WriteLine("ivBytes length = " + ivBytes.Length);
byte[] encryptedBytes = EncryptStringToBytesAES(plainText, keyBytes, ivBytes);
string encryptedBase64 = Convert.ToBase64String(encryptedBytes);
Console.WriteLine("encryptedBytes = " + JsonConvert.SerializeObject(encryptedBytes));
Console.WriteLine("encryptedBase64 = " + encryptedBase64);
byte[] encryptedBytes2 = Convert.FromBase64String(encryptedBase64);
string decryptedText = DecryptStringFromBytesAES(encryptedBytes2, keyBytes, ivBytes);
Console.WriteLine("encryptedBytes2 = " + JsonConvert.SerializeObject(encryptedBytes2));
Console.WriteLine("decryptedText = " + decryptedText);
internal static readonly char[] chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray();
public static string GenerateNewAESKey(int length)
byte[] data = new byte[4*length];
using (RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider())
StringBuilder result = new StringBuilder(length);
for (int i = 0; i < length; i++)
var rnd = BitConverter.ToUInt32(data, i * 4);
var idx = rnd % chars.Length;
result.Append(chars[idx]);
return result.ToString();
public static string GetIVFromKey(string key)
return key.Substring(0, 16);
public static byte[] EncryptStringToBytesAES(string plainText, byte[] key, byte[] iv)
if (plainText == null || plainText.Length <= 0)
throw new ArgumentNullException("plainText");
if (key == null || key.Length != 32)
throw new ArgumentNullException("key");
if (iv == null || iv.Length <= 0)
throw new ArgumentNullException("iv");
using (Aes aesAlg = Aes.Create())
aesAlg.Mode = CipherMode.CBC;
aesAlg.Padding = PaddingMode.PKCS7;
ICryptoTransform encryptor = aesAlg.CreateEncryptor(key, 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();
public static string DecryptStringFromBytesAES(byte[] cipherText, byte[] key, byte[] iv)
if (cipherText == null || cipherText.Length <= 0)
throw new ArgumentNullException("cipherText");
if (key == null || key.Length != 32)
throw new ArgumentNullException("key");
if (iv == null || iv.Length <= 0)
throw new ArgumentNullException("iv");
using (Aes aesAlg = Aes.Create())
aesAlg.Mode = CipherMode.CBC;
aesAlg.Padding = PaddingMode.PKCS7;
ICryptoTransform decryptor = aesAlg.CreateDecryptor(key, 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();