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

Posted

技术标签:

【中文标题】如何让我的 Vigenère 密码处理消息中的空格?【英文标题】:How can I make my Vigenère cipher handle spaces in the message? 【发布时间】:2017-04-04 19:40:13 【问题描述】:

这是我用来处理 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)

【问题讨论】:

你想做什么?你需要在哪里输入空格?事实上,你的问题很不清楚。 我正在尝试将空格导入到 vigenere 代码的结果中。例如,如果用户输入中有空格,我希望能够将空格放在完全相同的位置,而不是变成一个字母。 检查我的解决方案。 【参考方案1】:

在使用 Vigenère 密码之前,获取字符串中所有出现空格的位置。您可以使用正则表达式来做到这一点:

import re    

def space_indices(string):
  return [s.start() for s in re.finditer(' ', string)]

然后,从您的输入中删除所有空格:

def remove_spaces(string):
  return string.replace(' ', '')

并重新定义您的 Vigenère 密码函数,以便它返回编码的消息而不是打印它:

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 密码处理消息中的空格?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 中的 Vigenère 密码显示或 � 字符

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

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

Vigenère 密码,C 中的问题

Python Vigenère密码不起作用

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