def play(): """ Asks the user what cipher he wants to use, in order to encrypt or decrypt a text message. Gives user the option to return the cipher text in 5 characters blocks. Asks user for different input based on cipher selection. Adds a onetime pad as an additional security layer. If encrypting: Returns cipher text encrypted with the chosen cipher and onetime pad. If decrypting: Returns text decrypted with the chosen cipher and onetime pad. """ working = True cipher_choice = True enc_dec = True letters = string.ascii_uppercase while working: clear_screen() print( "This is the Secret Messages project for the Treehouse Techdegree. \n" "These are the current available ciphers: \n" "- Affine \n" "- Atbash \n" "- Caesar \n" "- Keyword \n" "- Type (Q) to quit. \n") while cipher_choice: choice = input( "Type the name of the cipher would you like to use? \n") if choice.upper() == 'Q': exit() elif choice.upper() == 'AFFINE': cipher = Affine() break elif choice.upper() == 'ATBASH': cipher = Atbash() break elif choice.upper() == 'CAESAR': cipher = Caesar() break elif choice.upper() == 'KEYWORD': cipher = Keyword() break else: print('Type the name of any available cipher. \n') user_text = input('What is your message?(Letters only) \n') while enc_dec: e_or_d = input('Are we going to encrypt or decrypt? \n') if e_or_d.upper() == 'ENCRYPT' and isinstance(cipher, Affine): alpha, beta = get_keys() ot_pad = input('Type your one time pad. \n') ot_val = cipher.one_time_pad(user_text, ot_pad) value = cipher.encrypt(ot_val, alpha, beta) block_choice = yes_or_no() if block_choice.upper() == 'Y': value = cipher.add_padding(value) print(value + '\n') repeat() break else: print(value + '\n') repeat() break elif e_or_d.upper() == 'DECRYPT' and isinstance(cipher, Affine): alpha, beta = get_keys() ot_pad = input( 'Type your one time pad, must be the same used for encrypting. \n' ) block_choice = y_o_n() if block_choice.upper() == 'Y': no_block = cipher.remove_padding(user_text) value = cipher.decrypt(no_block, alpha, beta) ot_val = cipher.one_time_pad(value, ot_pad, encrypt=False) print(ot_val + '\n') repeat() break else: value = cipher.decrypt(user_text, alpha, beta) ot_val = cipher.one_time_pad(value, ot_pad, encrypt=False) print(ot_val + '\n') repeat() break elif e_or_d.upper() == 'ENCRYPT' and isinstance(cipher, Atbash): ot_pad = input('Type your one time pad. \n') ot_val = cipher.one_time_pad(user_text, ot_pad) value = cipher.encrypt(ot_val) block_choice = yes_or_no() if block_choice.upper() == 'Y': value = cipher.add_padding(value) print(value + '\n') repeat() break else: print(value + '\n') repeat() break elif e_or_d.upper() == 'DECRYPT' and isinstance(cipher, Atbash): ot_pad = input( 'Type your one time pad, must be the same used for encrypting. \n' ) block_choice = y_o_n() if block_choice.upper() == 'Y': no_block = cipher.remove_padding(user_text) value = cipher.decrypt(no_block) ot_val = cipher.one_time_pad(value, ot_pad, encrypt=False) print(ot_val + '\n') repeat() break else: value = cipher.decrypt(user_text) ot_val = cipher.one_time_pad(value, ot_pad, encrypt=False) print(ot_val + '\n') repeat() break elif e_or_d.upper() == 'ENCRYPT' and isinstance(cipher, Caesar): ot_pad = input('Type your one time pad. \n') ot_val = cipher.one_time_pad(user_text, ot_pad) value = cipher.encrypt(ot_val) block_choice = yes_or_no() if block_choice.upper() == 'Y': value = cipher.add_padding(value) print(value + '\n') repeat() break else: print(value + '\n') repeat() break elif e_or_d.upper() == 'DECRYPT' and isinstance(cipher, Caesar): ot_pad = input( 'Type your one time pad, must be the same used for encrypting. \n' ) block_choice = y_o_n() if block_choice.upper() == 'Y': no_block = cipher.remove_padding(user_text) value = cipher.decrypt(no_block) ot_val = cipher.one_time_pad(value, ot_pad, encrypt=False) print(ot_val + '\n') repeat() break else: value = cipher.decrypt(user_text) ot_val = cipher.one_time_pad(value, ot_pad, encrypt=False) print(ot_val + '\n') repeat() break elif e_or_d.upper() == 'ENCRYPT' and isinstance(cipher, Keyword): ot_pad = input('Type your one time pad. \n') keyword_choice = get_keyword() ot_val = cipher.one_time_pad(user_text, ot_pad) value = cipher.encrypt(ot_val, keyword_choice) block_choice = yes_or_no() if block_choice.upper() == 'Y': value = cipher.add_padding(value) print(value + '\n') repeat() break else: print(value + '\n') repeat() break elif e_or_d.upper() == 'DECRYPT' and isinstance(cipher, Keyword): ot_pad = input( 'Type your one time pad, must be the same used for encrypting. \n' ) block_choice = y_o_n() keyword_choice = get_keyword() if block_choice.upper() == 'Y': no_block = cipher.remove_padding(user_text) value = cipher.decrypt(no_block, keyword_choice) ot_val = cipher.one_time_pad(value, ot_pad, encrypt=False) print(ot_val + '\n') repeat() break else: value = cipher.decrypt(user_text, keyword_choice) ot_val = cipher.one_time_pad(value, ot_pad, encrypt=False) print(ot_val + '\n') repeat() break