class Vegenere: def __init__(self): self.helper = Helper() def encrypt(self, plaintext, key): plaintext = self.helper.format(plaintext) key = self.helper.format(key) kryptotext = '' for index, char in enumerate(plaintext): plain_char = ord(char) - 65 key_char = ord(key[index % len(key)]) - 65 krypto_char = ((plain_char + key_char) % 26) + 65 kryptotext += unichr(krypto_char) return kryptotext def decrypt(self, kryptotext, key): kryptotext = self.helper.format(kryptotext) key = self.helper.format(key) plaintext = '' for index, char in enumerate(kryptotext): krypto_char = ord(char) - 65 key_char = ord(key[index % len(key)]) - 65 plain_char = ((krypto_char - key_char) % 26) if plain_char < 0: plain_char += 26 plain_char += 65 plaintext += unichr(plain_char) return plaintext
def _char_frequency(text): frequencies = [0 for i in range(26)] text = Helper.format(text) for index, char in enumerate(text): frequencies[ord(char) - 65] += 1 return frequencies
def _find_positions(self, krypto_text): krypto_text = Helper.format(krypto_text) positions = {} for i in range(len(krypto_text)-2): sub = krypto_text[i:i+3] if sub in positions: positions[sub].append(i+1) else: positions[sub] = [i+1] return self._remove_zero_or_one_occurancies(positions)