İPUCU

Kriptografi - Şifreleme Şifreleme Ve Şifreleme Sistemleri Hakkında Her şey.

Seçenekler

Python ile Sezar Şifreleme Algoritması

03-06-2018 15:30
#1
Üyelik tarihi:
01/2016
Nereden:
...
Mesajlar:
4.868
Teşekkür (Etti):
122
Teşekkür (Aldı):
941
Konular:
681
Ticaret:
(0) %
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:
MAX_KEY_SIZE = 26
Daha sonra kullanıcıdan mesajı şifrelemek mi yoksa şifreli mesajı çözmek mi istediğini öğrenmek için bir fonksiyon oluşturalım.

Kod:
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".')
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:
def getMessage():
   print('Enter your message:')
   return input()
Yukarıdaki fonksiyonu “şifrelenecek” ya da “çözülecek” mesajı almak için kullanacağız. Daha sonra bu değeri return ediyoruz.

Kod:
   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
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:
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
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:
mode = getMode()
message = getMessage()
key = getKey()
İlk başta yazdığımız 3 fonksiyondan gelen değerleri ayrı ayrı değişkenlere atıyoruz.

Kod:
print('Your translated text is:')
print(getTranslatedMessage(mode, message, key))
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/...r_algorithm.py

Kullanıcı İmzası
.
Konu SessizKalpler tarafından (03-06-2018 15:46 Saat 15:46 ) değiştirilmiştir.

03-06-2018 15:31
#2
Phemis - ait Kullanıcı Resmi (Avatar)
root@Reverser:~#
Üyelik tarihi:
12/2017
Mesajlar:
2.269
Teşekkür (Etti):
885
Teşekkür (Aldı):
619
Konular:
154
Ticaret:
(0) %
Ellerinize Sağlık
03-06-2018 15:44
#3
Ceen - ait Kullanıcı Resmi (Avatar)
Forumdan Uzaklaştırıldı
Üyelik tarihi:
07/2017
Mesajlar:
219
Teşekkür (Etti):
70
Teşekkür (Aldı):
75
Konular:
19
Ticaret:
(0) %
Ellerine sağlık kardeşim. Çok güzel konu olmuş.
03-06-2018 15:46
#4
Üyelik tarihi:
10/2017
Nereden:
T Ü R K
Yaş:
19
Mesajlar:
652
Teşekkür (Etti):
144
Teşekkür (Aldı):
158
Konular:
52
Ticaret:
(0) %
Eline sağlık
Kullanıcı İmzası
Gâfil ne bilir neş've-i pür-şevk-i vegâyı
Meydân-ı celâdetteki envar-ı sefâyı
Merdân-ı gazâ aşk ile tekbirler alınca
Titretti yine, rû-yı zemin arş-ı semâyı.
Allah yolunda cenk edelim şân alalım şan
Kur'an'da zafer vaadediyor Hazret'i Yezdan.
11-06-2018 02:33
#5
Socked - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
03/2018
Nereden:
.
Mesajlar:
152
Teşekkür (Etti):
39
Teşekkür (Aldı):
31
Konular:
15
Ticaret:
(0) %
Teşşekürler Eline Sağlık
Kullanıcı İmzası
Tarih bir milletin neler başarabilme gücünde olduğunu gösteren en doğru bir kılavuzdur.

-Mustafa Kemal Atatürk

Bookmarks


« Önceki Konu | Sonraki Konu »
Seçenekler

Yetkileriniz
Sizin Yeni Konu Acma Yetkiniz var yok
You may not post replies
Sizin eklenti yükleme yetkiniz yok
You may not edit your posts

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodları Kapalı
Trackbacks are Kapalı
Pingbacks are Kapalı
Refbacks are Kapalı