Sezar Şifreleme ve Python
Kriptoloji kulağa fazlasıyla havalı geldiği için birçoğumuzun zaman zaman ilgisini çekmiştir. Ama biraz ilgilenen herkes bilir ki kriptoloji hiç kolay olmayan bir alandır. Matematiğin güzelliği ve büyüleyiciliği kriptolojiyi tüm ihtişamı ile kuşatmıştır. Number theory veya Türkçe adıyla sayılar kuramı sadece doğal sayılarla ilgilenir, buna rağmen son yüzyılın çözülmesi en zor kabul edilen problemleri bu alandan çıkar. Kriptoloji asıl gücünü sayılar kuramından alır. Kimi zaman da soyut cebir, biraz da geometri. Hatta matematikçilerin çoğunun uzak durduğu topolojiden bile alır.
Günümüzde modern kriptoloji methodları kullanılır. Bunlarda temel bir kural vardır; iletişimin güvensiz bir kanaldan gerçekleştiği varsayılır. Yani, bir mesajları dinleyen biri vardır, ve mesajın aslı gizli kalmalıdır. Diğer bir kural ise dinleyen kişi hangi yöntemle şifreleme yapıldığını bilir. İşte modern kriptoloji bu iki kural üstüne kuruludur. RSA, El Gamal, DES (Artık kullanımda değil), AES modern yöntemlerden bazılarıdır.
Gelelim modern kabul edilmeyenlerine. Bunlardan en bilineni Sezar şifrelemedir. Ünlü imparator Sezar ‘ın doneminde kullanıldığı için böyle denmektedir. Bir sayı belirlenir ve her harf bu sayı kadar kaydırılarak ilk bakışta bir anlam ifade etmeyen bir metne dönüşür. Çok eski dönemlerde kimsenin bu yöntemden, kullanılan dilden haberi olmadığı düşünülürse, o dönem için işe yarar bir yöntem. Tabi ki günümüzde, yöntem bilindiği takdirde çok kolayca çözüleceği aşikar. İster kağıt kalem kullanın isterseniz bir script yazıp saniyeler içinde mesajı çözün. Scripti istediğiniz dilde yazın. Bazı diller içerdikleri hazır kütüphaneler sayesinde işi çok kolaylaştıracaktır. Bu yazıda python dilini kullanacağım. Ama unutmayın, makine diline yaklaştıkça daha hızlı çözümler bulacaksınız. Daha ileri kripto algoritmaları için C gibi bir dil kullanmanız işleri hızlandıracaktır. Kaynaklar kısmında C dilinde yazılmış halini de bulabilirsiniz.
Öncelikle temel prensibe tekrar bakalım. Sezar harflerin yerini 3er değiştirerek kullanmış. Bizim kodumuzda şifrelenmiş bir mesajı girdiğinizde olası mesajların listesini alacaksınız. İşleri kolaylaştırmak adına belli tanımlamaların yapılması gerekiyor.
Encryption: Şifreleme işlemine encryption denir.
Decryption: Şifreli metinden orjinal metne dönme işlemine denir. Saldırganın veya mesajı alan tarafın yaptığı işlem bu işlemdir.
Plain Text: Şifrelenmemiş, asıl metindir. (P)
Cipher Text: Şifrelenmiş metindir. (C)
Aslında temelde hangi alfabenin kullanıldığı önemli değildir ama genel anlatım için 26 harften oluşan İngiliz alfabesi kullanılacaktır.
ABCDEFGHIJKLMNOPQRSTUVWUXYZ
Örnek: “Sezar” kelimesini 3 anahtarı ile şifreleyelim.
Plain text: “Sezar”
Cipher text: “Vhcdu”
Encryption: Her harfe bir numara verilir
a=0
b=1
c=2
..
z=25
C = P +3 (mod 26)
daha genel bir ifadeyle C=P+k(mod 26)
Decryption: P=C-k(mod 26)
Geriye sadece algoritmayı koda dökmek kalıyor. Bu noktada chr() ve ord() fonksiyonunu kullanacağız.
ord() : bir char ifadenin ascii karşılığını almamızı sağlar.
chr(): Numerik bir ifadenin char karşılığını almamızı sağlar.
ord(‘a’) = 97
chr(65) = ‘A’
Bu örnekte kullanıcıdan alınan şifreli metnin anahtar tek tek denenerek çözüldüğü senaryo düşünülerek yazılmışır.
eğer küçük harf söz konusuysa benzer yöntem kullanılır.
Finalde
print(decryption)
ile plain textlerimizi elde ederiz.