vigenere密码中的itertools循环导致空间问题python
Posted
技术标签:
【中文标题】vigenere密码中的itertools循环导致空间问题python【英文标题】:itertools cycle in vigenere cipher causing problems with spaces python 【发布时间】:2015-10-30 18:00:44 【问题描述】:在我的 vigenere 密码代码中,我使用来自 itertools 的循环来循环访问关键字。这很有效,直到我在消息中使用空格,因为它加密了空间,因此使加密错误。这是代码。
message = input('enter message: ')
keyword = input('enter keyword: ')
def chr_to_int(char):
return 0 if char == 'z' else ord(char)-96
def int_to_chr(integer):
return 'z' if integer == 0 else chr(integer+96)
def add_chars(a, b):
return int_to_chr(( chr_to_int(a) + chr_to_int(b)) % 26 )
def vigenere(message, keyword):
keystream = cycle(keyword)
new = ''
for msg, key in zip(message, keystream):
if msg == ' ':
new += ' '
else:
new += add_chars(msg, key)
return new
new = vigenere(message, keyword)
print('your encrypted message is: ',new)
我认为解决这个问题的方法是循环使用与消息长度相同的空间,这样它就会继续到下一个字母,就好像空间不存在一样。我不知道该怎么做。
示例:
消息:vignere cipher 关键字:qwerty
加密消息(应该是什么):mflahdib hajgvo
【问题讨论】:
【参考方案1】:由于cycle
返回一个可迭代对象,您可以改用next
而不是 zip,这样它只会在被询问时调用下一个字符:
>>> def vigenere(message, keyword):
keystream = cycle(keyword)
new = ''
for msg in message:
if msg == ' ':
new += ' '
else:
new += add_chars(msg, next(keystream))
return new
>>> new = vigenere('computing is fun', 'gcse')
>>> new
'jrfubwbsn ll kbq'
编辑:每个 OP 请求,使用 zip 和 offset 变量
>>> def vigenere(message, keyword):
keystream = cycle(keyword)
new = ''
offset = 0
for msg, key in zip(message,keystream):
if msg == ' ':
new += ' '
offset += 1
else:
new += add_chars(msg, keyword[keyword.index(key)-offset])
return new
>>> new = vigenere('computing is fun', 'gcse')
>>> new
'jrfubwbsn ll kbq'
【讨论】:
谢谢它很好用,但我想知道是否可以用 zip 来实现,如果你不能不用担心的话。 嗯,关于 zip 的事情是它会迭代两个列表,所以它肯定会添加一些多余的东西,但我添加了一个编辑,其中 zip 可以使用偏移量 var 工作以上是关于vigenere密码中的itertools循环导致空间问题python的主要内容,如果未能解决你的问题,请参考以下文章