Krypto_Grundlagen/chapter_one/Permutations-Chiffre.py

84 lines
2.0 KiB
Python
Raw Permalink Normal View History

import random
from utils import AlphabetUtils as au
from utils import CipherUtils as cu
def encrypt_text(cleartext: str, key: [int]) -> str:
"""
Encrypts the given text with the given key
:param cleartext: The text to encrypt
:param key: The key to use. Has to be a list of indices of the alphabet, so [0...25] shuffled
:return: The encrypted text
"""
cleartext = cu.transform_invalid_chars(cleartext)
resulting = ''
for char in cleartext:
2021-10-15 15:57:35 +00:00
char_index = au.get_index_of_letter(char)
cipher_index = key.index(char_index)
cipher_char = au.get_letter_at_index(cipher_index)
resulting += cipher_char
return resulting
def decrypt_text(ciphertext: str, key: [int]) -> str:
"""
Decrypts the given ciphertext with the given key
:param ciphertext: The text to decrypt
:param key: The key to use. Has to be a list of indices of the alphabet, so [0...25] shuffled
:return: The decrypted text
"""
resulting = ''
for char in ciphertext:
2021-10-15 15:57:35 +00:00
char_index = au.get_index_of_letter(char)
clear_index = key[char_index]
clear_char = au.get_letter_at_index(clear_index)
resulting += clear_char
return resulting
def generate_key() -> [int]:
"""
Generates a key that can be used for this cipher.
:return: The key as a list of indices
"""
indices = [i for i in range(26)]
random.shuffle(indices)
return indices
2021-10-15 15:57:35 +00:00
def generate_key_with_keyword(keyword: str) -> [int]:
"""
Generates a key that can be used for this cipher by using the given keyword as a starting point
:param keyword: The keyword to use to generate the key
:return: The key as a list of indices
"""
result = []
for char in keyword:
2021-10-15 15:57:35 +00:00
char_index = au.get_index_of_letter(char)
if char_index not in result:
result.append(char_index)
2021-10-15 15:57:35 +00:00
remaining_indices = [i for i in range(26 - len(result))]
2021-10-15 15:57:35 +00:00
result.extend(remaining_indices)
return result
2021-10-15 15:57:35 +00:00
if __name__ == '__main__':
key = generate_key_with_keyword('patrick')
print(key)
encrypted = encrypt_text('BonkRocks', key)
print(encrypted)
print(decrypt_text(encrypted, key))