♻️ Moved shifting function to utils

This commit is contained in:
David Huh 2021-10-18 14:19:29 +02:00
parent fbf2c08ff7
commit 5fd431cef1
2 changed files with 84 additions and 79 deletions

View File

@ -1,3 +1,6 @@
from utils import CipherUtils
def encrypt_text(cleartext: str = 'Bitcoin', incrementation: int = 13): def encrypt_text(cleartext: str = 'Bitcoin', incrementation: int = 13):
""" """
This method encrypts a text by shifting each letter by the value of incrementation 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 = '' shifted_text = ''
for char in cleartext: for char in cleartext:
shifted_text += increment_char(char, incrementation) shifted_text += CipherUtils.shift_char(char, incrementation)
return shifted_text 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): def brute_force_example(cleartext: str = 'Bitcoin', incrementation: int = 7):

View File

@ -1,79 +1,98 @@
from utils import AlphabetUtils as au from utils import AlphabetUtils as au
GERMAN_FREQUENCY_PROFILE = [ GERMAN_FREQUENCY_PROFILE = [
0.0651, 0.0651,
0.0189, 0.0189,
0.0306, 0.0306,
0.0508, 0.0508,
0.1740, 0.1740,
0.0166, 0.0166,
0.0301, 0.0301,
0.0476, 0.0476,
0.0755, 0.0755,
0.0027, 0.0027,
0.0121, 0.0121,
0.0344, 0.0344,
0.0253, 0.0253,
0.0978, 0.0978,
0.0251, 0.0251,
0.0079, 0.0079,
0.0002, 0.0002,
0.0700, 0.0700,
0.0727, 0.0727,
0.0615, 0.0615,
0.0435, 0.0435,
0.0067, 0.0067,
0.0189, 0.0189,
0.0003, 0.0003,
0.0004, 0.0004,
0.0113 0.0113
] ]
def calculate_frequency(text: str, fancy_printing: bool = False): def calculate_frequency(text: str, fancy_printing: bool = False):
""" """
Calculates the frequency of every letter in the german alphabet for the given text 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 text: The text to calculate the letter frequency for
:param fancy_printing: Whether to print the frequencies to the console :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. :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)] occurrence_count = [0 for i in range(26)]
for char in text: for char in text:
if au.is_letter_of_alphabet(char): if au.is_letter_of_alphabet(char):
char_index = au.get_index_of_letter(char) char_index = au.get_index_of_letter(char)
occurrence_count[char_index] += 1 occurrence_count[char_index] += 1
occurrence_frequency = [] occurrence_frequency = []
for count in occurrence_count: for count in occurrence_count:
occurrence_frequency.append(count / len(text)) occurrence_frequency.append(count / len(text))
if fancy_printing: if fancy_printing:
for i in range(26): for i in range(26):
print(f'{au.get_letter_at_index(i, True)}: {occurrence_frequency[i] * 100}%') 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: def transform_invalid_chars(input: str) -> str:
""" """
Transforms invalid characters like german umlauts into their allowed alternatives Transforms invalid characters like german umlauts into their allowed alternatives
:param input: The text to check :param input: The text to check
:return: The improved text :return: The improved text
""" """
res = input res = input
res = res.replace('ä', 'ae') res = res.replace('ä', 'ae')
res = res.replace('A', 'Ae') res = res.replace('A', 'Ae')
res = res.replace('ö', 'oe') res = res.replace('ö', 'oe')
res = res.replace('Ö', 'Oe') res = res.replace('Ö', 'Oe')
res = res.replace('ü', 'ue') res = res.replace('ü', 'ue')
res = res.replace('Ü', 'Ue') res = res.replace('Ü', 'Ue')
res = res.replace('ß', 'ss') 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__': if __name__ == '__main__':
print( print(
calculate_frequency('Hier den Text eingeben, für den die Wahrscheinlichkeiten berechnet werden sollen', True)) calculate_frequency('Hier den Text eingeben, für den die Wahrscheinlichkeiten berechnet werden sollen', True))