vigenere 密码中的 itertools 循环导致空格问题 python
itertools cycle in vigenere cipher causing problems with spaces python
在我的 vigenere 密码代码中,我使用 itertools 中的循环来循环遍历关键字。这很好用,直到我在消息中使用 spaces 因为它加密了 space 从而使加密错误。这是代码。
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)
我认为解决这个问题的方法是循环遍历 space 相同长度的消息,这样它将继续到下一个字母,就好像 space 不存在一样.我不知道该怎么做。
示例:
消息:vignere 密码关键字:qwerty
加密消息(应该是什么):mflahdib hajgvo
因为 cycle
returns 是一个可迭代的,你可以使用 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 和偏移量变量
>>> 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'
在我的 vigenere 密码代码中,我使用 itertools 中的循环来循环遍历关键字。这很好用,直到我在消息中使用 spaces 因为它加密了 space 从而使加密错误。这是代码。
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)
我认为解决这个问题的方法是循环遍历 space 相同长度的消息,这样它将继续到下一个字母,就好像 space 不存在一样.我不知道该怎么做。
示例:
消息:vignere 密码关键字:qwerty
加密消息(应该是什么):mflahdib hajgvo
因为 cycle
returns 是一个可迭代的,你可以使用 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 和偏移量变量
>>> 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'