Python恺撒密码

Python恺撒密码,python,arrays,encryption,Python,Arrays,Encryption,我正在尝试用Python制作一个凯撒密码。我写的代码试图使用一个数组,然后它将在迭代中按键的数量重新排列。我有一些错误,因此任何关于如何使阵列系统工作的建议都是非常感谢的。这个主意行得通还是我应该放弃这个方法。谢谢 我得到的错误在关键子程序中,如果数字不等于1-26,则会重新启动 import sys Alphbet =["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t" ,"u","v

我正在尝试用Python制作一个凯撒密码。我写的代码试图使用一个数组,然后它将在迭代中按键的数量重新排列。我有一些错误,因此任何关于如何使阵列系统工作的建议都是非常感谢的。这个主意行得通还是我应该放弃这个方法。谢谢 我得到的错误在关键子程序中,如果数字不等于1-26,则会重新启动

import sys

Alphbet =["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t"
,"u","v",",w","x","y","z"]

def Menu():
   print("Welcome To Password Protect Pc Optimizer 3000 Edition!")
   print("\n")
   print("1.) Encrypt A New Password And Save It")
   print("2.) Access An Existing Saved Password ")
   print("3.) Just A One Off Encryption ")
   print("4.) Quit Password Protect ")

   Answer= input("Please Enter An Option Number:")

   if Answer=="1":
       Key()
    elif Answer==2:
       Option2()
    elif Answer==3:
       Option3()
    elif Answer==4:
       Quit()
    else:
       Menu()



def Key():
    global Key

    Key = input("Please Set A Ceaser Cihper Key (1-26)")
    Validation =1
    if Key ==1:
        Validation +=1
        Option1()
删除了很多elif在这里的内容

    elif Key ==26:
        Validation +=1
        Option1()

   if Validation ==1:
        print("Please Enter A Valid Number")
        Key()

def Option1():

    Hold=["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18
","19","20","21","22","23","24","25","26"]    

    for i in range(Key):
        Temp= Alphabet[Hold]
        Alphabet[Hold]= Alphabet[Hold-1]
        Alphabet[Hold-1] =Temp

    print(Alphabet)







Menu()'

以下是一个简化版本:

from collections import deque
import string


class CaesarCypher(object):
    def __init__(self, cypher):
        encrypt_rotate = deque(string.ascii_lowercase)
        encrypt_rotate.rotate(-cypher)
        decrypt_rotate = deque(string.ascii_lowercase)
        decrypt_rotate.rotate(cypher)
        encrypt_trans = ''.join(encrypt_rotate)
        decrypt_trans = ''.join(decrypt_rotate)
        self.encrypt_table = str.maketrans(string.ascii_lowercase, encrypt_trans)
        self.decrypt_table = str.maketrans(string.ascii_lowercase, decrypt_trans)

    def encrypt(self, text):
        return text.translate(self.encrypt_table)

    def decrypt(self, text):
        return text.translate(self.decrypt_table)
首先导入
deque
以使用其
rotate
方法来移动元素的位置,然后导入包含字母表的
string
,这样我们就不必声明它

然后创建一个类来封装加密和解密方法。定义一个
\uuuuuu init\uuuuu
方法,这样类将接受密码的一个参数,并准备将移位字符的翻译表

最后,在类中添加2个方法,根据转换表进行加密和解密

现在您可以这样使用您的类:

caesar = CaesarCypher(5)
test = caesar.encrypt('Hello World!')
print(test)
# > 'Hjqqt Wtwqi!'
test2 = caesar.decrypt(test)
print(test2)
# > 'Hello World!'
编辑: 此示例仅处理小写字母,如果要加密大写字母,则需要为
string.ascii_uppercase
声明一个单独的表,并在decrypt and encrypt方法上翻译文本两次,首先为lower,然后为upper


Edit2:如果您使用的是Python2.7,
maketrans
方法位于
string
类上,而不是
str
中。感谢@t.m.adam的评论。

欢迎访问。请复习,然后回答你的问题。请确保包括您收到的错误。欢迎使用StackOverflow。请阅读并遵循帮助文档中的发布指南。适用于这里。在您发布MCVE代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到一个文本文件中,并重现问题。您不必经历所有这些麻烦,Caesar密码是一种siple替换密码。你可以用这行代码进行加密:
alphbet[(alphbet.index(letter)+rot)%26]
,对于解密,只需将“+”改为“-”,这只是一件小事,将“str”替换为“string”@t.m。亚当:为什么?我们有两个类
string
只用于其
ascii_小写
,因此我不必声明字母表。我的意思是:
str.maketrans
该语句是正确的,我需要
str
类的
maketrans
方法我的错误,我使用的是python 2.7+为你们班准备一份