在字符串/列表中添加某些数字,然后变成字母

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]。我想不出一种方法来添加第一个 28255,等等。

我试过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怎么把列表转换成字符串?

python编写程序,输入一个字符串表示名字,计算名字中各个字母数值的总和

python: 怎样写一个函数把名字大写并变成下面这样?

利用列表统计字符串大小写字母,数字和其他字符

#在26个大小写字母(52个),以及9个数字组成的字符列表中,随机生成10个8位密码

python怎么把列表转换成字符串?