首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Caesar Cipher,Python解密无法正确输出

Caesar Cipher,Python解密无法正确输出
EN

Stack Overflow用户
提问于 2015-05-01 21:34:21
回答 4查看 1.9K关注 0票数 1

使用Casesar Cipher algorithm,我试图让它解密我输入的任何内容。

代码语言:javascript
复制
#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。有没有人知道怎么做,这样我就可以倒着用字母表来解密了?

EN

回答 4

Stack Overflow用户

发布于 2015-05-01 23:31:42

免责声明

代码

代码语言:javascript
复制
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是小写的,它会返回移位的小写字符,否则它会返回大写字母的移位字符。

然后我们有caesardecaesar函数,它们连接从第一个必需参数中取出的移位字符,可选参数是移位量,默认情况下是13;不同之处在于,在decaesar中,shift是使用负n调用的,因此我们可以撤消移位。

最后,我们测试我们的函数,它也适用于非ascii字符,这些字符被单独留在加密的字符串中...上面是用Python 3 btw,用Python 2非ascii字符被破坏的。

票数 1
EN

Stack Overflow用户

发布于 2015-05-01 22:07:13

我不能确切地说出您用来加密消息的实现,所以我提供了您的代码的一个版本,它首先加密消息,然后将其解密。

要理解的重要一点是将字符转换为数字。这就是ord()函数所做的事情。然后减去'A‘的数字,就可以得到字母数组的索引。您实际上并不需要字母数组,因为您可以使用ord()的逆函数,也就是chr()函数,但是我尽可能地让实现接近您的实现。由于‘’与其他字母不连续,我对该字符进行了特殊大小写处理。对于您的数组,我想我可以使用string find()方法来获得到数字的转换。

我不知道为什么你要把输入的偏移量减去2,所以我把它省略了。

下面的代码将加密,然后解密。由于负索引在Python中的工作方式,您可以颠倒顺序并解密,然后通过输入负偏移量而不是正偏移量进行加密。

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2015-05-01 22:22:00

您可以使用find方法来获取字母表中字母的索引,并对其应用偏移量。类似于:

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29987827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档