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