开发者

Use substitution cipher in python to encrypt and decrypt a .txt file and output to a new .txt file

开发者 https://www.devze.com 2023-02-17 00:24 出处:网络
I am able to open the rules file and create a dictionary to use for my encryption.I have to also create a dictionary to use for decrypting text.I assume it\'s basically the same function with minor ch

I am able to open the rules file and create a dictionary to use for my encryption. I have to also create a dictionary to use for decrypting text. I assume it's basically the same function with minor changes. The encrypt works fine, but I can't get the decrypt to work. My second problem is that while I encrypted the file I took out all spaces and punctuation. I can't figure out how to get those back in the output file once I run the program. It just prints in a single column. Lastly I have to output this to a .txt file. I am able to create a .txt with a user assigned name, but can't get anything to print on the file.

Here is what I achieved so far.

#import clauses
import string


#function definitions



#encrypt dictionary
def createrulesdictencrypt(openFile):
    rulesencrypt1 = {}
    for line in openFile:
        rulessplit = string.split(string.strip(line))
        rulesencrypt1[rulessplit[0]] = rulessplit[1]
    return rulesencrypt1

#decrypt dictionary
def createrulesdictdecrypt(openFile):
    rulesdecrypt1 = {}
    for line in openFile:
        rulessplit = string.split(string.strip(line))
        rulesdecrypt1[rulessplit[1]] = rulessplit[0]
    return rulesdecrypt1

openFile = open('rules.txt', 'r')
rulesencrypt = createrulesdictencrypt(openFile)
rulesdecrypt = createrulesdictdecrypt(openFile)
#print rulesencrypt
#print r开发者_如何学Culesdecrypt




#function for encrypting file
def encryptfile(openFile2):
    for line in openFile2:
        for word in line.split():
            empty = ''
            for char in word:
                if char not in string.punctuation:
                    char=char.lower()
                    empty = empty+char 
                if len(empty) == 2:
                    print rulesencrypt[empty]
                    empty = ''
            if len(empty) == 1:
                print rulesencrypt[empty]



#function for decrypting file
def decryptfile(openFile2):
    for line in openFile2:
        for word in line.split():
            empty = ''
            for char in word:
                if char not in string.punctuation:
                    char=char.lower()
                    empty = empty+char 
                if len(empty) == 2:
                    print rulesdecrypt[empty]
                    empty = ''
            if len(empty) == 1:
                print rulesdecrypt[empty]


#main program

ende = raw_input("To encrypt a file, enter '0':\nTo decrypt a file, enter '1':")
filename = raw_input("Enter the name of the file to be processed:")
outfilename = raw_input("Enter the name of the file to save the result to:")
openFile2 = open(filename, 'r')
outputfile = open(outfilename, 'w')
fileencrypt = encryptfile(openFile2)
filedecrypt = decryptfile(openFile2)


if ende == "0":
    print encryptfile(fileencrypt)
if ende == "1":
    print decryptfile(filedecrypt)

This is what I am trying to encrypt

Sir Robin: "Oh, you liars!"

Minstrel: [singing] "Bravely taking to his feet, he beat a very brave retreat. A brave retreat by brave Sir Robin."


Your first problem is that you're not actually writing your encrypted text to a file, instead you're just printing it to sys.stdout. Incidentally, print appends a \n to it's output by default.

You could rewrite your decrypt function as follows:

#function for decrypting file
def decryptfile(openFile2, outfile): # <- CHANGED to add outfile
    for line in openFile2:
        for word in line.split():
            empty = ''
            for char in word:
                if char not in string.punctuation:
                    char=char.lower()
                    empty = empty+char 
                if len(empty) == 2:
                    outfile.write(rulesdecrypt[empty]) # <- CHANGED to write to file
                    empty = ''
            if len(empty) == 1:
                outfile.write(rulesdecrypt[empty]) # <- CHANGED to write to file

You will then need to invoke the decryptfile function with a file as its second argument. A similar change could be made to the encryptfile function.

With respect to punctuation and whitespace, either encrypt it or just leave it in place. Once you've removed it, there really isn't a good way to replace it.

0

精彩评论

暂无评论...
验证码 换一张
取 消