def encrypt_text(cleartext: str = 'Bitcoin', incrementation: int = 13): """ This method encrypts a text by shifting each letter by the value of incrementation :param cleartext: The secret message to encrypt :param incrementation: How much the letters should be shifted :return: Encrypted text """ return shift_text(cleartext, (incrementation % 26)) # '%' to repeat after 26 with 0 def decrypt_text(encrypted_text: str = 'Ovgpbva', incrementation: int = 13): """ This method decrypts a text by shifting each letter by the value of incrementation :param encrypted_text: The encrypted secret message to decrypt :param incrementation: How much the letters should be shifted :return: Decrypted text """ return shift_text(encrypted_text, 26 - (incrementation % 26)) # '%' to repeat after 26 with 0 def shift_text(cleartext: str, incrementation: int): """ This method shifts every letter of a string by the value of incrementation :param cleartext: The string to be shifted :param incrementation: How much the letters should be shifted :return: Shifted text """ shifted_text = '' for char in cleartext: shifted_text += increment_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): """ This is an example of how to bruteforce an encrypted text. (Encrypted with Letter-Shifting) :param cleartext: The secret message to encrypt and decrypt during bruteforcing :param incrementation: How much the letters should be shifted """ encrypted_text = encrypt_text(cleartext, incrementation=incrementation) for x in range(26): if cleartext == decrypt_text(encrypted_text, incrementation=x): print(f'Text was shifted by {x} letters.') if __name__ == '__main__': print(encrypt_text()) print(decrypt_text()) brute_force_example()