Article cover

11.07.2023

15

Like

10734

Views

Sezar Şifresi

Bu yazıda, tarihteki ilk şifreleme algoritmalarından biri olan Sezar Şifrelemesini (Caesar Cipher) ele alacağız. Keyifli okumalar dilerim :)

Adını ünlü Roma İmparatoru Julius Sezar'dan almış basit bir şifreleme algoritmasıdır. Algoritma her harfin belirlenen adım sayısı (anahtar) kadar ötelenmesine dayanır. Şifreyi çözmek için mesajın yazıldığı dilin alfabesine göre öteleme işlemi yapılmalıdır, aksi taktirde mesaj bulunulamayabilir. Bu çalışmadaki örnekler Türk alfabesini baz alarak hazırlanmıştır.

Tarihçe

Julius Sezar, MÖ 1. yüzyılda askeri mesajlarının güvenliğini sağlamak için kendince böyle bir yöntem bulmuştur. Bilinen en eski şifreleme yöntemlerinden biridir. Kolay bir şifreleme yöntemi olduğu için de farklı anahtarlar ile tarih boyunca önemli bir çok mesajın şifrelenmesinde kullanılmıştır.

Uygulanışı

  • Şifrelenecek metin ve anahtar (adım sayısı) belirlenir. Sezar şifresi özelinde bu sayı 3'tür.
  • Metnin her karakteri anahtar kadar ötelenerek şifrelenir. Örnek olarak A harfi 3 adım ötelenerek D harfi elde edilir. Burada A'nın Ç harfine dönüşmediğine dikkat etmenizi isterim. 3 adım ötelendikten sonraki harf olan D harfini aldı. Anahtar öteleme sayısını belirtiyor.

Örnek bir uygulama olarak "Patika" kelimesini anahtar değeri 3 olacak şekilde şifreleyelim:

Alfabe: ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ

Patika → Tdymod

Avantajları:

  • Oldukça basit olması, eğer anahtarı biliyorsanız şifreleme ve çözme işlemleri hızlıca gerçekleştirilebilir.
  • Sezar şifrelemesi sadece alfabedeki harfler için çalışır dolayısıyla sayılar veya diğer işaretler için çalışmaz. Onların şifrelenmemesi şifrelenmiş metinin okunmasını zorlaştırdığı için bir avantaj olarak sayılabilir.

Dezavantajları:

Esasen avantaj olarak saydığımız şeyler bakış açısına göre dezavantaj olarak da sayılabilir.

  • Basit bir yapısı vardır, deneme yanılma yoluyla kısa bir süre içerisinde çözülebilir. Bu dezavantajı onu güvenli bir algoritma olmaktan uzaklaştırır.
  • Sadece harf karakterler için çalışır dolayısıyla güncel şifreleme ihtiyaçlarını karşılayamaz.
  • Tek anahtarlı, simetrik bir şifreleme yöntemi olduğundan dolayı anahtarın güvenliği sağlanamazsa şifreleme yöntemi tamamen açığa çıkabilir. (Simetrik şifreleme yöntemi ile kastedilen şey, açık metin (plain text) olarak adlandırılan mesaj, şifreleme anahtarı (secret key) yardımıyla şifrelenir ve şifreli metin (cipher text) olarak adlandırılır. Şifreli metin, aynı şifreleme anahtarı kullanılarak tekrar çözülebilir ve orijinal açık metne geri dönüştürülebilir.)

Sezar Şifrelemesini Kırmak

Basit bir şifreleme yöntemi olduğu için kırması da oldukça kolaydır. En başlıca yöntemlere bakalım:

  1. Kaba kuvvet saldırısı: Kaba kuvvet (brute-force) yaklaşımı ile kolaylıkla kırılabilir. Türk alfabesini baz aldığımızdan dolayı anahtar uzayımız 29'dur. En fazla 28 defa ileri alındığında mesaj ortaya çıkacaktır, 29. sefere gelindiğinde ise şifrelenmiş mesaja tekrar ulaşılacaktır. Günümüz biligisayarları ile çok kısa sürelerde mesaj deşifre olabilir.
  1. Frekans Analizi: Frekans analizi ile en çok geçen harfler tespit edilir. Algoritma öteleme ile çalıştığı için şifresiz metinlerdeki en çok geçen harflere karşılık gelen şifreli metindeki harfler frekans tablosundan tahmin edilerek anahtar bulunabilir.
  1. Bilinen açık metin: Şifrelenmeden önce şifrelenecek metnin bir kısmı biliniyorsa (mesela, bir şifreli mesajın ilk kelimesi açık olarak biliniyorsa), bu bilgi kullanılarak metni deşifre etmek daha kolay hale gelir.

