使用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
。有没有人知道怎么做,所以我可以在字母表上倒退来解密它?
答案 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
时,如果%
为小写,则返回移位的低位字符,否则返回移位字符,来自大写字母,是大写的。
然后我们有c
和caesar
函数,它们连接从第一个必需参数中取出的移位字符,可选参数是移位量,默认为{{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
干杯