Şifreleme Algoritmaları
Herkese yeniden merhaba! Biliyorsunuz ki öğrendiğim, araştırdığım, kafa yorduğum şeylerle alakalı yazılar yazmayı çok seviyorum. Bu içeriklerin ilerde bana toplu kaynak olarak hizmet edeceğine inanarak üniversitede seçtiğim seçmeli bir dersin proje ödevi olarak sunduğum algoritmaları da sizlerle paylaşmak istedim.
Ayrıca belirtmek istiyorum ki bu yazıyı yazarken ara sıra ünlü matematikçi John Nash’in biyografi filmi olan “A Beautiful Mind”a atıfta bulunabilirim. (İzlemediyseniz izlemenizi tavsiye ediyorum.)
O zaman hazırsanız bu yazımızda bu aralar oldukça gündem olan hesap çaldırmalara da atıfta bulunarak “şifreleme algoritmaları”ndan bahsedeceğiz.
Bu algoritmaları daha iyi anlamamız için daha öncesinde bilmemiz gereken bazı terimler var. Nedir bunlar?
- Kriptografi
- Kriptoanaliz
- Kriptoloji
Kriptografi: Gizliliği sağlamak için bilgiyi matematiksel algoritmalar kullanarak şifrelemek veya şifresini çözmek için kullanılan bir bilim dalıdır.
Kriptoanaliz: Kriptografik sistemlerin güvenliğini analiz etmek ve kırma girişimlerinde bulunmak için kullanılan bir disiplindir.
Kriptoloji: Kriptografi ve kriptoanalizin birleşimidir ve bu iki alana genel bir bakış sunar. Kriptoloji, hem bilgiyi güvenli bir şekilde iletmek ve saklamak için şifreleme tekniklerini geliştirmeyi hem de bu tekniklerin güvenliğini test etmek için kriptoanaliz yöntemlerini içerir.
“Kriptografi”de kullanılan bazı temel terimler:
- Açık Metin (Plaintext): Orijinal, düz metin.
- Şifreli Metin (Ciphertext): Şifrelenmiş metin.
- Şifre (Cipher): Açık metni şifreli metne dönüştüren algoritma. Şifreleme algoritması.
- Şifreleme (Encrypt): Açık metni şifreli metne dönüştürme işlemi.
- Deşifreleme (Decrypt): Şifreli metinden açık metni kurtarma işlemi.
Şifreleme Algoritmalarının Kullanım Alanları:
◼ Güvenli iletişim
◼ Veri gizliliği
◼ Şifreli dosya depolama
◼ Veri imzası
Güvenlik ve Zayıflıklar:
◼ Uzun anahtar uzayları sayesinde Brute Force saldırılarına karşı dayanıklıdır.
◼ Matematiksel zayıflıkların keşfedilmesi yani bilgisayar gücünün artmasıyla eskiden güçlü olduğunu düşündüğümüz algoritmalar artık zayıf olabilir.
◼ Zayıf parolalar veya anahtarlar kullanıldığında güvenlik zedelenir.
Alt yapımızı sağladıysak üzerinde duracağımız konulara geçelim…
Üstünde duracağımız bazı konular:
- Vigenere Şifrelemesi
- Kasiski Analizi
- Running Key Şifrelemesi
Vigenère Şifresi
Bugün Vigenère Şifresi olarak bilinen şifreleme aslında ilk kez Giovan Battista Bellaso tarafından 1553 tarihli “La cifra del” kitabında tanımlanmıştır.
Polialfabetik şifreleme olarak da bilinir. Adından da anlaşılacağı gibi polialfabetik şifreleme, mono alfabetik yöntemlerden farklı olarak bir harf değiştirilince her seferinde aynı harfe dönülmez. Anahtara bağlı olarak her harf alfabede birden fazla harfle eşleşmektedir.
Vigenère Şifresi, Trithemius Şifresinin bir uyarlamasıdır, ancak Tabula Recta’daki şifreli metin alfabelerinde sistematik olarak ilerlemek yerine, hangi sütunların kullanılacağını seçmek için bir anahtar kelime kullanır.
Tarihteki en ünlü kod ve şifre örneklerinden biri olan ENIGMA makinesi, geliştirilmiş çok alfabeli yer değiştirme şifresinden başka bir şey değildir.
Şifrelemeyi yapabilmemiz için birkaç şeye ihtiyacımız var. Nedir bunlar?
- Vigenere Tablosu olarak bilinen bir tablo
- Anahtar kelime (mesajın şifrelenebilmesi için)
Tablo, farklı satırlarda 26(İngilizce alfabe kullandığımızı varsayıyoruz) kez yazılmış alfabelerden oluşur. Her alfabe, bir önceki alfabeye göre döngüsel olarak sola kaydırılmıştır ve 26 olası Sezar Şifresine karşılık gelir. Algoritmasını basitçe uygulamak için: [A-Z] → [0–25]
Hadi bir örnek üzerinden kendi şifremizi oluşturalım.
- Şifrelenecek metnimiz (plaintext) “SoftwareDevelopment” olsun.
- Anahtar kelimemizi(key) de “Gokce” olarak seçelim.
Şifrelemek için yapmamız gereken alt alta yazdığımız harflerin Vigenere tablosundaki kesişimlerini bulmak.
Bu şekilde devam ederek şifrelenen metnimize ulaşıyoruz.
Şifreli Metin (Ciphertext): “YCPVAGFOFIBSVQTSSXV”
Aynı sonuca aşağıdaki yöntemi kullanarak da oluşabiliriz:
Yüzyıllar boyunca Vigenère Şifresi çok güvenli bir şifre olarak biliniyordu ve çok uzun bir süre boyunca kırılamaz olduğuna inanılıyordu. 1863 yılında Friedrich Kasiski tarafından kırıldı.
Konuyu anladığımızı varsayıyorum. Şimdi birlikte kod örneğine bakalım mı?
- Koda baktığımızda boş bir StringBuilder nesnesi oluşturulduğunu görüyoruz. Anahtar kelime, metnin uzunluğuna eşit olana kadar döngü devam eder. Anahtar kelimenin karakterleri tek tek eklenir. Anahtar kelimesindeki karakterlerin tekrar kullanılabilmesi için döngü oluşturulur. Genişletilmiş anahtar kelimeyi döndürür.
- Boş bir StringBuilder nesnesi oluşturuluyor. Anahtar kelime, metnin uzunluğuna genişletilir. Metnin her karakteri için döngü başlatılır. Metnin karakterleri tek tek alınır. Anahtar kelimenin karakterleri tek tek alınır. Şifreleme işlemi yapılır. Anahtar kelimenin karakteri kullanılarak harfler kaydırılır. Şifrelenmiş karakterler, şifrelenmiş metne eklenir. Şifrelenmiş metni döndürür.
Kasiski Analizi
Kasiski, şifreleme sistemlerinde kullanılan anahtar uzunluğunu belirlemek için kullanılan bir kripto analitik tekniği olup, özellikle çok alfabeli şifreleme yöntemlerine, örneğin Vigenère şifresine karşı etkili bir saldırı yöntemidir.
Bu algoritma, metindeki periyodik tekrarlanan desenleri bulmaya odaklanır ve bu desenler arasındaki uzaklık, muhtemel anahtar uzunluğunu belirlememize yardımcı olur.
Anahtar kelimesinin uzunluğu bulunduktan sonra, kripto analist şifreli metni anahtar kelimesinin uzunluğu kadar sütuna ayırır. Ardından, her bir sütun, bir mono alfabetik şifreleme yönteminin şifreli metni gibi ele alınabilir. Bu şekilde, her bir sütun frekans analizi ile saldırılabilir.
Hadi birlikte cefasını Friedrich Kasiski’nin çektiği, sefasının da Charles Babbage tarafından sürüldüğü Kasiski Analizinin aşamalarına bakalım.
Aşamaları:
◼Şifreli metinde tekrarlanan karakter dizileri aranır.
◼Başarılı bir inceleme için karakter dizileri en az üç karakter uzunluğunda olmalıdır.
◼Ardından, tekrarlanan karakter dizileri arasındaki mesafeler, anahtar kelimesinin uzunluğunun katları olma eğilimindedir.
◼Daha fazla tekrarlanan karakter dizisi bulmak, anahtar kelimesinin olası uzunluklarını daraltır, çünkü tüm mesafelerin en büyük ortak böleni alınabilir.
Kasiski incelemesinin zorluğu tekrarlanan kelimelerin bulunmasında yatar. Bu işlem manuel olarak gerçekleştirildiğinde oldukça zordur, ancak bilgisayarlar bu görevi büyük ölçüde kolaylaştırabilir. Ancak, bazı tekrarlanan dizilerin tesadüfen oluşabileceği unutulmamalıdır, bu nedenle analist, yanıltıcı olabilecek bazı tekrar mesafelerini elemek zorundadır. Doğru uzunluğu bulmak için tesadüfleri elemesi gerekir ve ardından elde edilen mono alfabetik şifreleme metinleri kripto analize tabi tutulmalıdır.
Yeterince teknik detaylara baktıysak Vigenère şifresiyle şifrelenmiş örnek metnimizi Kasiski Analizi ile çözmeye çalışalım.
Örnek metnimiz:
YAGFQNSUSAWQOISQAKLRANUPOYNMRWLZSMOQYERQTHNDOPWXAGAEAGKRLHDQRLUFHXYAWGZYAESSAKKQNLHZDMOQYTSEOXUVORCETGNFHXNMRWLZSHMNGAHGSX
Adım adım gitmekte fayda var…
1.Adım:
Şifrelenmiş metin incelenir, tekrar eden metin grupları arasındaki uzaklıklar bulunur.
Metne baktığımızda tekrar eden metin gruplarının AG ve QN olduğunu görüyoruz. Her biri için tekrar etme sıklığını bulalım.(Frekans analizi için ihtiyacımız olacak.)
- Tekrar eden AG’ler arasındaki uzaklıklar: 48 ve 4'tür.
- Tekrar eden QN’ler arasındaki uzaklıklar: 76
2.Adım:
4, 48 ve 76 sayılarının çarpanlarına bakıyoruz.
- 4 sayısının çarpanları: 1, 2, 4
- 48 sayısının çarpanları: 1, 2, 3, 4, 6, 8, 12, 16, 24, 48
- 76 sayısının çarpanları: 1, 2, 4, 19, 76
Ortak çarpanları 4 olduğundan vektör uzunluğu için tahminimiz 4'tür. Yani anahtarımızın 4 harfli olduğunu tahmin ediyoruz.
3.Adım:
Rastlantı dizinin testini kullanarak anahtar uzunluğunun 4 olup olmadığını kontrol edelim.
Verilen değerler yerine yazıldığında m=4 ifadesinin doğruluğu görünür.
4.Adım:
Anahtar uzunluğumuzun 4 olduğunu bulduk. Bu da bize örnek şifreli metnimizin her 4 harfte bir anahtarın ilk harfi ile şifrelendiğini anlatıyor.
- Yani şifreli metnin 1. 5. 9. 13. 14… harfleri anahtarın 1.harfi ile şifrelendiğini söylüyor.
- Aynı mantıkla 2. 6. 10. 14… harfler de vektörün 2.harfi ile şifrelenmiştir.
- Yine aynı mantıkla 3. 7. 11… harfler de vektörün 3.harfi ile şifrelenmiştir.
- 4. 8. 12. 16…harfler de vektörün 4.harfi(son) ile şifrelenmiştir.
O halde:
1.Harf: Y Q U Q Q R P M Z Q D X E R Q F A Y S Q Z Q E V E F M Z N G
2.Harf: A N S O A A O R S Y T O A A L R H W A A N D Y O O T H R S G S
3.Harf: G Z A I K N Y W M E H P G G H L X G E K L M T X R G X W H A X
4.Harf: F S W S L U N L O R N W A K D U Y Z S K H O S U C N L M H
SONUÇ:
- Şifrelenmiş metnin anahtarını harflerin kullanılma sıklıklarından yararlanarak “MATH” olarak bulduk.
- Şifreli bir metnin anahtarını kullanarak nasıl deşifre edileceğini en baştan söylemiştik. (Viegenere Tablosundan yararlanarak.)
Böylece açık metin:
“MANY ENGLISH PEOPLE ARE FAUND OF GARDENS. THEY LIKE TO GROW PLANTS AND FLOWERS IN THEIR OWN SMALL GARDENS AND THEY ALSO ENJOY VISITING THE GARDENS OF BIG HOUSE” şeklinde bulunur.
Hadi kod üzerinden bakalım…
repeatedBlocks
adında boş bir liste oluşturulur. Bu liste, tekrar eden blokları içerecektir.blockPositions
adında boş bir HashMap oluşturulur. Bu harita, blokların başlangıç pozisyonlarını saklayacak.for (int i = 0; i < text.length() - minLength; i++) {
Metnin her karakterini kontrol etmek için bir döngü başlatılır. Bu döngü, metnin sonundanminLength
kadar önceye kadar devam eder. Bu, metnin sonundaki bir bloğun,minLength
kadar karaktere sahip olmadığından emin olmak içindir.String block = text.substring(i, i + minLength);
: Metnini
indeksinden başlayarakminLength
kadar uzunluğunda bir blok oluşturulur.if (blockPositions.containsKey(block)) {
:blockPositions
haritası, oluşturulan bloğu zaten içeriyorsa: Bu, bloğun daha önce metinde başka bir yerde bulunduğu anlamına gelir. Bu durumda, bu bloğun önceki pozisyonunu alırız (prevPosition
) ve bu pozisyondan itibaren tekrar eden bloğu alırız. Bu tekrar eden blok,repeatedBlocks
listesine eklenir.blockPositions.put(block, i);
: EğerblockPositions
haritası, oluşturulan bloğu içermiyorsa, bloğu ve başlangıç pozisyonunu (i
) haritaya ekleriz.return repeatedBlocks;
: Döngü tamamlandıktan sonra,repeatedBlocks
listesi, bulunan tekrar eden bloklarla doldurulur ve bu liste döndürülür.
findRepeatedBlocks
metodunu kullanarak,ciphertext
içindeki tekrar eden blokları bulur ve bu bloklarırepeatedBlocks
adlı birArrayList
'e kaydeder.- İki iç içe döngü kullanarak, tekrar eden bloklar arasındaki mesafeleri hesaplar.
- Her bir tekrar eden blok için, diğer tüm blokları kontrol eder ve bloklar arasındaki mesafeyi hesaplar.
Math.abs()
fonksiyonu, blokların pozisyonları arasındaki mutlak farkı hesaplar.
Running Key
Bu şifreleme yöntemi, geçmişte askeri iletişimde ve gizli yazışmalarda kullanılmıştır.
Bu yöntemde, şifrelenecek metin (PlainText) ile birlikte bir anahtar metin (RunningKey) kullanılır. Running Key’in uzunluğu şifrelenecek metnin uzunluğuna eşit veya daha uzun olmalıdır.
Matematiksel Gösterimi:
Uygulama Adımları:
- Anahtar Şifreleme
- Harf Harf Şifreleme
- Kaydırma ve Tekrarlama
Uygulama Örneği:
Şifrelenecek Metin (PlainText): Flee at once. We are discovered.
Anahtar Metin (RunningKey): errors can occur in several places
İndikatör belirleyebilmemiz için anahtar metin olarak seçtiğimiz errors can occur in several places şeklinde devam eden cümleyi referans aldığımız sayfa ve satır numarasına ihtiyacımız var.
Sayfa ve satır numarası: 06301
- İlk üç basamak sayfa numarasına tekabül ediyor.
- Son 2 basamak da satır numarasına tekabül ediyor.
Yani 63.sayfanın 1.satırı bizim anahtar metnimiz.
İndikatörü belirlemek için de şifrelenecek metin değerlerinin(plaintext value) alfabenin hangi harflerine(plaintext alphabet) denk geldiğini buluyoruz.
Sayfa ve satır numarasını temsil eden 06301 sayısı bizim indikatörümüz. 0 sayısı A harfine tekabül ediyor, 6 sayısı G harfine, aynı şekilde 3 sayısı D harfine… Böylece indikatörümüzü buluyoruz.
İndikatörümüz: AGDAB
Son olarak şifreli metnimizi yazarken indikatörümüzü sondan bir önceki kelime grubuna koyuyoruz.
Final Mesajımız: JCVSR LQNPS YGUIM QAWXS AGDAB MECTO
Şimdi asker olduğumuzu düşünelim. Başka asker bir arkadaşımıza şifreli mesaj göndermek istiyoruz. Yukarıda bahsettiğimiz şekilde göndermek istediğimiz mesajı şifreledik. Diğer asker arkadaşımızın mesajı çözebilmesi için hangi kitabı indikatör oluşturmak için seçtiğimizi bilmesi gerekiyor. Bunu bildikten sonra indikatör yardımıyla şifreyi çözebilir.
Running Key Cipher anahtar metni rastgele seçilen ve şifreleme işlemi sırasında sürekli olarak kaydırılan bir metin olduğu için güvenlik açısından daha yüksek bir seviyeye sahip olabilir. Ancak anahtar metni güvenli bir şekilde paylaşma ve saklamak gerekir.
Hadi kod örneğine bakalım…
Okuduğunuz için teşekkür ediyor, geri bildirimlerinizi dört gözle bekliyorum.