2

I am needing a bit of help on my encryption program. Instead of having the program just move the letters by two (c would become a or r would become p) I'd like to be able to have it reference 2 lists, the first one going from a-z normally and the other with letters in different order to act as the encrypt/decrypt side. Hopefully that makes sense. Here's what i have so far.

result = ''
choice = ''
message = ''

while choice != 0:
    choice = input("\n Do you want to encrypt or decrypt the message?\n 1 to encrypt, 2 to decrypt or 0 to exit program. ")

    if choice == '1':
        message = input('\nEnter message for encryption: ')
        for i in range(0, len(message)):
            result = result + chr(ord(message[i]) - 2)

        print(result + '\n\n')
        result = ''

    if choice == '2':
        message = input('\nEnter message to decrypt: ')
        for i in range(0, len(message)):
            result = result + chr(ord(message[i]) + 2)

        print(result + '\n\n')
        result = ''

    elif choice != '0':
        print('You have entered an invalid input, please try again. \n\n')

This works fine and dandy but i'd like to have the lists. Lets say list 1 is A,B,C,D,E and list 2 would be W,N,U,D,P. just for ease of use purposes.

2
  • To solve this particular problem, look up the str.maketrans() method (or bytes.maketrans() if you are in Python 3.6). Commented Apr 19, 2017 at 20:08
  • i'll give it my best. thank you for the help. Commented Apr 20, 2017 at 0:01

4 Answers 4

3

Here is a solution, for small letters only. It can easily be modified to handle also capital letters, by adding them to the text strings.

As can be seen, the space character is at the same position in both lists. This is not necessary, as any character can be translated to any other. However if the decrypted or encrypted is not containing unique characters only, the program will break down.

decrypted = b"abcdefghijklmnopqrstuvwxyz "
encrypted = b"qwertyuiopasdfghjklzxcvbnm "

encrypt_table = bytes.maketrans(decrypted, encrypted)
decrypt_table = bytes.maketrans(encrypted, decrypted)

result = ''
choice = ''
message = ''

while choice != '0':
    choice = input("\n Do you want to encrypt or decrypt the message?\n 1 to encrypt, 2 to decrypt or 0 to exit program. ")

    if choice == '1':
        message = input('\nEnter message for encryption: ')
        result = message.translate(encrypt_table)
        print(result + '\n\n')

    elif choice == '2':
        message = input('\nEnter message to decrypt: ')
        result = message.translate(decrypt_table)
        print(result + '\n\n')

    elif choice != '0':
        print('You have entered an invalid input, please try again. \n\n')
Sign up to request clarification or add additional context in comments.

4 Comments

Hi, thank you for taking the time to help me. I tried to run your code but i encountered this: AttributeError: module 'string' has no attribute 'maketrans'. I'm not sure what this means.
My code was for python 2. I guess you are running python 3. I have now updated the example, to work for python 3 instead. Please try the modified version.
Thanks again, i was able to get it to work by changing the string.maketrans to str.maketrans. i'm still having one little minor issue, when i enter text for the encrypt part i get the desired output (the message appears encrypted) but it always says 'you have entered an invalid input, please try again' So im trying to figure out how to make that not happen. Do you think i should try adjusting the while portion or would it be something with the elif portion?
That issue was due to having two independent if conditions, making the second one false if the first was true. It is simply fixed by changing the second if to an elif as I have done in the updated code. (I only copied your code for the while loop before.)
1

Ok, so a few things here...

First I'll give you exactly what you were looking for and explain what I used and some of the changes that needed to be made to your original code. Then I'll explain some inherent issues what what you're trying to do and suggest some areas to read up on/some ways you might want to improve what you've got.

Here's the code you're looking for (while retaining the same flow as what you submitted put above):

import random

result = ''
choice = ''
message = ''

characters_in_order = [chr(x) for x in range(32,127)]

while choice != 0:
    choice = input("\n Do you want to encrypt or decrypt the message?\n 1 to encrypt, 2 to decrypt or 0 to exit program. ")

    if str(choice) == '1':
        message = input('\nEnter message for encryption: ')
        
        r_seed = input('Enter an integer to use as a seed: ')
        random.seed(r_seed)
        shuffled_list = [chr(x) for x in range(32,127)]
        random.shuffle(shuffled_list)

        for i in range(0, len(message)):
            result += shuffled_list[characters_in_order.index(message[i])]

        print(result + '\n\n')
        result = ''

    elif str(choice) == '2':
        message = input('\nEnter message to decrypt: ')

        r_seed = input('Enter an integer to use as a seed (should be the same one used to encrypt): ')
        random.seed(r_seed)
        shuffled_list = [chr(x) for x in range(32,127)]
        random.shuffle(shuffled_list)

        for i in range(0, len(message)):
            result += characters_in_order[shuffled_list.index(message[i])]

        print(result + '\n\n')
        result = ''

    elif str(choice) != '0':
        print('You have entered an invalid input, please try again. \n\n')

