Merhaba
Crypto 101 yazı serisinin 5. bölümü olan ve “Modes Of Operations” konusunu ele aldığımız blog yazısına hoşgeldiniz. Bu yazıda anlatılanları rahatlıkla anlaşılabilir olması adına serisinin özellikle 2. bölümü “Block Cipher Encryption ve DES Analizi” başta olmak üzere tüm serisinin okunması şiddetle tavsiye edilmektedir.
Operasyon Modları
Block Cipher algoritmalarına örnek olarak verdiğimiz DES veya AES belirli sayıda plain-text bit’i işleme almaktadır. Örnek verirsek, DES 64 bit, AES ise 128 bit plain-text üzerinde işlem gerçekleştirmektedir. Bu durumda akıllara gelen soru şu olacaktır: “Peki ben 1MB boyutunda yani 8.000.000 bit büyüklüğünde ki resim dosyasını AES ile şifrelemek istersem ne yapacağım ?”. OTP konusunda gördüğümüz “Private key’imiz ile bit bit işleme alırız” cevabı maalesef yeterli değildir, çünkü konumuz Block Cipher algoritmalarıdır. “İlk 128 bit’lik kısmı alır şifrelerim. Sonra sırada ki 128 bitlik kısmı alır şifrelelerim.” ise ilk akla gelen cevaplardandır ve ilerleyen bölümlerede ECB olarak adlandırılan bu algoritmayı göreceğiz ki ciddi güvenlik problemlerine gebedir.
Bu tür nedenlerden ötürü bu soruya cevap verirken karşımıza önemli bir terim çıkmaktadır; operasyon modları. Şifrelenecek plain-text metinler Block Cipher algoritmamıza nasıl ve hangi mantıkla gönderilecektir ?
Şifreleme modları, AES veya DES gibi block cipher algoritmalarından bağımsızdır. DES veya AES’in içerisinde ki bir yapı veya algoritmik yaklaşım DEĞİLDİR. Genellikle şifreleme işlemine girecek olan plain-text’in seçimi ve üzerinde gerçekleştirilen işlemler ile ilgilidirler. Yani 8.000.000 bit belirli bir algoritma ile işleme girmelidir. Lafı çok uzatmadan örnekler ile ilerleyelim.
Electronic Codebook ( ECB )
En temel block modudur. Plain-text, şifreleme algoritmasının istediği uzunluklarda ki bloklar halinde bölünerek doğrudan işleme alınmasıdır.
Yukarıda ki resimde görüldüğü üzere ilk N-bit uzunluğunda ki plain-text block belirlenmiş Key ile işleme girer ve N-bit uzunluğunda cipher-text oluşur. Aynı işlem plain-text blockları bitene kadar devam eder. Örneğin AES için düşünürsek plain-text’ler 128 bitlik uzunluklara bölünerek işleme alınacaktır. Peki plain-text 128’in herhangi bir katı olacak uzunlukta değilse ? Bu bölümleme nasıl gerçekleştirilecektir ?
from Crypto.Cipher import AES key = "cokgizlisifre123" plain_text = "Merhabalar. Ben gizlenmek uzere AES ile siflenecek onemli bir metinim." PADDING = '{' pad = lambda s: s + (16 - len(s) % 16) * PADDING aes = AES.new(key, AES.MODE_ECB) cipher_text = aes.encrypt(pad(plain_text)) print repr(cipher_text) plain_text = (aes.decrypt(cipher_text)) print plain_text.rstrip(PADDING)
Yukarıdaki örnekte ECB modu ile şifreleme yapılmış bir AES kodu bulunmaktadır. 16 byte yani 128 bitlik bloklara bölündüğünde en son bloğu 128 bite tamamlamak için süslü parantezi karakteri padding olarak eklenmektedir.
ECB Moda Yönelik Saldırılar
Anlaşıldığı üzere ECB mod şifrelenecek olan plain-text metni, şifreleme algoritmasının istediği block size’a göre bölmekteydi. Fark edelim ki AES-128 bit ECB mod ile kullanmakta olan iki banka olsun.
Bank A ve Bank B arasında para transferi işlemi gerçekleştirilebilmektedir. Bu işlem sırasında T süresi boyunca geçerli olan ortak bir Key kullanılmaktadır ve algoritmamız ECB mod kullanan AES’tir. Bu iletişimi MITM saldırısı ile dinleyebilen ve değiştirebilen HACKER’ımız var.
Bank A’dan Bank B’ye gönderilecek verinin plain-text hali ise aşağıdaki gibidir. Yani bir kullanıcı para transferi gerçekleştirdiğinde aşağıdaki verinin iletilmesi gerekmektedir.
Burada ki alanlar 128 bit’lik bloklardan oluşan kümelerdir ve sırasıyla şu bilgileri ifade etmektedir.
- Kaynak banka
- Kaynak bankada ki müşteri numarası
- Hedef banka
- Hedef bankada ki müşteri numarası
- Para miktarı
Bu sisteme hacker’ın yaptığı saldırı şu şekilde olacaktır.
- Hacker gidip A ve B bankasında kendisine ait birer hesap açar.
- Bank A’dan Bank B’ye 1000 adet 1 ile 10 arasında değerlerde TL para transferi gerçekleştirir ve bu işlem sırasında giden tüm cipher-text’leri kayıt eder.
- Bu cipher-text’lerin 128 bitlik bloklardan oluştuğunu bilmektedir. 10000 adet verinin 5’li bloklarına baktığında değişen tek alanın son 128 bitlik blok olan AMOUNT olduğunu görür.
- Gene Bank A’dan Bank B’de ki başka bir hesaba 1 TL para transferi gerçekleştirir. Bu işlemde değişiklik gösteren bloklar ise son iki blok olacaktır. ACCOUNT #B ve AMOUNT. Bu sayede 4. bloğun hedef bankada ki hesap numarasını ifade ettiğini anlar.
- Tüm network üzerinde trafiğin 4. bloğunu, başta kaydettiği 1000 adet veride ki 4. blokta ki veri ile değiştirir. Böylece şifreli olan ama kendi hesap numarasını işaret eden veriyi, başka insanların para transferlerinde ki hedef hesap yerine geçirmiş olur.
Böylece tüm veri AES ile güvenli ve şifreli olarak bankalar arasında transfer edilmiş olsada, verileri hiçbir şekilde decrypt etmeye gerek kalmaksızın sistem manipüle edilerek başka insanların para transferlerinin hesap hesabı saldırganın ki ile değiştirilebilmektedir.
Bu durumun yaşanmasında ki sebeb ECB’de, her blok sadece ve sadece kendisi ile ilgili output veriyor olmasıdır. Buna çözüm üretmek adına başka bir operasyon modu kullanılmalıdır.
Cipher Block Chaning ( CBC )
CBC, ECB’nin problemine ( ECB’nin deterministik olması problemi )çok net bir çözüm getirmektedir.
CBC, her bloğun kendisinden sonra ki blok ile, encryption işlemi öncesi bire bir XOR işlemine girmesidir. Bu durumda ilk blok kiminle XOR işlemine girecektir ? sorusu akıllara gelmektedir. Bunun içinde IV adı verilen bir değer belirlenir ve ilk bloğun XOR işleminde kullanılır. Böylece banka örneğinde ki gibi 4. blok doğrudan 4. blokta ki plain-text’i ifade etmemektedir.
CBC içinde “oracle padding” ve “bit flips” isimli saldırılar gerçekleştirilebilir. BU saldırıları bir sonra ki blog yazısında ele alıyor olacağız.
Output Feedback Mod ( OFB )
OFB ise CBC’den daha da farklı bir yaklaşım ile plain-text’i datalara bölmektedir. İşin ilginci şifreleme algoritması plain-text üzerinde değilde IV ve Key üzerinde uygulanmaktadır.
Gördüğünüz üzere IV ve Key encryption’a tabi tutulmuşturç Yani AES, DES gibi algoritmaya giren aslında plain-text değil de doğrudan IV ve Key değerleridir. Bu işlemin sonucunda çıkan veri ise plain-text ile bire bir XOR işlemine girmektedir.