The code I wrote is a Vignere Cipher encryption program that uses a keyword to encrypt a message. I wrote this code and when I finished it I ran it and it did all it was supposed to but output the encrypted message. See my code below, any help is gratefully received:
ans = False
print(""" *****Hello. Welcome to the Vignère Cipher Encryption Program*****
***This program uses a keyword that is repeated until it
matches the same lenght of the message and then adds its
numerical value to the numerical value of the message and
outputs the encrypted message in alpha.
Please press:
E to Encrypt
D to Decrypt
or double tap enter to quit.
""")
ans=input("What would you like to do now???")
if ans == "E":
plaintext = input("Please enter a message to be encrypted: ").upper()
keyword = input("Please enter a keyword to be used to encrypt a message (alpha only): ").upper()
ciphered = " "
for i in range (len(plaintext)):
char = plaintext[i]
alphakeywordvalue = ord(keyword[i%len(keyword)]) - ord("A")+1
if char.isupper():
if ans == "E" :
value = ord(char) + alphakeywordvalue
if value > ord("Z"):
value -= 26
print ("Your encrypted text is:", ciphered)
elif ans == "D":
plaintext = input("Please enter a message to be dencrypted: ").upper()
keyword = input("Please enter a keyword to be used to dencrypt a message (alpha only(make sure that it is the same keyword used to encrypt the message)): ").upper()
ciphered = " "
for i in range (len(plaintext)):
char = plaintext[i]
alphakeywordvalue = ord(keyword[i%len(keyword)]) - ord("A")+1
if char.isupper():
if ans == "D" :
value = ord(char) - alphakeywordvalue
if value <ord("A"):
value += 26
ciphered += chr(value)
print ("Your decrypted text is:", ciphered)
This is not a good style of writing code. Very shabby and hard to read. You should make methods for individual parts and create a separate main() like section to interact with the user, if required. Engine should be hidden, car body should be polished. Keep them separate. And yes, DO NOT REPEAT YOURSELF
Well, here's my re-written code. Important parts contain the comments. Errors are explained after it..
def encrypt(message, key, direction='E'):
# Look here. There are three arguments. Third one takes 'E' to encrypt
# and anything else to decrypt. You can modify to handle more cases
ciphered = "" # Initialize. You did it almost well
for i in range (len(message)):
char = message[i]
alphakeywordvalue = ord(key[i%len(key)]) - ord("A")+1 # Perfect. We took the key
if direction=='E': # To encrypt
value = ord(char) + alphakeywordvalue
else: # To decrypt
value = ord(char) - alphakeywordvalue
ciphered += chr(value) # chr is the inverse of ord. It gets the character back
# You missed this line
return ciphered
That's it. Now you can write the code to interact with user or other modules. Here's a sample test:-
message = "Hello World"
key = "abc"
print "ORIGINAL : "+message
encoded_message = encrypt(message, key, 'E')
print "ENCRYPTED : "+encoded_message
plain_message = encrypt(encoded_message, key, 'D')
print "DECRYPTED : "+plain_message
Here's the output:
Now you can edit this method to handle more cases like out of ascii range characters etc.
How could it print the encrypted message, the encryption routine never changes ciphered from an empty string.
if ans == "E":
plaintext = input("Please enter a message to be encrypted: ").upper()
keyword = input("Please enter a keyword to be used to encrypt a message (alpha only): ").upper()
1)-> ciphered = " "
for i in range (len(plaintext)):
char = plaintext[i]
alphakeywordvalue = ord(keyword[i%len(keyword)]) - ord("A")+1
2)-> if char.isupper():
3)-> if ans == "E" :
value = ord(char) + alphakeywordvalue
if value > ord("Z"):
value -= 26
4)-> print ("Your encrypted text is:", ciphered)
ciphered set to empty string, is never changed.
You always know char is upper, because you made all the plaintext upper()
You know ans == "E" because you tested it earlier
This print() is so far indented it tries to print every time through the loop
Related
I need someone to edit my code to debug it. It won't display any of the encrypted or decrypted text which I think is because the formatting is messed up but I don't know. If you could help that'd be greatly appreciated. (I have to include functions and user input)
result = ''
text = ''
text = input("Do you want to encrypt or decrypt the message?\n 1 to encrypt, 2 to decrypt or 0 to exit program. ")
def toList(text):
text.split()
return text
decrypted = b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ "
encrypted = b"qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM "
encrypt_table = bytes.maketrans(decrypted, encrypted)
decrypt_table = bytes.maketrans(encrypted, decrypted)
text = input('Enter message for encryption: ')
def encrypt(text):
result = ''
text = ''
result = text.translate(encrypt_table)
print(result + '\n\n')
cipherText = input('Enter message to decrypt: ')
def decrypt(cipherText):
result = ''
message = ''
result = message.translate(decrypt_table)
print(result + '\n\n')
if text == '1':
encrypt(text)
print(result + '\n\n')
elif text == '2':
decrypt(cipherText)
elif text != '0':
print('You have entered an invalid input, please try again. \n\n')
You had quite a number of confusions. Look at encrypt, for example. You pass in text, then you immediately set text='', thereby destroying the message that was input. Similarly, in decrypt, you pass in cipherText, but you run message.translate. And your functions need to return their results, not print them. Let the caller decide what to do with the returned results.
Also, it is a good practice to collect your functions at the top of the module, so you don't fool yourself into believing that things get called in the wrong order.
Here is your code, modified so that it works:
def encrypt(text):
result = text.translate(encrypt_table)
return result
def decrypt(message):
result = message.translate(decrypt_table)
return result
decrypted = b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ "
encrypted = b"qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM "
encrypt_table = bytes.maketrans(decrypted, encrypted)
decrypt_table = bytes.maketrans(encrypted, decrypted)
while True:
text = input("Do you want to encrypt or decrypt the message?\n 1 to encrypt, 2 to decrypt or 0 to exit program. ")
if text == '1':
text = input('Enter message for encryption: ')
result = encrypt(text)
print(result)
elif text == '2':
cipherText = input('Enter message to decrypt: ')
result = decrypt(cipherText)
print(result)
elif text == '0':
break
else:
print('You have entered an invalid input, please try again. \n\n')
Note that encrypt and decrypt don't really need to store in a temporary variable. The only reason to do that is because it is more convenient for debugging, to add a quick print(result) before the return.
I'm new to Python. This is my 3rd project and I'm facing to some obstacles. Here I have a Caesar cipher project. It seems to do everything I needed it to do that accepts only capital letters, no special characters, no lower case letters, no spaces.
However, I have two issues:
It MUST only accept numbers that range from 1 to 26. Unfortunately, it's also accepting numbers that are even higher than 26.
Regardless of a key size it only shifts letters by 1 digit. Ideally, it must shift the letters according to entered key size:
this is where problem(s) occurring
It would be tremendous help if anyone could provide a solution or give suggestions to fix above issues. Thank you so much for your time and attention!
Here is my code:
MAX_NUMBER_KEY = 26
def getMode():
while True:
print('Please make your selection from the following "E" for encryption or "D" for decryption:')
mode = raw_input()
if mode in 'E D'.split():
return mode
else:
print('Error! Please try again and make sure to choose only "E" or "D"!')
def getText():
while True:
print('Enter your text that you would like to encrypt or decrypt:')
text = raw_input()
if text.isalpha() and text.isupper():
return text
else:
print('Error! No spaces, no special characters or numbers! Please only use letters!')
def getKey():
key = 0
while True:
print('Enter your number key for "K" (1-%s)' % (MAX_NUMBER_KEY))
key = int(raw_input().isdigit())
if (key >= 1 and key <= MAX_NUMBER_KEY):
return key
else:
print('Error! Please try again and choose only numbers between (1-26)!')
def getEncryptedMessage(mode, text, key):
if mode[0] == 'D':
key = -key
encrypted = ''
for each in text:
if each.isalpha():
num = ord(each)
num += key
if each.isupper():
if num > ord('Z'):
num -= 26
elif num < ord('A'):
num += 26
encrypted += chr(num)
else:
encrypted += each
return encrypted
mode = getMode()
message = getText()
key = getKey()
print('Your encrypted message is:')
print(getEncryptedMessage(mode, message, key))
In getKey(), raw_input().isdigit() returns a boolean, so by casting it to an int, you are going to be doing int(True) or int(False) which is 1 and 0 respectively.
This code is meant to encrypt and decrypt using the Vigenere Cipher technique and when I choose encryption and enter my key word and text the outcome is a bunch of foreign characters printed one at a time on individual lines like this:
L
Lo
lou and so on. And additionally when I choose decryption the printed result is an error stating the 'print index is out of range'. Both of these errors I do not know how to solve, any help I would be greatly appreciative for.
#encryption
def encrypt():
crypt = ''
key_phrase = raw_input("Please enter a key phrase to encrypt by: ")
key_text = raw_input("Please enter a piece of text to encrypt: ")
if len(key_text) == 0:
print("Key must be of length 1 or more."); exit()
if not key_text.isalpha() or not key_phrase.isalpha():
print("Both text and key must be composed of letters only."); exit()
for letters in range(0, len(key_text)):
new = ord(key_text[letters]) + ord(key_text[letters%len(key_text)]) - 65
if new > 90:
new -= 26
crypt += chr(new)
print crypt
#decryption
def decrypt():
decrypt = ''
_key_phrase = raw_input("Please enter a key phrase to decrypt by: ")
_key_text = raw_input("Please enter a piece of text to include: ")
if len(_key_text) == 0:
print("Key must be of length 1 or more."); exit()
if not _key_text.isalpha() or not _key_phrase.isalpha():
print("Both text and key must be composed of letters only."); exit()
for letters in range(0, len(_key_text)):
new = ord(_key_phrase[letters]) - ord(_key_text[letters%len(_key_text)]) + 65
if new < 65:
new += 26
decrypt == chr(new)
print decrypt
#asking the user to enter a or b for en/decryption
choice = raw_input("Please enter either 'a' for encryption or 'b' for decryption: ")
if choice == 'a':
print encrypt()
else:
print decrypt()
You use ASCII codes for upper case but your key and text are in lower case.
Possible solutions:
Use upper case for key and text during input.
Set key and text to upper case by key_phrase = key_phrase.upper()
Use ASCII code for lower case not for upper case. e.g. range from 97 to 122, not 65 to 90.
This will work (though it is not the best solution):
in encrypt:
key_phrase = raw_input("Please enter a key phrase to encrypt by: ")
key_phrase = key_phrase.upper()
key_text = raw_input("Please enter a piece of text to encrypt: ")
key_text = key_text.upper()
in decrypt:
_key_phrase = raw_input("Please enter a key phrase to decrypt by: ")
_key_phrase = _key_phrase.upper()
_key_text = raw_input("Please enter a piece of text to include: ")
_key_text = _key_text.upper()
I have been asked just as a challenge to create a program of which encrypts an input. I have looked into creating a program but there isn't much around on how to do it. It seems like it shouldn't be too complicated, but I haven't been taught any of it in my lessons. I read this post too Get character position in alphabet but didn't have much luck! I have this so far:
import sys
import os
import time
import string
def Cryption():
####################
encrypt = 'encrypt'
decrypt = 'decrypt'
####################
s = raw_input("Would you like to encrypt or decrypt? Enter your answer")
if encrypt in s:
print("Loading encryption sector...")
time.sleep(2)
enc = raw_input("Please input the string you would like to encrypt")
print ("Your decrypted word is: " + enc)
if decrypt in s:
print("Loading decryption sector...")
time.sleep(2)
dec = raw_input("Please input the string you would like to decrypt")
else:
print("Your input was invalid, please re-enter your choice!")
r = raw_input("Press enter to restart your program")
Cryption()
Cryption()
I was thinking if I took the input added 5 onto each letter value then re-printed the product. Which functions would I use to add 5 onto the order in the alphabet? ord()? And if so could someone point me in the direction of how to use it? Thanks in advance!
import string
def encrypt_s(shift):
lower = string.ascii_lowercase
# shift forward current index of each character + the shift
dict_map = {k:lower[(lower.index(k)+shift)%26] for k in lower}
return dict_map
def decrypt_s(shift):
lower = string.ascii_lowercase
# shift forward current index of each character - the shift to get original string
dict_map = {k:lower[(lower.index(k)-shift)%26] for k in lower}
return dict_map
def Cryption():
####################
encrypt = 'encrypt'
decrypt = 'decrypt'
####################
s = raw_input("Would you like to encrypt or decrypt? Enter your answer")
if encrypt in s:
print("Loading encryption sector...")
time.sleep(2)
enc = raw_input("Please input the string you would like to encrypt").lower()
enc_s = encrypt_s(5)
enc = "".join([enc_s[char] if char in enc_s else char for char in enc])
print ("Your encrypted word is: ",enc)
elif decrypt in s:
print("Loading decryption sector...")
time.sleep(2)
dec = raw_input("Please input the string you would like to decrypt").lower()
dec_s = decrypt_s(5)
dec = "".join([dec_s[char] if char in dec_s else char for char in dec])
print ("Your decrypted word is: ",dec)
else:
print("Your input was invalid, please re-enter your choice!")
We have to do a vigenere cipher for a project, and my code just keeps repeating itself. Like it wont run the encrypt or decrypt.
here is my code.
like this is what it does for an example..
"Hey There user!
whats your message??hi
How many letters are in the message?2
Do you want to decrypt or encrypt?decrypt
Lets decrypt your message!!
Do you want to decrypt or encrypt?"
print "Hey There user!"
def vig():
dore = raw_input("Do you want to decrypt or encrypt?")
if "decrypt" in dore:
print "Lets decrypt your message!!"
else:
print "lets encrypt your message!!"
def dore(message):
encrypt = ''
decrypt = ''
if "encrypt" in vig():
for i in range(0, len(message)):
e = ord(message[i]) + ord(key[i%len(key)]) - 65
if e > 90:
e -= 26
encrypt += chr(e)
print encrypt
if "decrypt" in vig():
e = ord(message[i]) - ord(key[i%len(key)]) + 65
if e < 65:
e += 26
decrypt += chr(e)
print decrypt
####################################
###########################################:)#####
message = raw_input("whats your message??")
key = raw_input("How many letters are in the message?")
vig()
dore(message)
message = message
encrypt = ''
decrypt = ''
One of the first things you do in dore is call vig again:
if "encrypt" in vig():
Try separating encryption and decryption into two functions and calling them accordingly:
def vig(message):
ui = raw_input("Encrypt or decrypt? ").lower()
if "decrypt" in ui:
return decrypt(message)
else:
return encrypt(message)
Also, the user doesn't need to enter the length of the message, just do:
key = len(message)