Tarihte daha günümüz bilgisayarları icat edilmemişken; hükümdarların, askerlerin birbirine gönderdiği mektupların içeriğinin gizlenmesi amacıyla şifreleme üzerine çalışmalar yapılmıştır. Bu yazı dizimizde kriptoloji tarihine hızlı bir giriş yapıp, sonrasında günümüzdeki sistemlerde şifreleme yaparken gerçekleşen yanlış yapılandırmaların yol açtığı zafiyetleri inceleyeceğiz.
Kriptoloji, en basit tanımıyla şifre bilimidir. İki alt dala ayrılır diyebiliriz: Kriptografi ve kriptanaliz. Bunları siber güvenlik dünyasındaki kırmızı ve mavi takımlara benzetebiliriz. Kriptografi, matematiksel teknikler kullanarak güvenliği sağlamaya çalışır. Kriptanaliz, aynı teknikleri kullanarak güvenliği alt etmeye, şifreleri çözmeye çalışır. Tüm bu çalışmalar kriptoloji bilimi altındadır. Yazı dizimizde çoğunlukla güvenliğin nasıl sağlanacağıyla ilgileneceğimizden daha çok kriptografi kavramını kullanacağız.
Siber güvenlik dünyasında güvenlik üç temel üzerine kurulur: Gizlilik, Bütünlük ve Erişilebilirlik. Öncelikle hem bu üç kavramı, hem de bunlara ek birkaç kavramı, hangi kriptografik algoritma ve yöntemlerle kullandığıyla birlikte irdeleyelim.
-
Gizlilik: Gizlilik, belirli bir veriye sadece erişim hakkı olan yetkilendirilmiş kişilerin erişmesini, bunun dışında kalan tüm kişilerin bu veriye erişimini engellemeyi amaçlar. Bunu encryption (şifreleme) ile sağlayabiliriz. Bu sayede sadece anahtara sahip kişilerin ilgili veriye erişmesini sağlamış oluruz. Ancak, şifreleme yöntemleri tarihte, özellikle hayatımıza bilgisayar girdikten sonra karmaşıklaşmıştır. Şifre uzunluğu, şifreleme yöntemleri gibi parametreler verinin gizliliğinin sağlanmasında önemli rol oynar.
-
Bütünlük: Bilgisayar ve internetin hayatımıza girmesinden önce, aslında bu kavram günümüzde olduğu kadar önemli değildi. Bunu farklı bir şekilde daha anlatabiliriz: İnternete çıkmayan, sadece bizim erişimimizin olduğu bir bilgisayara girdiğimiz verileri yeterince iyi bir şekilde şifrelersek, bizden başka kimsenin (fiziksel olarak) veriye erişmemesini sağlamış oluruz. Bilgisayar internete çıkmadığı için, ağ üzerinde iletilmeyeceğinden, veriyi iletme ve bütünlüğünü sağlama gibi bir derdimiz de olmayacaktır. Ancak günümüzde, ağ ve internet üzerinden yoğun bir veri akışı gerçekleştirmekteyiz. Gönderdiğimiz veriyi bizim gönderdiğimizden ve doğru veriyi gönderdiğimizden emin olmalıyız. Burada bütünlüğün önemiyle karşılaşmaktayız. Bütünlüğü ilerleyen kısımlarda anlatacağımız hash (özet) fonksiyonlarını kullanarak sağlamaktayız.
-
Erişilebilirlik: Günümüzde internet hayatımızın önemli bir parçası. Günlük olarak yaptığımız işlemleri düşündüğümüzde birçoğunda internetin eylemin bir parçası olduğunu söyleyebiliriz. Banka işlemi, yemek siparişi, çalışırken bir konuda takıldığımızda internete başvurmamız, sosyal medya vs. Kaynaklara erişimin kısa süreli de olsa kesilmesi şirketleri yüzbinlerce, milyonlarca dolar zarara sokabilmektedir. Bu kesintilerin sebepleri; yoğunluk olması, sistemdeki bir yazılım hatası ya da saldırganların yaptığı Denial of Service (Servis Dışı Bırakma) saldırıları olabilir. Böyle durumlarda, Kurtlar Vadisi Pusu’nun bir bölümünde sistemleri siber saldırıya uğrayan Polat Alemdar’ın yaptığı gibi elektrikleri kesip kabloları çekmek genellikle önerilen bir davranış değildir. Birinci amaç, sistemleri ne olursa olsun erişilebilir kılmaktır.

