Python Vigenère密码不起作用

Posted

技术标签:

【中文标题】Python Vigenère密码不起作用【英文标题】:Python Vigenère cipher not working 【发布时间】:2017-05-28 02:49:37 【问题描述】:

我创建了这段代码,它使用 Vigenère 密码来加密一个文本块,由于某种原因它给了我这个奇怪的输出

import string

original_word = raw_input("what text do you want to encrypt ?")
one_time_pad = raw_input("How do you want to encrypt ?")
word_array = list(original_word)
pad = list(one_time_pad)

i = 0
b = 0
for word in word_array:
    word_array[i]= chr(ord(word) + ord(pad[b]))
    print word_array
    i += 1
    if b == len(one_time_pad):
        b = 0
    else:
        b += 1

cipher_text = "".join(word_array)
print cipher_text

这只会给我这个奇怪的输出

 ['\xc2', 'b', 'c']
  ['\xc2', '\xc4', 'c']
  ['\xc2', '\xc4', '\xc6']
  ???

有人可以解释一下吗?

【问题讨论】:

请修正您的缩进代码。 另外:chr(ord('a') +ord('a')) 给出:'\xc2'。我想你可能会重新考虑你的算法。或者你能解释一下你的算法是如何工作的吗? 第一件事...if b == len(one_time_pad) 应该检查len()-1,因为one_time_pad[len(one_time_pad)] 会产生IndexError。尝试使用b = (b + 1) % len(one_time_pad) 而不是if-else 好的,这应该可以通过添加字符的值并在该位置输出一个新字符来工作,我只是对输出感到困惑 看看这里:***.com/questions/tagged/vigenere+python 【参考方案1】:

因此,Vigenère 密码是在字母 [A-Z] 上定义的。您正在使用 ord() 查找字符的 ASCII 索引。但是,ASCII 的定义不仅仅是大写字母。例如:

>>> ord('m')
109
>>> ord('k')
107
>>> 216

第216个字符的值在一般的ASCII中是没有定义的,所以Python当你用chr()获取字符时,会得到'\xd8',这是Python告诉你“只是0xd8 th(是 216 的十六进制)字符”。

相反,您将希望保持在大写字母的范围内。我建议执行以下操作:

ord1 = string.ascii_uppercase.index(word.upper())
ord2 = string.ascii_uppercase.index(pad[b].upper())
word_array[i] = string.ascii_uppercase[(ord1 + ord2) % 26]

【讨论】:

以上是关于Python Vigenère密码不起作用的主要内容,如果未能解决你的问题,请参考以下文章

编码 Vigenère 密码时 c 中的分段错误

Vigenère 密码,C 中的问题

如何让我的 Vigenère 密码处理消息中的空格?

[字符串][NOIP2012]Vigenère密码

C中的Vigenère密码,如何仅在字母字符上移动关键字

维吉尼亚密码(Vigenère cipher)