使用Casesar Cipher algorithm,我试图让它解密我输入的任何内容。
#Decrypt Code
alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ "
DMessage=input("Enter your message to decrypt")
UDMessage=DMessage.upper()
lenDMessage=len(UDMessage)
offset=(int(input("Enter what you would like your offset to be 0,25")))
offset=offset-2
for x in range(0,lenDMessage):
for y in range(-25,25):
if UDMessage[x]==alphabet[y+25]:
print(x,DMessage,[x], UDMessage[x],alphabet[y+25+offset])输入是Caesar code test run,但输出为ecguctbeqfgbvgubbtwp。有没有人知道怎么做,这样我就可以倒着用字母表来解密了?
发布于 2015-05-01 23:31:42
免责声明
代码
In [1]: def shift(c,n=13,alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ"):
u = c.upper()
if u not in alphabet: return c
s = alphabet[(alphabet.index(u)+n)%26]
if u!=c: s=s.lower()
return s
...:
In [2]: def caesar(s,n=13): return "".join(shift(c,n) for c in s)
In [3]: def decaesar(s,n=13): return "".join(shift(c,-n) for c in s)
In [4]: caesar('Puffo Burlone, dove vai?')
Out[4]: 'Chssb Oheybar, qbir inv?'
In [5]: decaesar(_)
Out[5]: 'Puffo Burlone, dove vai?'
In [6]: caesar('Puffo Burlone, dove vai?',22)
Out[6]: 'Lqbbk Xqnhkja, zkra rwe?'
In [7]: decaesar(_,22)
Out[7]: 'Puffo Burlone, dove vai?'
In [8]: caesar('Puffo Burlonè, dovè vai?') # note the accented letters
Out[8]: 'Chssb Oheybaè, qbiè inv?'
In [9]: decaesar(_)
Out[9]: 'Puffo Burlonè, dovè vai?'讨论
它的核心是shift函数,它检查一个大写字符是否在alphabet中,如果不是,它会按原样返回,否则它会将它移位一个字母环周围的n字符(n可以是负数),就像你使用模运算符%得到的那样,如果c是小写的,它会返回移位的小写字符,否则它会返回大写字母的移位字符。
然后我们有caesar和decaesar函数,它们连接从第一个必需参数中取出的移位字符,可选参数是移位量,默认情况下是13;不同之处在于,在decaesar中,shift是使用负n调用的,因此我们可以撤消移位。
最后,我们测试我们的函数,它也适用于非ascii字符,这些字符被单独留在加密的字符串中...上面是用Python 3 btw,用Python 2非ascii字符被破坏的。
发布于 2015-05-01 22:07:13
我不能确切地说出您用来加密消息的实现,所以我提供了您的代码的一个版本,它首先加密消息,然后将其解密。
要理解的重要一点是将字符转换为数字。这就是ord()函数所做的事情。然后减去'A‘的数字,就可以得到字母数组的索引。您实际上并不需要字母数组,因为您可以使用ord()的逆函数,也就是chr()函数,但是我尽可能地让实现接近您的实现。由于‘’与其他字母不连续,我对该字符进行了特殊大小写处理。对于您的数组,我想我可以使用string find()方法来获得到数字的转换。
我不知道为什么你要把输入的偏移量减去2,所以我把它省略了。
下面的代码将加密,然后解密。由于负索引在Python中的工作方式,您可以颠倒顺序并解密,然后通过输入负偏移量而不是正偏移量进行加密。
alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ "
DMessage=input("Enter your message to decrypt")
UDMessage=DMessage.upper()
lenDMessage=len(UDMessage)
offset=(int(input("Enter what you would like your offset to be 0,25")))
encrypted = ''
for letter in UDMessage:
if letter == ' ':
index = 26
else:
index = ord(letter) - ord('A')
encrypted += alphabet[index+offset]
print(encrypted)
decrypted = ''
for letter in encrypted:
if letter == ' ':
index = 26
else:
index = ord(letter) - ord('A')
decrypted += alphabet[index+27-offset]
print(decrypted)发布于 2015-05-01 22:22:00
您可以使用find方法来获取字母表中字母的索引,并对其应用偏移量。类似于:
import string
alphabet = string.ascii_uppercase + ' ' # more convenient than typing it out
cipher_text = ''
for c in ud_message: # for each letter in the source message
index = alphabet.find(c) # get the alphabet position (A=0, B=1...)
new_index = (index + offset) % len(alphabet) # add offset
cipher_text += alphabet[new_index] # append it to our cipher_text output%len(字母表)部分用于环绕索引。%len(字母表)将其转换为29 % 26 = 3,从而将Z转换为D。
要解密它,只需再次执行.find()方法,但这一次减去偏移量,得到对应于该索引的字母。您不必担心从偏移量中减去负索引。在Python中,负索引从另一端开始。例如,alphabet24是Y,字母表-2也是Y。
https://stackoverflow.com/questions/29987827
复制相似问题