Kripto [3] – Vigenere Şifreleme Algoritması

Bilgiyi paylaşarak çoğalt!!

Herkese merhaba,
Kripto yazı serisinin üçüncü yazısı olan Vigenere şifreleme algoritması ile devam edelim. Sezar şifreleme algoritmasına göre biraz daha güvenlidir diyebiliriz. Polyalphabetic şifreleme yöntemidir. Vigenere şifreleme algoritması 1586 yılında Blaise de Vigenere tarafından geliştirilmiştir. Vigenere algoritması kullanıldığı dönemde kırılması zor olduğundan Le Chiffre Undechiffrable (kırılamaz şifre) lakabını 🙂 almıştır. Vigenere 1800’lü yıllarda Charles Babbage tarafından kırılmıştır. Vigenere algoritmasının çalışma yöntemine bakacak olursak;

İlk önce bir tane anahtar belirliyoruz. Bu anahtarın her bir harfi için alfabe seti oluşturuyoruz. Alfabe seti oluşturulurken anahtar içindeki her harf kendisinden başlayarak kaydırma işlemi ile yeni alfabe seti oluşturulur. Vigenere’ye Polyalphabetic denmesinin sebebi de budur.

Şimdi bir örnek üzerinden ilerleyecek olursak;

Şifrelemek istediğimiz metin “batuhan” anahtarımız ise “bjk” olsun. Burada şöyle bir durum karşımıza çıkıyor: eğer şifrelmek istediğimiz metin uzunluğu anahtarımızın metin uzunluğundan büyükse anahtar tekrar edilir. İlk olarak anahtarımız olan “bjk” kullanarak alfabe setimizi oluşturalım.

Alfabe setimizi oluşturduktan sonra şifreleme işleme başlayalım. Şifrelemek istediğimiz metinin harflerini anahtarımızın harfleri ile eşletiriyoruz. Sonra tablo üzerinde karşılık gelen harfi alarak şifrelenmiş metini elde ediyoruz.

  • b -> b = c
    • Şireleme işlemi yapılırken burada şirelenecek kelimemiz ilk harfi “b” için anatarımız ilk harfi “b” için oluşturulan alfabe setinden karşılık gelen harfi alıyoruz. Diğer adımlarda bu şekilde yapılmaktadır.
  • a -> j =  j
  • t -> k = g
  • u -> b = ü
  • h -> j = s
  • a -> k = k
  • n -> b = o

“batuhan” kelimesinin “bjk” anatarı kullanarak vigenere algoritmasına göre şifrelenmiş hali “cjgüsko” dur.

Vigenere şifreleme yöntemi için hazırlamış olduğun basit python kodu aşağıdaki gibidir.

# -*- coding: utf-8 -*-

class Vigenere:

    def __init__(self, key_word):
        # Turkish alphabet
        self.__letters = ["a", "b", "c", "ç", "d", "e", "f", "g", "ğ", "h", "ı", "i", "j", "k",
                          "l", "m", "n", "o", "ö", "p", "r", "s", "ş", "t", "u", "ü", "v", "y", "z"]
        self.__key_word = key_word
        self.__key_index = []

    def encrypt(self, plain_text):
        encrypted_text = ""
        self.__key_index = self.__getKeyIndex(plain_text)
        count = 0
        for letter in (plain_text):
            if letter in self.__letters:
                new_index = (self.__getIndexOfLetter(letter) + self.__key_index[count]) % len(self.__letters)
                encrypted_text = encrypted_text + self.__letters[new_index]
                count = count + 1
            else:
                encrypted_text = encrypted_text + " "
        return encrypted_text

    def decrypt(self, cipher_text):
        decrypted_text = ""
        count = 0
        for letter in (cipher_text):
            if letter in self.__letters:
                new_index = (self.__getIndexOfLetter(letter) - self.__key_index[count]) % len(self.__letters)
                decrypted_text = decrypted_text + self.__letters[new_index]
                count = count + 1
            else:
                decrypted_text = decrypted_text + " "
        return decrypted_text

    def __getIndexOfLetter(self, letter):
        if letter in self.__letters:
            return self.__letters.index(letter)

    def __getKeyIndex(self, plain_text):
        key_index = []
        count = 0
        for i in range(len(plain_text)):
            if i % len(self.__key_word) == 0:
                count = 0
            key_index.append(self.__getIndexOfLetter(self.__key_word[count]))
            count = count + 1
return key_index

Vigenere şifrelemesi frekans analiz yöntemi ile çözülebilir.

Bir sonraki yazıda görüşmek üzere.. 🙂

Python kodu github link: https://github.com/bavlayan/crypto101/tree/master/Vigenere

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir