在字符串/列表中添加某些数字然后转换为字母

时间:2015-11-04 14:46:12

标签: python encryption keyword vigenere

目前在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] 28添加25,依此类推。

我尝试5但当然只是将所有数字加在一起,这意味着答案是print(sum(output + outputKey))

我还需要它们转回字母,以便最终得到加密的信息。

谢谢!

2 个答案:

答案 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,这没关系,只是要注意它。