Simetrik şifreleme - Part 1


#1

Simetrik şifreleme, şifreleme ve deşifreleme işlemleri aynı anahtarla ile yapabildiğimiz şifreleme sistemidir. Anahtar boyutları (key size) asimetrik şifrelemeye göre oldukça küçüktür, bundan dolayı da simetrik şifreleme her zaman performans olarak asimetrik şifrelemeye göre avantaj sahibidir.

Temel olarak iki parçaya ayrılırlar; Block ciphers ve Stream ciphers.

Block ciphers: Veriyi bloklar halinde şifrelemeyi esas alır. AES, DES, 3DES en çok bilinen türleridir. Kısaca matematiksel olarak şifreleme(encryption) için;

şeklinde deşifreleme (decryption) için ise;

şeklinde ifade edebiliriz.

Burada;

K: Anahtar (Key)
E(): Şifreleme (Encryption)
D(): Deşifreleme (Deşifreleme)
P: Açık metin (Plain Text)
C: Şifrelenmiş metin (Encrypted Text)

olarak belirtilmiştir. Görüldüğü üzere encryption ve decryption işlemleri sonucunda oluşan şifreli metin ve açık metinin boyutu aynıdır herhangi bir genişleme ve artma sözkonusu değildir.

Blok şifrelemeye ait farklı modlar mevcuttur. Aslında bunların temel motivasyonu bir sonraki şifreleme işlemi için besleme şeklidir. Örneğin;

Electronic Codebook (ECB): Basitçe veri eşit bloklar halinde bölünür ve herbiri ayrı ayrı şifrelenir.

ECB’ nin handikabı ise bu şekildeki bir yapı yeteri kadar ‘randomness’ sağlamadığı için bilgi sızdırabilir. Kısacası simetrik şifreleme operasyonlarında ECB modunun kullanılması tavsiye edilmez.

Cipher Block Chaining (CBC): Bu modda ise şifrelenmiş blok bir sonraki açık metin ‘xor’ lanarak işleme öyle konur. İlk blokta ise IV(Initialization Vector) bir başlangıç vektörü kullanılır. Bu şekilde ‘randomness’ ta sağlanmış olur.

CBC nin dezavantajlarından biri paralel programlamaya uygun olmayışıdır. Bu da şifreleme işleminin hızını düşürür. Ayrıca yetkilendirilmemiş CBC kullanımı choosen cipher text attack (padding oracle attack) ile tamamen çökertilebilmektedir.

Counter (CTR): Bu mod blok cipherı bir stream cipher gibi kullanıp beslemeyi şifreledikten sonra oluşan şifrelenmiş metinin açık metin ile XOR lanması sonucunda ulaşılır. Genelde sayaç olarak değişecek değişken uzunca bir süre kendisi tekrar etmemelidir. Ayrıca CTR biribirinden bağımsız yapıları sayesinden paralel olarak şifreleme işlemi uygulanmasına da uygundur. Burdaki Nonce ıda IV gibi düşünebilirsiniz.

Bu modlarında haricinde Output Feedback (OFB), Cipher Feedback (CFB), Propagating Cipher Block Chaining (PCBC) modları da mevcuttur. Daha önce dediğimiz gibi temel olarak beslemenin (feed) nasıl yapıldığına göre şekillenirler.

O halde NACI kütüphanesini kullanarak basit bir block şifreleme yapan bir program yazalım;

#include <iostream>
#include <memory>
#include <vector>
#include <algorithm>
#include "crypto_stream.h"
#include "crypto_secretbox.h"

using namespace std;



 
int main(int argc, char **argv) 
{
    string k;
    string n;
    string m;
    string c;    
    
    cout << "nounce please" << endl;
    cin >> n;
    
    if (n.size() != crypto_stream_NONCEBYTES) {
        cout <<  "nounce size should be (" << crypto_stream_NONCEBYTES << ")"  << endl;
        exit(1);
    }
        
    
    cout << "message please" << endl;
    cin >> m;
   
    cout << "key please" << endl;
    cin >> k;
    
    if (k.size() != crypto_stream_KEYBYTES) {
        cout <<  "key size should be  (" << crypto_stream_KEYBYTES << ")" << endl;
        exit(1);
    }    
            
            
    
    try 
    {
         c = crypto_stream_xor(m, n, k);
    }
    
    catch (exception &e) {
        cout << "Exception:" << e.what() << endl;
    }
    
    cout << "succesfully encrypted" << endl;
    
    
    cout << "decrypted text:" << crypto_stream_xor(c, n, k) << endl;
    
    
    return 0;
}

NACI kütüphanesi AES yerine simetrik şifreleme operasyonları için salsa20 algoritmasını kullanıyor. Birazcık kütüphaneyi yazan DJB nin kendi tasarladığı bir cipher olması bir yandan da daha hızlı olması itibari ile.


Simetrik Şifreleme - Part 2