如何在python中编写加密程序

时间:2017-04-19 19:41:01

标签: python

我的加密程序需要一些帮助。而不是让程序只是将字母移动两个(c将成为a或r将成为p)我希望能够引用2个列表,第一个从az正常,另一个用字母以不同的顺序充当加密/解密端。希望这是有道理的。这就是我到目前为止所拥有的。

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

这很好用而且花花公子但是我想要这些清单。假设列表1是A,B,C,D,E,列表2是W,N,U,D,P。只是为了便于使用。

4 个答案:

答案 0 :(得分:2)

这是一个解决方案,仅适用于小写字母。通过将它们添加到文本字符串中,可以很容易地修改它以处理大写字母。

可以看出,空格字符在两个列表中的位置相同。这不是必需的,因为任何角色都可以翻译成任何其他角色。但是,如果decryptedencrypted不包含唯一字符,程序将会崩溃。

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

答案 1 :(得分:1)

好的,这里有一些事情......

首先,我会准确地告诉您所寻找的内容,并解释我使用的内容以及需要对原始代码进行的一些更改。然后我将解释一些固有的问题,你正在尝试做什么,并建议一些方面来阅读/某些方法你可能想要改进你已经得到的。

以下是您要查找的代码(同时保留与您上面提交的内容相同的流程):

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

你会注意到我按顺序设置了一个全局'按顺序排列的字符'列表,它只是每个ASCII字符(32-126)。我还导入了“随机”模块,并根据用户输入的种子使用它来按顺序对字符进行洗牌。只要加密和解密端的种子相同,它就会产生相同的混洗列表,它应该可以加密或解密相同的字符串。还要注意输入选择周围的str()。没有它,用户必须输入'1'而不是1来提交没有错误的选择。

所有这些都说......

  1. 请注意,新函数的工作方式是在一个列表中查看字符的索引,然后在另一个列表中拉出该索引处的字符。你正在使用的增加或减少字符的ASCII代码的方法是基本的(虽然不比这更基本),但它也有一个非常严重的缺陷,即ASCII集的一端或另一端的字符不会' t返回ASCII字符。如果你在一个位级加密它,这将是首选的,这没关系/将是无关紧要的,但在这里你不会得到你想要的那种字符串,如果你,例如,在您的明文中输入[space](ASCII 32)进行加密。
  2. 如果您有兴趣,可能需要阅读对称密钥加密/ DES以获取有关如何真正完成加密的一些想法,虽然道具在开始/兴趣上,这当然可以是创建某种排序的有趣方式密码拼图或类似的东西。我不会假装成任何专家,但我至少可以指出你的写作方向。 (https://en.wikipedia.org/wiki/Data_Encryption_Standard https://en.wikipedia.org/wiki/Symmetric-key_algorithm
  3. 考虑将您的代码读入.txt文件并打印到.txt文件,而不是使用用户输入消息。
  4. 同样,我不是一个专家,你肯定会有一些有趣的用途,只是试图指出你正确的方向,如果这是你感兴趣的东西希望所有这些都有帮助!

答案 2 :(得分:0)

这是我的解决方案。它使用随机化器通过为纯文本分配ASCII值并对文件进行随机加密来加密文件。

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

答案 3 :(得分:0)

我已经编写了用于加密和解密的单独程序。这两种都使用文件操作技术。使用用户名“鸡蛋”和密码“小鸡”,以便没有人可以看到我的密码。我使用hashlib来提高安全性。只需将用户“ Soumajit”更改为您各自的用户名即可使用。第一个是加密,第二个是解密。

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