Python ile Sezar Şifreleme Algoritması
Adından da anlaşıldığı üzere bu algoritmayı Jul Sezar gönderdiği mesajların düşmanların tarafında ele geçirilirse o mesajı anlamaması için oluşturulmuştur. Bu algoritma en temel şifreleme olarak kabul edilmektedir. Günümüzde şifreleme için pek güvenli sayılmamaktadır. Çünkü çözme olasılığı 1/25 dır. Eğer şifreleme türü bilinmiyorsa bu daha zor olacaktır ama biliniyorsa en fazla 25 denemede şifre kırılacaktır. Günümüzde hiçbir şifreleme çeşidi kırılamaz değildir. Bazı şifreler 10 günde kırılırken bazı şifreler ise 100 yılda kırılabilir. Bir şifreyi kırma süreciniz, bilgisayarınızın gücüne göre değişecektir.
Sezar algoritması, ana mesajın her bir harfini belirtilen anahtar sayı kadar ileri kaydırarak şifreli mesajı oluşturmak üzeredir. Şifreyi çözmek için ise anahtar sayısı ile şifreli mesajdaki her karakterin anahtar sayısı kadar geriye giderek ana mesajı dönüştürmesi üzerinedir.
Örnek olarak ana mesajımız canberk olsun. Anahtar sayımız da 3 olsun. Daha sonra ana mesajdaki her harfi 3 harf ileri kaydırıp şifreli mesajı fdqehun olarak buluruz. Aynı şekilde bu şifreyi çözmek için ise o harften itibaren 3 harf geri giderek canberk ana mesajımızı elde ederiz.
Yazılan kodların ana yapısı her bir harfin ASCII sayı tablosunda karşılığına gelecek şekilde düşünülmüştür. Ayrıca alfabe 26 karakterle sınırlı olup Türkçe karakterler geçerli değildir.
İlk olarak maksimum anahtar uzunluğunu alfabe uzunluğu kadar olduğunu belirtelim.
Kod:
[COLOR="Yellow"]MAX_KEY_SIZE = 26[/COLOR]
Daha sonra kullanıcıdan mesajı şifrelemek mi yoksa şifreli mesajı çözmek mi istediğini öğrenmek için bir fonksiyon oluşturalım.
Kod:
[COLOR="yellow"]def getMode():
while True:
print('Do you wish to encrypt or decrypt a message?')
mode = input().lower()
if mode in 'encrypt e decrypt d'.split():
return mode
else:
print('Enter either "encrypt" or "e" or "decrypt" or "d".')[/COLOR]
Yukarıdaki fonksiyonda şifreleme(eccrypt) mi yoksa çözme (decrypt) işlemi yapmak istediğinizi soruyor, ardından sizin girdiğiniz değeri lower() fonksiyonu ile küçük harfe çevirip mode değişkenine atıyor. if dögüsü ile mode içine atanılan input değerinde encrypt e decrypt d içerip içermediğini kontrol ediyor. Eğer içeriyorsa bunu return yapıyor değilse tekrar soruyor.
Kod:
[COLOR="yellow"]def getMessage():
print('Enter your message:')
return input()[/COLOR]
Yukarıdaki fonksiyonu şifrelenecek ya da çözülecek mesajı almak için kullanacağız. Daha sonra bu değeri return ediyoruz.
Kod:
[COLOR="yellow"] key = 0
while True:
print('Enter the key number (1-%s)' % (MAX_KEY_SIZE))
key = int(input())
if (key >= 1 and key <= MAX_KEY_SIZE):
return key[/COLOR]
Yukarıda ise şifreleme için gerekli olan anahtar değerini kullanıcıdan alıyoruz. Anahtar değerini maksimum alfabe uzunluğunda olması gerektiğini belirtiyoruz. Ardından da bu değeri return ediyoruz.
Kod:
[COLOR="yellow"]def getTranslatedMessage(mode, message, key):
if mode[0] == 'd':
key = -key
translated = ''
for symbol in message:
if symbol.isalpha():
num = ord(symbol)
num += key
if symbol.isupper():
if num > ord('Z'): #90
num -= 26
elif num < ord('A'): #65
num += 26
elif symbol.islower():
if num > ord('z'): #122
num -= 26
elif num < ord('a'): #97
num += 26
translated += chr(num)
else:
translated += symbol
return translated[/COLOR]
Yukarıda fonksiyonun ana kısmını yazdık. İlk olarak kullanıcının yapmak istediği işlemi mode değerine atamıştık. Eğer kullanıcı bir mesajı şifrelemek istiyorsa ikinci ve üçüncü satırları atlayıp işleme girecektir. Eğer şifre çözmek istiyorsa üçüncü satırda anahtar değerini negatif yaparak geriye doğru gitmeyi sağlayacaktır. translated,ilk içi boş olarak atanan,bizim sonuç değişkenimizdir. Ardından for döngüsü ile kullanıcının mesajının her harfini symbol isimli değişkene atayıp o karakterin harf olup olmadığını kontrol etmek için isalpha() fonksiyonunu kullanacağız. Ardından kullanıcıdan alının anahtar değerini, o harfin ASCII tablosundaki değerine ekliyoruz/azaltıyoruz. Daha sonra alfabenin sınırlarını belirlemek için hem küçük hem de büyük harfler için sınırları çiziyoruz. Bundan sonra elimizdeki sayı değerini karaktere çevirip translated değişkenine atıyoruz. Eğer en başta kontrol ettiğimiz harf olup olmama durumunda, eğer harf harici bir karakter varsa bunu değiştirmeden direk sonuç değişkenine atıyor. Ardından da sonuç(translated) değişkenini return ediyoruz.
Kod:
[COLOR="yellow"]mode = getMode()
message = getMessage()
key = getKey()[/COLOR]
İlk başta yazdığımız 3 fonksiyondan gelen değerleri ayrı ayrı değişkenlere atıyoruz.
Kod:
[COLOR="yellow"]print('Your translated text is:')
print(getTranslatedMessage(mode, message, key))[/COLOR]
Son olarak print fonksiyonu içinde ana fonksiyonumuza, diğer fonksiyonlardan gelen değerleri parametre olarak gönderip sonucumuzu alıyoruz.
Tek parça kod: https://github.com/canozer13/Python/blob/master/caesar_algorithm.py
Son düzenleme:


