hppylttletrees
hppylttletrees

Reputation: 39

how to write an encryption program in python

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.

Upvotes: 2

Views: 35671

Answers (4)

Auroni Bhattacharya
Auroni Bhattacharya

Reputation: 7

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()

Upvotes: 0

boi
boi

Reputation: 1

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()

Upvotes: 0

slearner
slearner

Reputation: 672

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!

Upvotes: 1

JohanL
JohanL

Reputation: 6891

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')

Upvotes: 3

Related Questions