Ayın Konusu: AES Şifreleme Algoritması ile Veri Şifreleme ve Çözümleme!

Kriptoloji geçmişten günümüze kadar kadar kullanılan bir şifreleme bilimidir ve veri iletişiminin güvenliğini matematiksel fonksiyonlarla sağlamaktadır. Günümüzde çeşitli şifreleme algoritmaları mevcutdur; MD5, SHA1, RSA, RC4, AES gibi çeşitli şifreleme algoritmaları mevcuttur. Biz bu makalede AES algoritmasını inceleyeceğiz. .NET Kütüphanesinden bulabileceğiniz bu algoritmaya ben kendim internetten bulduğum C kodunu C# koduna çevirerek sizlere vereceğim. Yaptığım AES sınıfının kullanımına bakalım şimdi;

2 Temel fonksiyonumuz var; decrypt() ve encrypt(). Sınıfın kullanımına örnek kod bloğu;

int[] sifrelenecekData = new int[16];
int[] aes_key = new int[16];

aes.block = sifrelenecekData;
aes.key = aes_key
aes.encrypt(); // Artık aes.block'da şifreli data var...
aes.key = aes_key
aes.decrypt(); // aes.block'da ilk data var...

Yukarıdaki kod parçacığını örneklendirecek olursak, biz veritabanımızdaki verileri AES 128-bit algoritması ile şifrelemek isteyelim. Bizim önce şifreleyeceğimiz veriyi aes.block dizisine yüklememiz lazım. Ardından da her iki tarafında bilmesi gereken bir ‘KEY’ olması lazım. Bu key sizin güvenliğinizi sağlayacaktır. Verinizi bu ‘KEY’ ile şifreledikten sonra veritabanınıza kaydettiğinizi düşünün. Eğer dışarıdan biri veritabanınıza erişse bile veriler şifreli olduğu için ve ‘KEY’i bilmediğinden veritabanında ki datalar onun için hiçbirşey ifade etmeyecektir. Sizin kullanıcılarınız ‘KEY’i bildikleri için veritabanındaki veriler kullanıcılarınız için anlamlı hale gelecekdir.Şifrelediğiniz bu veriyi açmak için yine ‘AES’ sınıfının ‘BLOCK’ dizisine datayı yükleyiniz ve ardından da aes.key dizisine belirlediğiniz gizli ‘KEY’i yükleyin ve aes.decrypt() fonksiyonunu çağırın. Artık aes.block dizisinde şifrelediğiniz veri var.

Bu sınıfı için indirmek için buraya tıklayabilir ya da ‘Download’ bölümünden indirebilirsiniz.

Kriptoloji ile ileride .NET Kütüphanesinin System.Security isim alanını ileriki aylarda detaylı bir şekilde inceleğiz. Kriptoloji için güzel bir giriş yaptığımızı düşünüyorum umarım sizler için faydalı olmuştur. Bu ayın son konusu buydu arkadaşlar…

Hepinize kolay gelsin, iyi çalışmalar…