Python Kodu

def sezar_sifre(metin, anahtar=3):
    alfabe = 'abcçdefgğhıijklmnoöprsştuüvyz'
    sifreli_metin = ''
    for harf in metin:
        if harf.lower() in alfabe:
            index = alfabe.index(harf.lower())
            otelenmis_index = (index + anahtar+1) % len(alfabe)
            if harf.isupper():
                sifreli_metin += alfabe[otelenmis_index].upper()
            else:
                sifreli_metin += alfabe[otelenmis_index]
        else:
            sifreli_metin += harf
    return sifreli_metin
  1. def anahtar kelimesi ile sezar_sifre() isimli fonksiyonumuzu tanımladık. Fonksiyon iki adet parametre alıyor, bunlar şifrelenecek metin ve kaç adım ötelenmesini istediğimizi belirten anahtar değeri. Anahtarın varsayılan değeri 3 olarak tanımlı, bu şu anlama gelir, eğer hiç bir değer girilmez ise anahtar otomatik olarak 3 alınır.
  2. Alfabeyi ve şifrelenmiş metni tutacak boş bir string tanımlıyoruz.
  3. Şifrelenecek metindeki her harf için bir for döngüsü başlatıyoruz. Devamında harfin küçük hali (burada alfabedeki harfleri küçük olarak tanımladığımız için harfi lower() fonksiyonu ile küçültüyoruz) alfabenin içerisinde varsa index'ini belirliyoruz. Harfin alfabedeki konumunu bulduktan sonra harfi şifreleme işlemine geçiyoruz.
  4. Harfin index'ini anahtar değerinin 1 fazlası ile toplayarak alfabenin moduna bölüyoruz, bu sayede ötelenmiş index değerine ulaşıyoruz. Bu işlem 7. satırda gerçekleşiyor, dilerseniz bu satırda neyi neden yaptığımıza daha yakından bakalım.
  • Index değeri harfin alfabedeki konumunu ifade eder örnek olarak P harfini alalım. P harfinin index'i 19 olarak bulunur çünkü index'ler 0 sayısından başlar. Akabinde anahtar değerinin 1 fazlası ile topluyoruz, 1 fazlası ile toplamamızın sebebi ötelendikten sonraki değeri istememiz. Eğer 1 fazlası ile toplamaz isek değer, T yerine Ş değerini alır.
  • Son olarak alfabenin uzunluğu ile mod işlemi gerçekleştirdik (uzunluğu bulmak için string ifadelerde çalışan len()fonksiyonunu kullandık). Neden mod aldığımıza gelecek olursak, diyelim ki V harfini şifreleyeceğiz, harfin B olmasını ümit ederiz. B harfi de alfabenin 1. index'ine tekabül eder. Mod almadığımız senaryoda ötelenmiş index'in değeri V harfi için 30 olur ama tanımladığımız Türk alfabesi 29 harftir. Dolayısıyla bu değer alfabe için geçerli değildir. Modunu alarak, yani 29'a bölümünden kalanı bularak ötelenmiş index'i 1 buluruz ki bu da B harfine tekabül eder. Bu şekilde, alfabe dairesel bir yapı gibi davranır ve öteleme işlemi her zaman geçerli bir harf üretir.
  1. 8-11 satırları arasında eğer harf büyük ise büyük olacak şekilde, else: durumunda ise küçük olarak sifreli_metin değişkenine eklenir.
  2. 12-13 satırlarında eğer metnin içerisindeki karakter alfabede yok ise şifrelenmeden olduğu gibi kendi index'ine yerleştirilir.
  3. Son satırda return anahtar kelimesi ile sifreli_metin döndürülür.

Dilerseniz fonksiyonu Patika kelimesi ile test edelim:

metin = 'Patika'
sifrele = sezar_sifre(metin)
print(sifrele) #Tdymod

Son olarak Sezar Şifrelemesini kaba kuvvet saldırısı ile kıran algoritmanın koduna aşağıdaki linkten erişebilirsiniz.

sezar_kaba_kuvvet_saldirisi.py

Okuduğunuz için teşekkür ederim, başka algoritmalarda görüşmek üzere :)

Cryptography
Python Temel
İleri Python

Comments

You need to log in to be able to comment!

Enes Fehmi Manan

Data Scientist

Location

İzmir, TR

Education

İstatistik - Ege

© 2021 Patika Dev

facebook
twitter
instagram
youtube
linkedin