From 2c13980f4cfb5e0111a73d22cddc9e82cb777848 Mon Sep 17 00:00:00 2001 From: KKlochko Date: Mon, 27 Nov 2023 14:56:08 +0200 Subject: [PATCH] Add the simple CLI interface. --- cryptography_s_des_exploring/cli.py | 95 +++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 cryptography_s_des_exploring/cli.py diff --git a/cryptography_s_des_exploring/cli.py b/cryptography_s_des_exploring/cli.py new file mode 100644 index 0000000..d9af2aa --- /dev/null +++ b/cryptography_s_des_exploring/cli.py @@ -0,0 +1,95 @@ +import random +from rich.console import Console +from rich.prompt import Confirm, Prompt, IntPrompt +from rich.markdown import Markdown + +from cryptography_s_des_exploring.sdes.decrypt import decrypt +from cryptography_s_des_exploring.sdes.encrypt import encrypt + + +def yes_no_prompt(question: str) -> bool: + return Confirm.ask(question) + + +def cli_generate_keys(console): + KEY_LENGTH = 10 + key = ''.join(random.choice('01') for _ in range(KEY_LENGTH)) + + console.print(f"[yellow b]The key:[/] {key}\n") + + +def cli_key_input(console): + while True: + key = Prompt.ask(f"[b]Enter the [yellow]key[/]", password=True) + + if len(key) == 10 and len(key.replace('0', '').replace('1', '')) == 0: + return key + + console.print( + "[red b][Error] THE KEY MUST BE 10 CHARACTERS LONG AND CONTAIN ONLY 1 OR 0 SYMBOLS!!![/]\n" + ) + + +def cli_encrypt_message(console): + key = cli_key_input(console) + + message = Prompt.ask(f"[b]Enter the [yellow]message[/]") + + ciphertext = encrypt(key, message) + + console.print(f"[yellow b]The ciphertext:[/] \"{ciphertext.decode('utf-8')}\"\n") + + +def cli_decrypt_message(console): + key = cli_key_input(console) + + ciphertext = Prompt.ask(f"[b]Enter the [yellow]ciphertext[/]") + + message = decrypt(key, ciphertext) + + console.print(f"[yellow b]The message:[/] \"{message}\"\n") + + +COMMANDS = """ +0. Help +1. Generate a key. +2. Encrypt a message +3. Decrypt a message +4. Exit + +""" + +HELP = """ +# cryptography-s-des-exploring + +cryptography-s-des-exploring is the application that will help you to learn about the S-DES cipher. + +## Commands + +""" + + +def help(console): + console.print(Markdown(HELP + COMMANDS)) + console.print("\n") + + +def cli(): + console = Console() + choices = list(map(str, range(0, 5))) + + while True: + console.print(f"Commands:\n{COMMANDS}") + option = Prompt.ask("Choose the command:", choices=choices, default="0") + match option: + case "0": + help(console) + case "1": + cli_generate_keys(console) + case "2": + cli_encrypt_message(console) + case "3": + cli_decrypt_message(console) + case "4": + break +