如何让我的 Vigenère 密码处理消息中的空格?
How can I make my Vigenère cipher handle spaces in the message?
这是我用来处理 Vigenére 密码的函数。我的问题是,如果我在输入中有任何空格,它们将与消息一起编码。我希望输出消息中的空格保持不变。我怎样才能做到这一点?
def vigenere():
global encoded
global message
global book
while len(book) < len(message):
book += book
book = book[:len(message)]
encoded = ""
for char in range(len(message)):
newchar = ord(message[char]) + ord(book[char]) - 194
newchar %= 25
encoded += chr(newchar + 97)
print(encoded)
在使用维吉尼亚密码之前,先获取字符串中出现空格的所有位置。您可以使用正则表达式来做到这一点:
import re
def space_indices(string):
return [s.start() for s in re.finditer(' ', string)]
然后,删除输入中的所有空格:
def remove_spaces(string):
return string.replace(' ', '')
并重新定义您的 Vigenère 密码函数,使其 returns 编码消息而不是打印它:
def vigenere():
# encode your message...
return encoded
然后您可以定义一个新函数,该函数将查找所有空格的索引、保存这些索引、删除空格、对未分隔的字符串应用 Vigenère 密码,然后将空格插入结果中:
def space_preserving_vigenere(message):
space_indices = space_indices(message)
unspaced_msg = remove_spaces(message)
encoded = vigenere(unspaced_msg)
inserted_spaces = 0
for index in space_indices:
actual_index = index + inserted_spaces
encoded = encoded[:actual_index] + ' ' + encoded[actual_index:]
inserted_spaces = inserted_spaces + 1
return encoded
这是我用来处理 Vigenére 密码的函数。我的问题是,如果我在输入中有任何空格,它们将与消息一起编码。我希望输出消息中的空格保持不变。我怎样才能做到这一点?
def vigenere():
global encoded
global message
global book
while len(book) < len(message):
book += book
book = book[:len(message)]
encoded = ""
for char in range(len(message)):
newchar = ord(message[char]) + ord(book[char]) - 194
newchar %= 25
encoded += chr(newchar + 97)
print(encoded)
在使用维吉尼亚密码之前,先获取字符串中出现空格的所有位置。您可以使用正则表达式来做到这一点:
import re
def space_indices(string):
return [s.start() for s in re.finditer(' ', string)]
然后,删除输入中的所有空格:
def remove_spaces(string):
return string.replace(' ', '')
并重新定义您的 Vigenère 密码函数,使其 returns 编码消息而不是打印它:
def vigenere():
# encode your message...
return encoded
然后您可以定义一个新函数,该函数将查找所有空格的索引、保存这些索引、删除空格、对未分隔的字符串应用 Vigenère 密码,然后将空格插入结果中:
def space_preserving_vigenere(message):
space_indices = space_indices(message)
unspaced_msg = remove_spaces(message)
encoded = vigenere(unspaced_msg)
inserted_spaces = 0
for index in space_indices:
actual_index = index + inserted_spaces
encoded = encoded[:actual_index] + ' ' + encoded[actual_index:]
inserted_spaces = inserted_spaces + 1
return encoded