3 Funktionen, die etwas mit der Cäsarverschlüsselung zu tun haben, eine zum Enkodieren, eine zum Dekodieren und eine zum Cracken
Basierend auf der "Ring-Klasse" von Leonidas
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf-8 -*-
from string import ascii_lowercase
char_order_de = ['e', 'n', 'i', 'r', 's', 'a', 't', 'd', 'h', 'u', 'l', 'g',
'o', 'c', 'm', 'b', 'f', 'w', 'k', 'z', 'p', 'v', 'j', 'y', 'x', 'q']
char_order_en = ['e', 't', 'a', 'o', 'i', 'n', 's', 'r', 'h', 'l', 'd', 'c',
'u', 'm', 'f', 'p', 'g', 'w', 'y', 'b', 'v', 'k', 'x', 'j', 'q', 'z']
langs = {'de' : char_order_de, 'en' : char_order_en}
class Ring(list): # from Leonidas
def __getitem__(self, index):
real_index = index % len(self)
return list.__getitem__(self, real_index)
def encode_caesar(text, move_each):
'''Encodes a text with the given chars to move'''
ring = Ring(ascii_lowercase)
lower_text = text.lower().replace('ü', 'ue').replace('ö', 'oe').replace('ä', 'ae')
encoded_text = []
for char in lower_text:
if char in ascii_lowercase:
new_index = ring.index(char) + move_each
new_char = ring[new_index]
else:
new_char = char
encoded_text.append(new_char)
return ''.join(encoded_text)
def decode_caesar(text, moved):
'''Decodes a encoded text with the "Cäsar-Encoding", how much
chars the the text is moved must be known'''
return encode_caesar(text, 26-moved)
def crack_caesar(text, lang='en'):
'''Decodes a encoded text with the "Cäsar-Encoding", but the
number of moved chars isn't needed
this way of cracking the encoded text doesn't work always, the
longer the text is, the bigger is the chance that the text can
be decoded'''
lang = langs.get(lang, 'en')
char_count = {}
char_number = float(len(text))
for char in text:
if char in ascii_lowercase:
if char in char_count:
char_count[char] += 1
else:
char_count[char] = 1
percents = {}
for char in char_count:
percent = int(char_count[char]) / char_number
if percent in percents:
percents[percent].append(char)
else:
percents[percent] = [char]
y = [x for x in reversed(sorted(percents.iteritems()))]
old_move = 1
move = 1
for i, _ in enumerate(y):
percent, chars = _
if not len(chars) == 1 or not old_move == move:
break
char = ''.join(chars)
old_move = move
move = ascii_lowercase.index(lang[i]) - ascii_lowercase.index(char)
return encode_caesar(text, move)
if __name__ == '__main__':
move_each = int(raw_input('How much chars to rotate?: '))
text = raw_input('Text: ')
lang = raw_input('Language en/de: ')
encoded_text = encode_caesar(text, move_each)
print 'Encoded Text:', encoded_text
print 'Decoded Text:', decode_caesar(encoded_text, move_each)
print 'Cracked Text:', crack_caesar(encoded_text, lang)
//Edit: jetzt mit Doc-Strings, wahrscheinlich grauenvoll