AES Şifreleme ve Çözme

AES (Advanced Encryption Standard; Gelişmiş Şifreleme Standardı), elektronik verinin şifrelenmesi için sunulan bir standarttır. Amerikan Hükümeti tarafından kabul edilen AES, uluslararası alanda da defacto şifreleme (kripto) standardı olarak kullanılmaktadır.
AES ile standartlaştırılan algoritma, esas olarak Vincent Rijmen ve Joan Daemen tarafından geliştirilen Rijndael algoritmasında bazı değişiklikler yapılarak oluşturulmuştur. Rijndael, geliştiricilerin isimleri kullanılarak elde edilen bir isimdir: RIJmen aNd DAEmen.
256-bit anahtar uzunluğuna sahip AES algoritması için 2200 işlem gerektiren bir saldırı algoritmanın kırılması olarak kabul edilirken, 2200 mertebesindeki bir işlem, şu an için, evrenin yaşından daha uzun bir süre gerektirmektedir.

using System;
using System.IO;
using System.Security.Cryptography;

namespace AES
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                var text = "TeSt";

                using (var myRijndael = new RijndaelManaged())
                {
                    var key = myRijndael.Key;
                    var IV = myRijndael.IV;

                    Console.WriteLine("Original:   {0}", text);

                    var encrypted = EncryptStringToBytes(text, key, IV);

                    Console.WriteLine("Encrypted:   {0}", Convert.ToBase64String(encrypted));

                    var decrypted = DecryptStringFromBytes(encrypted, key, IV);

                    Console.WriteLine("Decrypted:   {0}", decrypted);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Error: {0}", e.Message);
            }

            Console.ReadKey();
        }

        static byte[] EncryptStringToBytes(string plainText, byte[] Key, byte[] IV)
        {
            if (plainText == null || plainText.Length <= 0)
                throw new ArgumentNullException("plainText");

            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");

            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("IV");

            byte[] encrypted;

            using (var rijAlg = new RijndaelManaged())
            {
                rijAlg.Key = Key;
                rijAlg.IV = IV;

                var encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);

                using (var msEncrypt = new MemoryStream())
                {
                    using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (var swEncrypt = new StreamWriter(csEncrypt))
                        {
                            swEncrypt.Write(plainText);
                        }

                        encrypted = msEncrypt.ToArray();
                    }
                }
            }

            return encrypted;
        }

        static string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV)
        {
            if (cipherText == null || cipherText.Length <= 0)
                throw new ArgumentNullException("cipherText");

            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");

            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("IV");

            string plaintext = null;

            using (var rijAlg = new RijndaelManaged())
            {
                rijAlg.Key = Key;
                rijAlg.IV = IV;

                var decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);

                using (var msDecrypt = new MemoryStream(cipherText))
                {
                    using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (var srDecrypt = new StreamReader(csDecrypt))
                        {
                            plaintext = srDecrypt.ReadToEnd();
                        }
                    }
                }
            }

            return plaintext;
        }
    }
}

Leave a Reply

Your email address will not be published. Required fields are marked *