在 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]
。我想不出一种方法来添加第一个 2
和 8
,25
和 5
,等等。
我试过 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 开始,没关系,请注意。
目前正在 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]
。我想不出一种方法来添加第一个 2
和 8
,25
和 5
,等等。
我试过 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 开始,没关系,请注意。