目前在Python中使用Vigenere密码,我和我班上的很多人都被困在一个方面。
在我们将关键字翻译成序数后,我们需要将这些数字添加到邮件中以加密它。到目前为止,这是我的代码。
Input = input('Enter your message: ')
key = input('Enter the one word key: ')
times = len(Input)//len(key)+1
encryptedKey = (times*key)[:len(Input)]
output = []
for character in Input:
number = ord(character) - 96
output.append(number)
outputKey = []
for character in encryptedKey:
numberKey = ord(character) - 96
outputKey.append(numberKey)
print(encryptedKey)
print(outputKey)
print(Input)
print(output)
因此,如果输入为'hello'
,密钥为'bye'
,则关键字将变为'byeby'
[2,25,5,2,25]
,而'hello'
将为{{1} }}。我无法找到一种方法来添加第一个[8,5,12,12,15]
2
,8
添加25
,依此类推。
我尝试5
但当然只是将所有数字加在一起,这意味着答案是print(sum(output + outputKey))
。
我还需要它们转回字母,以便最终得到加密的信息。
谢谢!
答案 0 :(得分:0)
您也可以尝试这样的事情(伪代码):
int j = 0
for int i = 0; i < output.len(); i++
print output[i] + outputKey[j]
j++
if j > outputKey.len()
j = 0
这样,不是将数组从[b,y,e]扩展到[b,y,e,b,y],而是计算一次密钥并使用其索引根据需要循环其他值。
答案 1 :(得分:0)
你是正确的开始。你已经将你的信息和密钥翻译成了数字。
keyphrase = [2,25,5,2,25]
message = [8,5,12,12,15]
现在你需要添加它们并模数为26,这样你的答案仍然是a-z。
encrypted = [(keyphrase[i] + message[i])%26 for i in range(len(message))]
>>> encrypted
[10, 4, 17, 14, 14]
现在你需要把它们变成字母:
''.join(chr(c + 96) for c in encrypted)
'jdqnn'
然后你可以通过另一种方式恢复消息:
message = [(encrypted[i] - keyphrase[i])%26 for i in range(len(encrypted))]
>>> message
[8, 5, 12, 12, 15]
>>> ''.join(chr(c + 96) for c in message)
'hello'
对于计算机密码学而言,尤其是使用像Python或C这样的语言的一个FYI,通常标准的是从0开始计数。所以'a'是0,'b'是1,等等。你正在开始在1,这没关系,只是要注意它。