AES Algoritması kullanarak ile Şifreleme ve Deşifreleme

Bu yazımızda şifreleme algoritmalarının en meşhurlarından AES (Advanced Encryption Standart) yani Türkçe adıyla Gelişmiş Şifreleme Algoritması olan ve yüzlerce algoritma arasından finale kalan iki Belçikalı bilim adamının geliştirdiği Rijndael algoritmasının PHP içinde kullanımını inceleyeceğiz.

Google'a AES yazıp algoritmanın nasıl çalıştığı hakkında matematiksel bilgiye sahip olabilirsiniz. Sanılanın aksine şifreleme algoritmalarının iç mekanizması açık olarak sunulur, şifrelemenin sonucu değiştiren kullanıcının belirlediği key(anahtar) 'dır. 

AES bir secret key algoritmasıdır, şifreleme yaparken ve şifreyi çözerken aynı anahtar kullanılır. Anahtar gizli tutulmalıdır, güvenli şekilde saklanmalıdır. AES'in 128, 192 ve 256 bit olmak üzere üç versiyonu vardır. Şimdi gelelim PHP koduna, aşağıda belirlediğimiz bir key üzerinden şifreleme ve deşifreleme işlemini yapıyoruz.

 

<?php
    # --- ŞİFRELEME ---
 
        $anahtar = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");
    
    # AES-128, 192, 256 bit için sırasıyla anahtar boyutu 16, 24 veya 32 bayt 
    # olabilir.
    $anahtar_boyutu =  strlen($anahtar);
    echo "Anahtar boyutu: " . $anahtar_boyutu . "<br>";
    
    $metin = "Bugün İstanbulda hava çok güzel.";
 
    # Rastgele CBC modunu kullanarak rastgele IV oluştur
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    
    # Şifreleme Algoritması AES (Rijndael block size = 128)
    # güvenli olması için kodlanan giriş asla 00h ile bitmemelidir.
 
    $sifreliMetin = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $anahtar,
                                 $metin, MCRYPT_MODE_CBC, $iv);
 
    # Önüne IV(başlagıç vektörü) ekliyoruz, deşifreleme yapabilmek için. 
    $sifreliMetin = $iv . $sifreliMetin;
    
    #Şifreli metni string olarak göstermek için base64_encode fonksiyonundan geçiriyoruz.
    $sifreliMetin_base64 = base64_encode($sifreliMetin);
 
    echo  $sifreliMetin_base64 . "<br>";
 
    
    # --- DEŞİFRELEME ---
    
    $sifreliMetin_dec = base64_decode($sifreliMetin_base64);
    
    # IV'yi elde ediyoruz, iv_size mutlaka mcrypt_get_iv_size()ile oluşturulmalıdır.
    $iv_dec = substr($sifreliMetin_dec, 0, $iv_size);
    
    # Şifreli metni geri alma (önündeki $iv_size kaldırılıyor )
    $sifreliMetin_dec = substr($sifreliMetin_dec, $iv_size);
 
   #Deşifreleme fonksiyonunu çağırıyoruz
    $metin = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $anahtar,
                                    $sifreliMetin_dec, MCRYPT_MODE_CBC, $iv_dec);
    
    echo  $metin . "<br>";
?>

Mutlu kodlamalar,
Oğuzhan TAŞ
Haziran, 2016

KAYNAKLAR
1) Applied Cryptography, Bruce Schneier, Willey Press
2) Handbook of Applied Cryptography, CRC Press
http://cacr.uwaterloo.ca/hac/
3) http://php.net/manual/en/book.mcrypt.php
4) http://www.quadibloc.com/crypto/co040401.htm

 
Bookmark and Share