在字符串/列表中添加某些数字,然后变成字母
Posted
技术标签:
【中文标题】在字符串/列表中添加某些数字,然后变成字母【英文标题】:Adding certain numbers together in a string/list then turning then into letters 【发布时间】:2015-11-04 14:46:12 【问题描述】:目前正在用 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
。
我还需要将它们转回字母,以便它以加密消息结束。
谢谢!
【问题讨论】:
为什么不 a: for i in len(keyword): 循环? 我怀疑你想要zip
...
@idjaw 无论如何都不是那个问题的副本。像这样的 Vigenere 密码的重点是模运算,即使 OP 还没有意识到这一点。
【参考方案1】:
你的开始是正确的。您已将消息和密钥转换为数字。
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,没关系,只要注意它。
【讨论】:
谢谢,非常有帮助。现在我只需要弄清楚如何确保符号不加密!还在习惯使用 .isalpha! @AnimeDeamon.isalpha()
肯定能带你去你想去的地方。如果您需要我的建议,我不仅会“不加密”符号,还会在加密之前将它们从消息中删除。在任何真正的密码系统中,您都希望对您发送的任何内容进行加密,这意味着要么加密标点符号,要么(在 Vigenere 密码的情况下,它只对字母进行操作)将其排除在外。将它们留在其中但未加密会泄露大量信息。
我的老师说,虽然我理解它,但我必须使它更简单,以便她更容易理解 - 将它放在多行中。我试过了,但它搞砸了我其余的编码。
@AnimeDeamon 因为 cmets 无法显示行格式,如果您将现有内容添加到您的问题中,或者开始一个新问题,它会更容易阅读。
没关系——老师告诉我只要我懂就行——我只需要解释清楚! :)【参考方案2】:
你也可以试试这样的(伪代码):
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] 而是计算一次键并使用其索引根据需要循环其他值。
【讨论】:
以上是关于在字符串/列表中添加某些数字,然后变成字母的主要内容,如果未能解决你的问题,请参考以下文章
python编写程序,输入一个字符串表示名字,计算名字中各个字母数值的总和