.Net için AES şifreleme C# örneği

Flash Bilgiler  Microsoft .Net  Ağustos 30, 2016

Merhaba, bu yazımda kısaca AES şifrelemeden bahsedeceğim. Daha sonra da kısa bir örnekle olayı göstermeye çalışacağım.

İlk olarak AES nedir neye yarar ona bakalım. AES kriptografi dediğimiz bir bilginin şifrelenmesini sağlar. Kriptografi yüzyıllarca çeşitli yöntemlerle yapılmıştır. Günümüzde ise bu olay artık standartları olan bir konu içerisindedir. Tabi ki isterseniz sizde çeşitli algoritmalar üretebilirsiniz ama çok büyük bir hevese de gerek yok zaten epeyce iyi geliştirilmiş yöntem var. Kriptografi konusunu bence biraz Wikipedia üzerinden okuyun derim eski tarihlerde 6 gen tahtalara bez sararak yapılan kriptografiler dahi sizi düşündürebilir.

AES çift yönlü dönüştürülebilen bir algoritmadır. Belki duymuşsunuzdur MD5 gibi sistemlerde şifrelemeler geri dönüştürülemez iken AES te dönüştürülür. Gerçi her ikisinin amacı farklıdır. AES, DES gibi sistemlere göre daha düşük güvenliktedir. Çünkü yazma ve okuma için aynı şifrelerin hem göndericide hem alıcıda olması gerekir. Ancak DES te ise alıcı yazmak için farklı anahtar okumak için farklı anahtar üretir. Bu şekilde size mesajı gönderecek kişinin anahtarıyla sadece mesaj yazılırken bu anahtarın başkasının eline geçmesi veriyi riske etmez. AES te ise durum her iki tarafın farklı bir kanaldan şifreleri paylaşması gerektiğidir. Aynı mesaj kanalından şifrelerin gönderilmesi tüm sistem için açık yaratır. Bu yöntem önceden belirlenmiş iki nokta arasında ki transfer için idealdir. DES ve bu gibi asimetrik anahtar kullanan sistemlere göre daha düşük boyutlarda şifrelenmiş veri üretir. Simetrik key olduğu için şifrelenen bilginin çözümlenmesi için fazladan bilgi barındırmaz.

Örnek projeyi anlatmaya başlamadan önce şu adresten kodlara ulaşabilrisiniz buraya ekstradan eklemeye gerek yok. https://github.com/halityurttas/CryptographyAESinDotNet

Şimdi gelelim konuya, örneğimiz kısa ve öz olsun diye console application şeklindedir. AesHelper sınıfı içerisinde Aes işlemlerini yaptırmaktayız. Burayı size izah etmeye çalışacağım.

AesHelper static class olarak yapıldı ki string bir değişkene (.) nokta işareti koyup direk encrypt veya decrypt diyebilelim. İki tane sabitimiz var. Aes bizden iki değişken istemekte. Bunların ilki IV ki bu 16 karakter yani 128 bitlik byte dizisi ister. KEY ise minimum 128 bit maximum da 256 bit anahtar ister. Bu örnekte 32 karakterlik 256 bit lik bir anahtar kullandım.

Hemen fonksiyona dalıyoruz. İlk olarak Encrypt yani şifreleme fonksiyonu. Şifreleme sonucu oluşacak byte dizisi için bir geçici buffer baştan tanımlamış olduk. Aes nesnesi singleton bir nesne olduğu için new ile tanımlayamıyoruz Create yöntemini kullanıyoruz. Bu aşamadan sonra aes nesnemize IV ve KEY değerlerini byte çevirip verdik. Aslında Aes in Create yöntemi bizim için IV ve KEY üretmekte ancak biz peşin belirttik ki şifre ve keyleri kaybetmeyelim. Sonuçta çözmemiz gerekecek. Bu arada ben IV ve KEY değerlerini sabit tanımladım diye sizde öyle yapacak değilsiniz isterseniz projenize göre app.config veya web.config dosyalarına koyarak oradan filan da ayarlayabilrisiniz. Aes nesnesi aslında direk olarak encrypt ve decrypt yapmaz bu nesnelerden encryptor veya decryptor üreterek işlemi yürütmek gerekir. Encrypt işlemi yapacağımız için aes.CreateEncryptor diyerek yine KEY ve IV değerlerini geçirip ICryptoTransform tipinde bir arabirim alıyoruz. Daha sonra ilk önce bir Memory Stream, ardından bu Memory Streama kriptolama işlemini yapacak CryptoStream ve bunlara da bizim datayı yazacak StreamWriter gerekmektedir. CryptoStream üç değer alır, sonucun atılacağı bir stream (burada Memory Stream kullandık direk dosyaya da yazabilirdiniz veya Network Stream filan kullanıp ağdan da gönderebilirdiniz), şifreleme işlemi yapacak encryptor ki biraz evvel aes ten üretmiştik ve mod yani yazacakmı okuyacak mı onu belirtiyoruz. Bu üçüncü parametre eğer şifreliyorsak write modu şifre çözüyorsak read modunda olmalı. Gerisi yaz ve gelen değeri Base64 olarak geri döndür.

Base64 kullanmamızın amacı şifreleme işlemi sonucunda oluşan byte ların hepsi bir karaktere karşılık gelmemekte. Abuk subuk karakterler veya boş görünen karakterlere denk gelmekte. Base64 ise bir byte 4 parçaya ayırarak en fazla 4 karakter göstererek bunun karaktere dönüşmesini garantiler. Bu sayede veritabanına vs kaydederken karakter problemlerinden dolayı da şifrelenmiş veriyi kaybetmemiş oluruz. Kısacası metin formatında bazen tutmak iyidir.

Decrypt işlemi ise bu işin tam tersi. Yine aynı şeyler söz konusu fark ise CreateDecryptor diyerek ICryptoTransform arabirimi çözümlemek üzere oluşturulur. Yine streamlar da streamlar ve sonucu döndür. Dikkat edeceğimiz husus Decrypt fonksiyonunun ilk satırında stringi base64 le eski hali olan byte dizisine çevirdiğimizdir. Nasıl byte sonuç veriyorsa işlem yine byte kabul ediyor.

Dönelim console uygulamasına çalıştırıp birşey yazalım ve enterlayıp sonucu görelim.

2016-08-30 10_33_37-file____H__htfs_cryptoaes_AesCrypto_Console_bin_Debug_Console.EXE

 

Bu yazı 2319 defa görüntülendi

“.Net için AES şifreleme C# örneği” için 2 cevap

  1. murat dedi ki:

    Selamlar;

    Çalışmanızı indirip yazınızı okuyarak denemeler yanılmalar yaptım. Şifreleme konusunda ilk örneğimi sayenizde yapacağım konu çok faydalı oldu. Emeklerinize teşekkür ederim. şifreleme konusunda sıkıntılarım olacak mutlaka size yazabilirmiyim?

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Yazar Hakkında

15 yıllık çalışma hayatında birçok proje geliştirmiş binlerce projeyi inceleme fırsatı bulmuş yazılım aşığıdır. İşini hobi olarak gören yazarımız iş hayatını profesyonelce zevkle sürdürmektedir.

Son Eklenenler