Caesar Cipher decode not working - python

I am trying to get the Caesar cipher working, I can get the encode, but not the decode without using -shift. I think it might be while True, tied with little success
Thanks all in advance
def helper(message, shift):
message = message.lower()
secret = ""
for c in message:
if c in "abcdefghijklmnopqrstuvwxyz":
num = ord(c)
num += shift
if num > ord("z"): # wrap if necessary
num -= 26
elif num < ord("a"):
num += 26
secret = secret + chr(num)
else:
# don't modify any non-letters in the message; just add them as-is
secret = secret + c
return secret
# Encrypts the given string using a Caesar cipher and returns the result.
def encrypt(message):
return helper(message, x)
# Decrypts a string that was previously encrypted using a Caesar cipher and returns the result.
def decrypt(message):
return helper(message, x)
t=input('e or d ')
msg = input("Your message to encode? ")
x = int(input('no '))
if len (msg) > 0:
# wants to encrypt
secret = encrypt(msg)
print("The encoded message is:", secret)
else:
# empty message; wants to decrypt
secret = input("Your message to decode? ")
if len(secret) > 0:
msg = decrypt(secret)
print("The decoded message is:" ,msg)

Decryption should shift in the opposite direction of encryption.
def decrypt(message):
return helper(message, -x)
Now you can decrypt and encrypt with the same cipher number.
x = 5
msg = "hello"
print("plaintext message:", msg)
print("encrypted message:", encrypt(msg))
print("decrypted message:", decrypt(encrypt(msg)))
Result:
plaintext message: hello
encrypted message: mjqqt
decrypted message: hello

Related

Create encryption and decryption program

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.

My program runs but it doesn't output an Encrypted Message

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

Moving a string forward in the alphabet?

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!")

Caesar Cipher issue

I am trying to implement a Caesar cipher.
I have tried to return message in the function, but I get an error message (outside function). Can anyone help, please?
Thanks in advance
cat
cate
catec
catecv
message = input("type message ")
shift = int(input("Enter number to code "))
message = message.lower() #convets to lower case
print (message)
for a in message:
if a in "abcdefghijklmnopqrstuvwxyz":
number = ord(a)
number += shift
if number > ord("z"):
number -= 26
elif number < ord("a"):
number += 26
message = message + (chr ( number))
print (message)
Here's Python 3 Caesar cipher implementation that uses str.translate():
#!/usr/bin/env python3
import string
def caesar(plaintext, shift, alphabet=string.ascii_lowercase):
shifted_alphabet = alphabet[shift:] + alphabet[:shift]
return plaintext.translate(plaintext.maketrans(alphabet, shifted_alphabet))
message = input("type message to encode")
shift = int(input("Enter number to code "))
print(caesar(message.lower(), shift))
Here's Python 2 version of Caesar Cipher.

Python Vigenere Code repeating error

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)

Categories

Resources