在 string/list 中将某些数字加在一起然后变成字母

Adding certain numbers together in a string/list then turning then into letters

目前正在 Python 中进行 Vigenere 密码,我和我 class 中的许多人都卡在了一个方面。

将关键字转换为序数后,我们需要将这些数字添加到消息中以对其进行加密。到目前为止,这是我的代码。

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' 将是 [8,5,12,12,15]。我想不出一种方法来添加第一个 28255,等等。

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

我还需要将它们转回字母,以便以加密消息结尾。

谢谢!

您也可以尝试这样的操作(伪代码):

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]。

你的起点是对的。您已将消息和密钥翻译成数字。

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 这样的语言,通常从 0 开始计数是标准的。所以 'a' 是 0,'b' 是 1,等等。您从 1 开始,没关系,请注意。