You'll notice that I set a global 'characters in order' list, which is just every ASCII character (32-126) in order. I also imported the 'random' module and used this to shuffle the characters in order according to a seed that the user inputs. As long as this seed is the same on the encryption and decryption end, it will produce the same shuffled list and it should work to encrypt or decipher the same string. Also notice the str() around your input choices. Without that, the user had to input '1', rather than 1 to submit a choice without an error.

All of that said...

  1. Notice that the way the new function works is by looking at a character's index in one list and pulling out the character at that index in another. The method you were using, of incrementing or decrementing a character's ASCII code is basic (though not much more basic than this), but it also has a pretty critical flaw, which is that characters on one end or another of the ASCII set wouldn't return ASCII characters. If you were encrypting it at a bit-level, which would be preferred, this wouldn't matter/would be irrelevant, but here you're not going to get the kind of string back that you want if you were to, for example, enter a [space] (ASCII 32) into your plaintext to be encrypted.
  2. If you're interested, you might want to read up on symmetric key encryption/DES for some ideas on how encryption is really done, though props on the start/interest and this can certainly be a fun way to create some sort of cryptogram puzzle or something along those lines. I won't pretend to be any kind of expert, but I can at least point you in the write direction. (https://en.wikipedia.org/wiki/Data_Encryption_Standard https://en.wikipedia.org/wiki/Symmetric-key_algorithm)
  3. Consider having your code read in a .txt file and print out to a .txt file, rather than using user input for the message.

Again, I'm not an expert by any means and there are definitely some fun uses of the kind of program you're aiming for, just trying to point you in the right direction if this is something that you're interested in. Hope all of that is helpful!

2 Comments

Thank you for all of the help. I've been trying to get lists to work but can't seem to get the hang of it. If i show you the two lists do you think you can help me out some more? the first list is just a-z but the second list is all mixed up. The seed offset thing you did is really cool though. It's way advanced for me though, i'm very new to this and haven't seen anything like that mentioned in my book i'm using. Again thank you for all of the help.
Hi the guy below helped me out, thank you for everything you did though, it came in very handy. The two of you guys really helped me understand this. Thanks a bunch.
0

Here is my solution. It uses a randomizer to encrypt the file by assigning a ASCII value to the plain text and randomly shifts it around.

from random import randint
import sys
def menu():
    input1=int(input(""" please select what you want to do: 
1.Encrypt
2.Decrypt              
3.Extended Encryption
4.exit
"""))#menu to choose what you want to do
    if input1==1:
        encrypt()   #takes you to the encrypt function  
    elif input1==2:
        decrypt()#takes you to the decrypt function
    elif input1==3:
        enxtended()#takes you to the extended encryption function
    elif input1==4:
        sys.exit #exits the program
    else:
        print("invalid entry try again")
        menu()

def encrypt():
   file_name=str(input("please enter the name of the file that you want to open\n"))
   try:
       text_file=open(file_name + ".txt","r")#puts the text file into read
       text_file=text_file.read()#reads the text file
       print(text_file)#prints the strings in the document
   except:
        print("error try again")
        encrypt()
   random(text_file)

def random(text_file):
    list1=("")#creates blank string
    for x in range (0,8):
        num=(randint(33,126))#generates a random number between33 and 126
        ascii1=chr(num) #converts it into an ascii character
        list1=list1+ascii1#adds the ascii character to the blank string list1
    print (f"your 8 key code is {list1}") #prints 8 character code       
    offset(list1,text_file) 

def offset(list1,text_file):
    total=0
    for x in range (8,):
        total=total+ord(list1[x]) #turns each character into an ascii value       
    total=total/8 #divides it by
    total=round(total,0)#rounds it to 0 decimel places
    print(total)
    total=total-32#minuses 32 from total
    print(f"your offset factor is {total}")
    encrypting(total,text_file)
def encrypting(total,text_file):
    length=len(text_file)
    string1=("")    
    for x in range (length,):
        numascii=ord(text_file[x])#turns the characters into its ascii value
        numascii=int(numascii)#makes sure they are integers
        if numascii==32:
            letter=chr(32)#converts spaces back into spaces
            string1=string1+letter#adds space to thestring
        else:
            numascii1=numascii+total#adds the character value to the offset factor
            numascii1=int(numascii1)#makes sure it is an integer
            if numascii1>126:# if the ascii value is great then 126 
               numascii1=numascii1-94#minus 94 from it
               letter=chr(numascii1)#turn it into a character
               string1=string1+letter#add it to the string
            else:
                letter=chr(numascii1)#turn the ascii value into a character
                string1=string1+letter#add it to the string          
    print(f"your encrypted file is {string1}")
    savefile(string1)
menu()

1 Comment

The point of StackOverflow is to teach, not just to write code for people. While I appreciate that you spent a lot of effort on these answers, they aren't helpful for anyone else unless you explain what they do and why one should use this approach over the others that have been posted.
0

I have written separate programs for encryption and decryption. Both of these use file manipulation techniques. Use the username 'eggs' and password 'chicks' so that not anyone can see my secret code. I have used hashlib for more security. Just change the User 'Soumajit' to your respective Username to make it work. The first one is encryption and the next one is for decryption.

#ENCRYPTION 

from time import sleep
import subprocess
import hashlib

def copy2clip(txt):
    cmd='echo '+txt.strip()+'|clip'
    return subprocess.check_call(cmd, shell=True)


def en():
    alphabet = "abcdefghijklmnopqsrtuwvxyzABCDEFGHIJKLMNOPQSRTUVWXYZ,./?:;!@#$%_&* ()`-+=1234567890"
    encrypt = ""
    decrypt = ""
    print
    print "Type y for yes and anything else for no"
    start = raw_input("Do you want to import file from desktop? ")
    if start == "y":
        Open = raw_input("Enter the .txt file you want to open in desktop: ")
        a = open("C://Users//Soumajit//Desktop//" + Open + ".txt", "r")
        print
        x = (a.read())
        copy2clip(x)
        a.close()
        print "Right click and select paste below to encrypt"
        print
        message = raw_input()
        for i in message:
            x = alphabet.find(i)
            new = (x - 5) % 74
            encrypt += alphabet[new]
            e2 = encrypt[::-1]
    else:
        print "Type your message below"
        message = raw_input("")
        for i in message:
            x = alphabet.find(i)
            new = (x - 5) % 74
            encrypt += alphabet[new]
            e2 = encrypt[::-1]

    print
    a = raw_input("By what name do you want to save it?: ")
    file = open(a + ".txt", 'wb')
    file.write(e2)
    file.close()
    copy = raw_input("Do you want to copy your file? ")
    if copy == 'y':
        copy2clip(e2)
        print 'Your encrypted file has been copied to the clipboard'
    else:
        print "Your encrypted file has been saved with the name " + str(a) + " in desktop"
        print "To decrypt it, use my other program"
    sleep(3)


u = 'e415bf03b4d860dccba57cea46371f831d772ba1deca47f28fa7d1f7'
p = 'c35f7f79dc34a678beb2b4106c84c9963561e7c64bc170e50c429b9a'
ur = raw_input('Enter your username: ')
ur1 = hashlib.sha224(ur).hexdigest()
pr = raw_input('Enter your password: ')
pr1 = hashlib.sha224(pr).hexdigest()
if ur1 == u and pr1 == p:
    print 'Access granted'
    sleep(1)
    en()
else:
    print "Incorrect username or password"
    sleep(1)

#DECRYPTION

from time import sleep
import subprocess
import hashlib

def copy2clip(txt):
    cmd='echo '+txt.strip()+'|clip'
    return subprocess.check_call(cmd, shell=True)


def de():
    print "Type y for yes and anything else for no"
    start = raw_input("Do you want to import file from desktop? ")
    if start == "y":
        Open = raw_input("Enter the .txt file you want to open from folder: ")
        a = open("C://Users//Soumajit//Desktop//" + Open + ".txt", "r")
        x = (a.read())
        #print x
        copy2clip(x)
        print "Right click and select paste below to decrypt"
        print
        message = raw_input()
        a.close()
        alphabet = "abcdefghijklmnopqsrtuwvxyzABCDEFGHIJKLMNOPQSRTUVWXYZ,./?:;!@#$%_&*()`-+=1234567890"
        decrypt = ''
        for i in message:
            x = alphabet.find(i)
            new = (x + 5) % 74
            decrypt += alphabet[new]
            d2 = decrypt[::-1]
            d3 = d2.replace("`", " ")
            final = d3.replace("2", " ")

        print
        print final
    else:
        print "Type or paste your encrypted text below"
        print
        message = raw_input()
        alphabet = "abcdefghijklmnopqsrtuwvxyzABCDEFGHIJKLMNOPQSRTUVWXYZ,./?:;!@#$%_&*()`-+=1234567890"
        decrypt = ''
        for i in message:
            x = alphabet.find(i)
            new = (x + 5) % 74
            decrypt += alphabet[new]
            d2 = decrypt[::-1]
            d3 = d2.replace("`", " ")
            final = d3.replace("2", " ")

        print
        print final

u = 'e415bf03b4d860dccba57cea46371f831d772ba1deca47f28fa7d1f7'
p = 'c35f7f79dc34a678beb2b4106c84c9963561e7c64bc170e50c429b9a'
ur = raw_input('Enter your username: ')
ur1 = hashlib.sha224(ur).hexdigest()
pr = raw_input('Enter your password: ')
pr1 = hashlib.sha224(pr).hexdigest()
if ur1 == u and pr1 == p:
    print 'Access granted'
    sleep(1)
    de()
    print
    end = raw_input('press q to quit: ')
    while end != 'q':
        print 'You did not type q'
        end = raw_input('press q to quit: ')
        if end == 'q':
            quit()
else:
    print 'Incorrect username or password'
    sleep(1)
    quit()

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.