1

使用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

4 回答 4

1

免责声明

这段代码在某种程度上适用于 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,如果不是,它按原样返回,否则它n在字母甜甜圈周围按字符(n 可以是负数)移动它,因为你得到使用模运算符%,然后如果c是小写,则返回移位后的小写字符,否则返回来自大写字母的移位字符大写。

然后我们有caesaranddecaesar函数,它连接从第一个必需参数中取出的移位字符,可选参数是移位量,默认情况下13;不同之处在于,indecaesarshift称为负数n,以便我们撤消移位。

最终我们测试我们的函数,它也适用于非 ascii 字符,它们单独留在加密字符串中......上面是 Python 3 顺便说一句,Python 2 非 ascii 字符被破坏了。

于 2015-05-01T15:31:41.563 回答
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)
于 2015-05-01T14:07:13.073 回答
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(alphabet) 部分用于包装索引。如果字母是 Z 并且它们的偏移量为 4,则索引将为 25 + 4 = 29,这比字母表的长度 (26) 大。% len(alphabet) 将其转换为 29 % 26 = 3,从而将 Z 转换为 D。

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

于 2015-05-01T14:21:59.730 回答
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

干杯

于 2015-05-03T22:23:26.920 回答