diff --git a/chapter_one/Verschiebe-Chiffre.py b/chapter_one/Verschiebe-Chiffre.py index 34cb9a8..b419bd4 100644 --- a/chapter_one/Verschiebe-Chiffre.py +++ b/chapter_one/Verschiebe-Chiffre.py @@ -1,3 +1,6 @@ +from utils import CipherUtils + + def encrypt_text(cleartext: str = 'Bitcoin', incrementation: int = 13): """ This method encrypts a text by shifting each letter by the value of incrementation @@ -30,28 +33,11 @@ def shift_text(cleartext: str, incrementation: int): shifted_text = '' for char in cleartext: - shifted_text += increment_char(char, incrementation) + shifted_text += CipherUtils.shift_char(char, incrementation) return shifted_text -def increment_char(char, incrementation: int = 1): - """ - This method shifts one char by the value of incrementation - - :param char: Char to be shifted - :param incrementation: How much the char should be shifted - :return: Shifted letter - """ - # converting character to byte - char_in_bytes = bytes(char, 'utf-8')[0] - if char_in_bytes + incrementation >= 91 and char_in_bytes < 91 \ - or char_in_bytes + incrementation >= 123: # z -> 122 | 90 -> Z so go backwards - new_char_in_bytes = bytes([char_in_bytes - (26 - incrementation)]) - else: - new_char_in_bytes = bytes([char_in_bytes + incrementation]) - - return str(new_char_in_bytes)[2] def brute_force_example(cleartext: str = 'Bitcoin', incrementation: int = 7): diff --git a/utils/CipherUtils.py b/utils/CipherUtils.py index bc08b22..4d90451 100644 --- a/utils/CipherUtils.py +++ b/utils/CipherUtils.py @@ -1,79 +1,98 @@ from utils import AlphabetUtils as au GERMAN_FREQUENCY_PROFILE = [ - 0.0651, - 0.0189, - 0.0306, - 0.0508, - 0.1740, - 0.0166, - 0.0301, - 0.0476, - 0.0755, - 0.0027, - 0.0121, - 0.0344, - 0.0253, - 0.0978, - 0.0251, - 0.0079, - 0.0002, - 0.0700, - 0.0727, - 0.0615, - 0.0435, - 0.0067, - 0.0189, - 0.0003, - 0.0004, - 0.0113 - ] + 0.0651, + 0.0189, + 0.0306, + 0.0508, + 0.1740, + 0.0166, + 0.0301, + 0.0476, + 0.0755, + 0.0027, + 0.0121, + 0.0344, + 0.0253, + 0.0978, + 0.0251, + 0.0079, + 0.0002, + 0.0700, + 0.0727, + 0.0615, + 0.0435, + 0.0067, + 0.0189, + 0.0003, + 0.0004, + 0.0113 +] def calculate_frequency(text: str, fancy_printing: bool = False): - """ - Calculates the frequency of every letter in the german alphabet for the given text - :param text: The text to calculate the letter frequency for - :param fancy_printing: Whether to print the frequencies to the console - :return: A list of frequencies, where index 0 contains the frequency of a in percent and so on. - """ - occurrence_count = [0 for i in range(26)] + """ + Calculates the frequency of every letter in the german alphabet for the given text + :param text: The text to calculate the letter frequency for + :param fancy_printing: Whether to print the frequencies to the console + :return: A list of frequencies, where index 0 contains the frequency of a in percent and so on. + """ + occurrence_count = [0 for i in range(26)] - for char in text: - if au.is_letter_of_alphabet(char): - char_index = au.get_index_of_letter(char) - occurrence_count[char_index] += 1 + for char in text: + if au.is_letter_of_alphabet(char): + char_index = au.get_index_of_letter(char) + occurrence_count[char_index] += 1 - occurrence_frequency = [] + occurrence_frequency = [] - for count in occurrence_count: - occurrence_frequency.append(count / len(text)) + for count in occurrence_count: + occurrence_frequency.append(count / len(text)) - if fancy_printing: - for i in range(26): - print(f'{au.get_letter_at_index(i, True)}: {occurrence_frequency[i] * 100}%') + if fancy_printing: + for i in range(26): + print(f'{au.get_letter_at_index(i, True)}: {occurrence_frequency[i] * 100}%') - return occurrence_frequency + return occurrence_frequency def transform_invalid_chars(input: str) -> str: - """ - Transforms invalid characters like german umlauts into their allowed alternatives - :param input: The text to check - :return: The improved text - """ - res = input - res = res.replace('ä', 'ae') - res = res.replace('A', 'Ae') - res = res.replace('ö', 'oe') - res = res.replace('Ö', 'Oe') - res = res.replace('ü', 'ue') - res = res.replace('Ü', 'Ue') - res = res.replace('ß', 'ss') + """ + Transforms invalid characters like german umlauts into their allowed alternatives + :param input: The text to check + :return: The improved text + """ + res = input + res = res.replace('ä', 'ae') + res = res.replace('A', 'Ae') + res = res.replace('ö', 'oe') + res = res.replace('Ö', 'Oe') + res = res.replace('ü', 'ue') + res = res.replace('Ü', 'Ue') + res = res.replace('ß', 'ss') - return res + return res + + +def shift_char(char, incrementation: int = 1): + """ + This method shifts one char by the value of incrementation + + :param char: Char to be shifted + :param incrementation: How much the char should be shifted + :return: Shifted letter + """ + # converting character to byte + char_in_bytes = bytes(char, 'utf-8')[0] + if char_in_bytes + incrementation >= 91 and char_in_bytes < 91 \ + or char_in_bytes + incrementation >= 123: # z -> 122 | 90 -> Z so go backwards + new_char_in_bytes = bytes([char_in_bytes - (26 - incrementation)]) + else: + new_char_in_bytes = bytes([char_in_bytes + incrementation]) + + return str(new_char_in_bytes)[2] if __name__ == '__main__': - print( - calculate_frequency('Hier den Text eingeben, für den die Wahrscheinlichkeiten berechnet werden sollen', True)) + print( + calculate_frequency('Hier den Text eingeben, für den die Wahrscheinlichkeiten berechnet werden sollen', True))