Paylaş:
16 Responses to Ayın Konusu: AES Şifreleme Algoritması ile Veri Şifreleme ve Çözümleme!
  1. 01

    aes.cs adlı sınıfın içerisinde int dizi oluşturup içerisine random sayılar belirtmişiniz bu ne işe yarıyor?

  2. Burak

    Bu algoritma 16 byte veriyi şifreliyor doğal olarak sende txt dosyasından 16 karakteri şifreleyebilirsin. TXT dosyasından 16 karakter alıp aes dizisine yerleştirip encrypt, decrypt işlemlerini yapabilirsin.

  3. ali

    selamlar,

    Kodunu karakterleri text dosyasından alıcak şekilde değiştirdim. Şimreleme işleminde bir sıkıntı olmamasına ragmen şifrelenen karakterlerin çözümü sırasında 64 karakterden sonrasında program hata veriyor. private void substitution_Si() fonksyonu içindeki block[i] = Si_table[(block[i] – 1)]; block değeri 255 i geçtiği için hata veriyor. çözüm önerin varmı?

    Saygılar,

  4. kemal

    bir de veri ve anahtar girdim şifrelem yaptım şifreledi ancak aynı anahtarı kullanmasına rağmen aynı veriyi elde edemedim

  5. kemal

    çalışan uygulamasını haftaya yazarız demişsiniz ama malesef yazmamışsınız ilgilenirseniz sevinirim

  6. Burak

    En son byte’ı böyle bir kontrol için kullanabilirsiniz. Örnek olarak 0x1, 0x2, 0x3, …., 0xD, 0xE verileri sizin şifrelemek istediğiniz veriler olsun. Dizinin son byte’ına şifrelemek istediğiniz verileri toplayın ve son byte’ını alın. Örnek olarak topladığınız değer 0x203 çıktı siz 0x03’ü alın ve dizinin son elemanına yazın ve şifreleyin. Eğer yanlış bir key ile şifreyi açtığınızda son byte doğru olmayacaktır. Böylece yanlış bir şifre ile açıldığı ortaya çıkacaktır.

    Kolay gelsin, iyi çalışmalar..

  7. kenan

    merhabalar peki girilen keyin doğru yanlış olduğunu belirmek gerekirse ne yapmalıyız. mesela bir metni şifreleyip dosyaya kaydettim sonra uygulama ile çözmek istiyorum decrypt işleminden sonra dönen datanın doğru olup olmadığına uygulamanın karar vermesini istiyorum data doğru değilse hatalı parola mesajı vermek istiyorum. güvenlik tehdidi oluşturmadan bunu nasıl yapabilirim. dataya belirli bir metin ekleyip dönen metinde onumu arayıp varsa parola doğrudur demek sadece çözüm olarak aklıma geldi ama bu metni eklemek kırıkmasını kolaylaştıracak bir durum. bu sorun için nasıl bir çözüm kullanılıyor? öneriniz nedir? .teşekkürler…

  8. Burhan

    Tamam teşekkürler herşey için…

  9. Burak

    Evet kafadan bir değer verebilirsiniz verdiğiniz o KEY sizin kapıyı açan anahtarınız. O verdiğiniz değer okunduğunda anlamsız olan sayıları anlamlı hale getiren bir değer.

  10. Burhan

    Olursa çok sevinirim. Burdan şunu çıkartıyorum o zamam.
    Ordaki Key değişkeni bizim şifreleme kuralımız oluyor öylemi Yani Key e kafadan bi değer verebilir miyiz?

  11. Burak

    Yanlış yazılmış orada makalede de hemen düzeltiyorum. Orası ‘sifrelenecekData’ olacak. Yani aes.block dizisi içinde, encrypt ve decrypt işlemlerinden sonra şifreli ya da şifresiz data oluyor. Bunu kullanan örnek bir uygulama henüz yapmadım ama önümüzdeki hafta içinde hazırlar siteme koyarım.

  12. Burhan

    Anladım. Teşekkürler açıklama için.
    Son bi sorun ben bu algoritmayı kullanamadım.
    Yukarda verdiğiniz örnekte

    int[] sifrelenecekData = new int[16];
    int[] aes_key = new int[16];

    aes.block = sifrelenecekByte;

    Bu son yazdıgınız sifrelenecekByte değişkeni nerden geliyor anlamadım.
    Tam olarak çalışan bir öreğiniz varmı acaba.
    Sadece bu sınıfı kullanan kod parçası yeterli olur benim için.

  13. Burak

    Benim orada kastetmek istediğim ‘KEY’ kısmının sadece programcı tarafından bilinmesi. Eğer o KEY bilinmezse veriyi doğru bir şekilde ‘decrypt’ edemez. Etse bile yanlış bir veri elde eder. Sizin dediğiniz sanırım şu eğer bir şekilde benim KEY’im başkasının eline geçerse veriyi açabilir ama o çıkarttığım sayıyı bilemeyeceği için yine doğru veriyi elde edemez. Açıkcası aes algoritmasında KEY’i ele geçiren birinin ufak bir çıkartma işleminde pek fazla takılacağını zannetmem. Ufak bir örnek alma ile çok rahat çözer diye düşünüyorum.

  14. Burhan

    Anladım mantıklı.. Karakterlerin Ascii değerini al sonra bu değerleri şifrele 2 kez dönüştürme işlemi olacak ama olsun..
    Bu arada
    Bu key sizin güvenliğinizi sağlayacaktır. Verinizi bu ‘KEY’ ile şifreledikten sonra veritabanınıza kaydettiğinizi düşünün. Eğer dışarıdan biri veritabanınıza erişse bile veriler şifreli olduğu için ve ‘KEY’i bilmediğinden veritabanında ki datalar onun için hiçbirşey ifade etmeyecektir.

    Demişsiniz .
    Aes algoratmasını bilen biri bu bilgiyi alarak decrypt() yaparsa şifreyi elde etmiş olmaz mı?

    Bence bunu kullanan kişi şifreleyeceği sayıya kafadan küçük bir sayı ekleyip encrypt() yapmalı decrypt() yaptıktan sonra da bu sayıyı o değerden çıkartmalı
    diye düşünüyorum bu sayede şifresi bilinmez olabilir.
    diye tekrar düşünüyorum… 🙂

  15. Burak

    C#’da int türüne atama yapılan türleri şifreliyor. Yani byte türünden bir diziyi şifreleyebilir ama string türünü şifreleyemiyor. Bununda çözümü ASCII Encoding ile yazının byte değerlerini alıp şifreleyebilirsiniz.

  16. Burhan

    Merhabalar bu algoritma sadece int türünde veri mi şifreliyor?

Bir Cevap Yazın

Your email address will not be published. Please enter your name, email and a comment.