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密码不起作用的主要内容,如果未能解决你的问题,请参考以下文章