Python 在字符串/列表中将某些数字相加,然后转换为字母

Python 在字符串/列表中将某些数字相加,然后转换为字母,python,encryption,keyword,vigenere,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

目前正在用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'
将变成
[8,5,12,12,15]
。我想不出一种方法来添加第一个
2
8
25
5
,依此类推

我尝试了
print(sum(output+outputKey))
,但这只是将所有数字相加,这意味着答案是
111

我还需要把它们转换成字母,这样它就会以加密的信息结束


谢谢

您也可以尝试以下方法(伪代码):

int j=0
对于int i=0;ioutputKey.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开始,这没关系,只是要注意它。

为什么不a:for i in len(关键字):loop?我怀疑你想要的是
zip
。@idjaw无论如何都不是这个问题的重复。像这样的维格纳密码的重点是模运算,即使OP还没有实现它。谢谢,非常有用。现在我只需要弄清楚如何确保符号不加密!还在习惯使用。伊莎法@animedamon
.isalpha()
肯定能帮你找到你想去的地方。如果您需要我的建议,我不仅会“不加密”符号,还会在您加密之前将它们从消息中删除。在任何真正的密码系统中,你想要加密你发送的任何东西,这意味着要么加密标点符号,要么(在Vigenere密码的情况下,它只对字母起作用)不加密标点符号。我的老师说,虽然我理解,但我必须让它更简单,以便她更容易理解——把它放在多行中。我试过了,但它把我其余的代码都搞乱了。@animedamon因为注释不能显示行格式,所以如果你把现在的内容添加到你的问题中,或者开始一个新的问题,阅读起来会更容易。这不再重要了-我的老师告诉我,只要我理解就可以了-我只需要更好地解释一下!)
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'