AES C# Example
DON'T USE BELOW CODE FOR REAL SOFTWARE.
https://github.com/ftsfranklin reported below.
Warning: Don't use this for real software.
- RijndaelManaged is discouraged in favor of an AES implementation. (AES is a subset of Rijndael, though.) In particular, use Aes.Create() rather than the AesManaged class or anything else more explicit.
- RijndaelManaged is not designed to be reused and kept around as a static field.
- IV should be different and (securely) random for each ciphertext, and stored with it. IV is not a second key, but analogous to the salt in hashing, so it's not secret.
- Because of the ToString override, it is at risk of exposing the key in log files if the Aes object is logged.
There are probably other issues, but I don't know enough to say. But this gist is publicly visible and appears on Google, so people will stumble onto it and copy it into their code.
https://github.com/magicsih/AesExample.git
Web AES Encryptor/Decryptor: http://www.txtwizard.net/crypto
Class
using System; using System.Security.Cryptography; using System.Text; namespace AesExample { class Aes { private static RijndaelManaged rijndael = new RijndaelManaged(); private static System.Text.UnicodeEncoding unicodeEncoding = new UnicodeEncoding(); private const int CHUNK_SIZE = 128; private void InitializeRijndael() { rijndael.Mode = CipherMode.CBC; rijndael.Padding = PaddingMode.PKCS7; } public Aes() { InitializeRijndael(); rijndael.KeySize = CHUNK_SIZE; rijndael.BlockSize = CHUNK_SIZE; rijndael.GenerateKey(); rijndael.GenerateIV(); } public Aes(String base64key, String base64iv) { InitializeRijndael(); rijndael.Key = Convert.FromBase64String(base64key); rijndael.IV = Convert.FromBase64String(base64iv); } public Aes(byte[] key, byte[] iv) { InitializeRijndael(); rijndael.Key = key; rijndael.IV = iv; } public string Decrypt(byte[] cipher) { ICryptoTransform transform = rijndael.CreateDecryptor(); byte[] decryptedValue = transform.TransformFinalBlock(cipher, 0, cipher.Length); return unicodeEncoding.GetString(decryptedValue); } public string DecryptFromBase64String(string base64cipher) { return Decrypt(Convert.FromBase64String(base64cipher)); } public byte[] EncryptToByte(string cipherText) { ICryptoTransform encryptor = rijndael.CreateEncryptor(); byte[] cipher = unicodeEncoding.GetBytes(cipherText); byte[] encryptedValue = encryptor.TransformFinalBlock(cipher, 0, cipher.Length); return encryptedValue; } public string EncryptToBase64String(string cipherText) { return Convert.ToBase64String(EncryptToByte(cipherText)); } public string GetKey() { return Convert.ToBase64String(rijndael.Key); } public string GetIV() { return Convert.ToBase64String(rijndael.IV); } public override string ToString() { return "KEY:" + GetKey() + Environment.NewLine + "IV:" + GetIV(); } } }
Usage
using System; namespace AesExample { class Program { private const string ORIGINAL = "this is some data to encrypt"; private const string SAMPLE_KEY = "gCjK+DZ/GCYbKIGiAt1qCA=="; private const string SAMPLE_IV = "47l5QsSe1POo31adQ/u7nQ=="; static void Main(string[] args) { //Aes aes = new Aes(); //생성자에 arguments가 없으면 key와 iv 자동생성 Aes aes = new Aes(SAMPLE_KEY, SAMPLE_IV); Console.WriteLine("ORIGINAL:" + ORIGINAL); Console.WriteLine("KEY:" + aes.GetKey()); Console.WriteLine("IV:" + aes.GetIV()); /*string->byte->string*/ Console.WriteLine("Example for: string->byte->string"); byte[] encryptedBlock = aes.EncryptToByte(ORIGINAL); //original text 를 암호화된 byte 배열로 변환 string decryptedString = aes.Decrypt(encryptedBlock); //암호화된 byte 배열을 original text로 복호화 Console.WriteLine(decryptedString); /*string->base64->string*/ Console.WriteLine("Example for: string->base64->string"); string encryptedBase64String = aes.EncryptToBase64String(ORIGINAL); //original text를 암호화된 base64 string으로 변환 decryptedString = aes.DecryptFromBase64String(encryptedBase64String); //암호호된 base64 string을 original text로 복호화 Console.WriteLine(encryptedBase64String); Console.WriteLine(decryptedString); Console.ReadLine(); } } }