-
İnkar Edilemezlik: Dijital ortamlarda, aynı gerçek dünyada kullandığımız ıslak imzalar gibi imza sistemleri mevcuttur. Bunlara elektronik imza denir. Bunu, teknoloji olarak başka amaçlar için de kullanılan asimetrik şifreleme yöntemlerini kullanarak sağlarız.
-
Deneyim ve Loglama: Bir bilgisayar sisteminde her (her olmasa da çoğu) hareket denetlenmeli, loglanmalıdır. Bu mekanizma, saldırıları tespit etme, ya da geriye dönük inceleme yapma imkanı sunar. Denetim ve loglama, bilgisayar sistemleri için güvenlik anlamında önemli bir konudur.
Temel güvenlik kavramlarını ve bu amaçlar doğrultusunda kullanılan birkaç yöntem, algoritmadan bahsettiğimize göre şifreleme yöntemlerine geçebiliriz.

Şifreleme, en basit gösterimiyle yukarıdaki görseldeki gibidir. Saklamak istediğimiz veriyi, bir anahtar ile şifreleriz ve güvenilmeyen ortamlara şifrelenmiş halini göndeririz. Ulaşılan yerde, veriyi ulaştırmak istediğimiz kişi de bir anahtarla şifreyi çözer ve veriye ulaşır. Şifreleme yöntemi olarak iki farklı yöntem kullanabiliriz: simetrik ve asimetrik. Asimetrik şifrelemede kullanılan anahtarlar farklıyken, simetrik şifrelemede aynıdır. Tarihte çok eski tarihlerden beri kullanılmaya başlanan cipher yöntemlerini geçip (Türkçeye direk şifre olarak çevrilmiş, şifrelemede kullanılan bir yapı diyebiliriz), Enigma ve sonrasında literatüre kazandırdıklarına bakabiliriz.
Enigma, 2. Dünya savaşı sırasında Almanlar tarafından kullanılan bir şifre makinesidir. Yapısı ayarlanabilir rotorlara ve birliklere önceden dağıtılmış şifre listesine dayanıyordu. Ayarlanabilir rotorlar ile her gün listede o güne denk gelen şifre uygulanıyor (Enigma elektro-mekanik bir cihazdı, her gün rotorler şifreye göre ayarlanıyordu) ve şifreyi kırmak isteyen müttefiklerin bilinen yöntemlerle yapacağı deneme sayısı, şifrelenmiş metnin önemini kaybedecek kadar bir süre alacağı için bilgi korunmuş oluyordu. Bilgisayar biliminin babası olarak kabul edilen Alan Turing, Enigma ile şifrelenmiş metinleri makul sürelerde kıracak bir makine tasarladı. Bu makinenin tasarlanması sürecinde; Enigma’nın yapısının öğrenilmesi, Almanların belirli metinleri (liderlerini selamlama, hava durumu gibi) belirli periyotlarla kullanılması ve bunun müttefikler tarafından farkedilmesi (bilinen metin saldırısı olarak da bilinir), anahtar değişiminin basit yöntemlerle yapılması gibi faktörler etkili oldu. Bu da bizi iki noktaya getiriyor: Anahtar değişimi konusu ve Kerckhoff Prensibi.

Kerckhoff’un altı ilkesi vardır (Vikipedi):
- Sistem, matematiksel olarak olmasa da, uygulamada çözülemez olmalıdır;
- Gizli olmasına gerek duyulmamalıdır ve düşmanın eline geçmesi rahatsızlık vermemelidir;
- Anahtar yazılı notlara gerek duyulmadan iletilebilmeli ve elde tutulabilmelidir, tarafların isteğiyle değiştirilebilmelidir;
- Telegraf yazışmalarına uygulanabilir olmalıdır;
- Taşınabilir olmalıdır ve kullanımı ve işlevi birçok insanın toplanmasını gerektirmemelidir;
- Son olarak, uygulaması göz önünde bulundurulduğunda, kullanımı kolay olmalı, zihinsel zorlamayı veya uzun kural serilerinin bilinmesini gerektirmemelidir.
Burada bizim odaklanmamız gereken ilk nokta, sistemin bilinirliğinin sorun oluşturmaması gerektiğidir. Kullanılan algoritma bilinse de bu bir güvenlik zafiyeti oluşturmamalıdır. Çünkü algoritma şifre gibi gizli bir bilgi değildir. Bunun yanısıra, bir algoritma herkese açık şekilde paylaşıldığında daha fazla test edilme, geliştirilme imkanı sunar. Ayrıca gizli algoritmalar belirsizlik yoluyla güvenlik sağlamaktadır, bu da güvenliği geliştirici ekibin hatasına ve niyetine inşa eder. Bunun aksine güvenlik bilinmezliğe değil, matematiğin gücüne dayanmalıdır. Aşağıda herkese açık olarak paylaşılmış, simetrik bir şifreleme algoritması olan AES’i ele aldık. AES (Advanced Encryiption Standard), DES’in (Data Encryption Standard) halefi denebilir. DES’in zamanla kırılabilir hale gelmesinden dolayı AES’in geliştirilmesi ihtiyacı duyulmuştur.

