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

时间:2015-05-01 13:34:21

标签: python encryption caesar-cipher

使用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。有没有人知道怎么做,所以我可以在字母表上倒退来解密它?

4 个答案:

答案 0 :(得分:0)

我无法确切地告诉您用于加密邮件的确切实现,所以我提供的代码版本首先对邮件进行加密,然后将其解密并解密。

要理解的重要一点是将角色转换为数字。这就是ord()函数的作用。然后减去'A'的数字,你可以获得字母数组的索引。你真的不需要字母数组,因为你可以使用ord() chr()函数的反函数,但我让实现尽可能接近你的实现。由于''与其他字母不一致,我特别为那个字符设置了句子。使用您的数组,我想我可以使用字符串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)

答案 1 :(得分:0)

您可以使用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(字母)部分用于包装索引。如果字母是Z并且它们的偏移量为4,则索引将是25 + 4 = 29,这大于字母表的长度(26)。 %len(字母表)将其变为29%26 = 3,这将Z变为D。

要解密它,你只需再次执行.find()方法,但这次减去偏移量并得到与该索引相对应的字母。您不必担心负索引减去偏移量。在Python中,负索引从另一侧开始。所以例如字母[24]是Y,字母[-2]也是Y。

答案 2 :(得分:0)

声明

这段代码使用Python 3工作,但不适用于Python 2

代码

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中,如果不是,则按原样返回,否则将其移动{{1}字母圆环周围的字符(n可以是负数),当您使用模运算符n时,如果%为小写,则返回移位的低位字符,否则返回移位字符,来自大写字母,是大写的。

然后我们有ccaesar函数,它们连接从第一个必需参数中取出的移位字符,可选参数是移位量,默认为{{1} };区别在于,在decaesar中,13被称为负decaesar,因此我们撤消了转变。

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

答案 3 :(得分:0)

我拿了你的代码并稍微重构了一下。尝试使用mod而不是像你那样扩展字母串。

#Decrypt Code  DEFGHIJKLMNOPQRSTUVWXYZABC -> ABCDEFGHIJKLMNOPQRSTUVWXYZ  (left 3 offset, -3)
import string
alphabet = string.ascii_uppercase
cipher =  raw_input("Enter your message to decrypt: ").upper()
offset=(int(raw_input("What is the cipher offset? : ")))
plain = []
for letter in cipher:
    offset_letter = alphabet[(alphabet.index(letter) + offset) % len(alphabet)]
    plain.append(offset_letter)
print ''.join(plain)

以下是工作方案,注意-3表示向左移动3.因此,只要您知道如何移动它,就可以使用相同的功能进行加密/解密:

$Enter your message to decrypt: DEFGHIJKLMNOPQRSTUVWXYZABC
$What is the cipher offset? : -3
ABCDEFGHIJKLMNOPQRSTUVWXYZ

现在回到另一个方向,做一个正确的转变:

$Enter your message to decrypt: ABCDEFGHIJKLMNOPQRSTUVWXYZ
$What is the cipher offset? : 3
DEFGHIJKLMNOPQRSTUVWXYZABC

干杯