AES’i 128 bitlik mesajları şifreleyen bir “block cipher” olarak düşünebiliriz. 128 bit açık metinden 128 bitlik şifreli metin oluşur, eğer ana metin daha uzunsa bloklara bölünüp şifrelenir ve bloklar birleştirilir. 128 bitlik parçalar ilk adım olarak yukarıda görüldüğü şekilde bir matris olarak ele alır.

Anahtar 128, 192 ya da 256 bit uzunluğunda olabilir. Anahtar uzunluğu değiştikçe uygulanan tur sayısı değişir, ama mantık yine aynıdır. Yukarıda 1 turda uygulanan adımlar gösterilmiştir. Bu adımlara, AES algoritmasında kullanılan yapıya SP Network (Substitution-Permutation Network) denir. Başta anahtar ekleme (XOR işlemi ile) uygulanır. Sonra her turda sırasıyla bayt substitüsyonu, satır kaydırma, kolon karıştırma (son turda uygulanmaz) ve anahtar ekleme (XOR işlemi ile) işlemleri uygulanır. Şifreyi çözme işleminde aynı anahtarla yapılan işlemler tersine şekilde yapılır ve ana metine ulaşılır. Günümüzde 128 bitlik anahtar kullanılarak AES uygulanmış bir şifreli metni bile çözmek yıllar alır, bu yüzden hala güvenlidir. Özetle AES, algoritmanın gizliliğinden bağımsız, güvenliği yapılan matematiksel işlemlerin tüm anahtar ihtimalleriyle denendiğinde uzun zaman almasına dayanan güvenli bir algoritmadır. AES algoritmasıyla ilgili daha detaylı bilgi için, severek takip ettiğim bir kanal olan Computerphile’ın AES Explained (Advanced Encryption Standard) - Computerphile videosuna göz atabilirsiniz.
Simetrik şifreleme algoritmalarını da ilgilendiren anahtar değişimi ve birden fazla anahtarın kullanıldığı asimetrik şifreleme algoritmasına yazı dizisinin bir sonraki bölümünde gireceğiz. Bu yazıyı bir gerçek dünya örneği ile bitirelim. Aşağıda gördüğünüz kod bloğu, güvenli kod geliştirme eğitim platformu olan Secure Code Warrior’dan alınmıştır. Aşağıdaki Java kodunda az önce AES’ten önce kullanıldığını belirttiğimiz, şu an güvensiz olarak nitelendirilen DES algoritmasının kullanıldığını görmekteyiz.
...
public void generateKey(String alias) {
try {
if (!keyStore.containsAlias(alias)) {
KeyGenerator keyGenerator = KeyGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_3DES, "AndroidKeyStore");
keyGenerator.init(
new KeyGenParameterSpec.Builder(alias,
KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_ECB)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.setKeySize(168)
.setUserAuthenticationRequired(false)
.build());
keyGenerator.generateKey();
}
} catch (KeyStoreException | InvalidAlgorithmParameterException
| NoSuchAlgorithmException | NoSuchProviderException e) {
if (BuildConfig.DEBUG) {
e.printStackTrace();
}
}
}
...
Kod bloğunda 3DES algoritması, ECB blok modu ile, padding olmadan, 168 bitlik anahtar oluşturacak şekilde kullanılmıştır. 3DES, DES’in daha gelişmiş bir yaklaşımı olsa da yapısı yüzünden meet-in-the-middle-attack (ortada buluşma saldırısı) sebebiyle sağladığı anahtar seviyesi 112 bit’e düşmektedir. Blok boyutu AES’ten farklı olarak 64 bit olduğu için birtakım kaba kuvvet saldırılarına (doğum günü saldırıları) karşı güvensizdir. Bu yüzden daha güvenli bir algoritma olan AES’i, doğru mod ve konfigürasyonla kullanmak gerekmektedir.
Secure Code Warrior’da birsürü kaynak ve alıştırma yöntemi bulunmaktadır. Yukarıdaki kod bloğunu aldığım soru tipi, zafiyeti bulma ve önerilenler arasından doğru olanı seçip düzeltme şeklinde iki adımdan oluşmaktadır. Bize seçenekler sunulmakta ve en uygun olanı seçmemiz gerekmektedir. Bizim örneğimizde DES yerine AES kullanmalı, daha güvenli kabul edilen bir blok modu seçilmeli ve anahtar boyutu artırılmalıdır. Aşağıdaki görselde kodda yapılması gereken değişiklikler gösterilmiştir.
