【问题标题】:Vignere cipher is not returning correct encryption and ecryptionVigenere 密码未返回正确的加密和解密
【发布时间】:2021-09-02 06:54:28
【问题描述】:

我正在尝试创建一个具有以下功能的 vignere 密码类 加密和解密,vignere ciphers。 但是我的代码返回了错误的字符,我想知道是否有人 可以帮助我确定我的问题。

class Vignere():
  
  def __init__(self):
    self.alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    self.enc_key = input("Please enter encription word: ")

  def vignere_encrypt(self, user_message):
    ex_key = self.enc_key
    ex_key_len = len(ex_key)
    user_len = len(user_message)
    cipher = ''
    self.enc_key.upper()
    while ex_key_len < user_len:
      ex_key = ex_key + self.enc_key
      ex_key_len = len(ex_key)

    key_pos = 0

    for letter in user_message.upper():
      if letter in self.alphabet:
        pos = self.alphabet.find(letter)
        key_char = ex_key[key_pos]
        key_char_pos = self.alphabet.find(key_char)
        key_pos = key_pos + 1
        new_pos = pos + key_char_pos

        if new_pos > 26:
          new_pos= new_pos - 26
        new_char = self.alphabet[new_pos]
        cipher = cipher + new_char

      else:
        cipher = cipher + letter
    return cipher

  def vignere_decipher(self, user_message):
    ex_key = self.enc_key
    ex_key_len = len(ex_key)
    user_len = len(user_message)
    cipher = ''
    self.enc_key.upper()
    while ex_key_len < user_len:
      ex_key = ex_key + self.enc_key
      ex_key_len = len(ex_key)

    key_pos = 0

    for letter in user_message.upper():
      if letter in self.alphabet:
        pos = self.alphabet.find(letter)
        key_char = ex_key[key_pos]
        key_char_pos = self.alphabet.find(key_char)
        key_pos = key_pos + 1
        new_pos = pos + key_char_pos

        if new_pos > 26:
          new_pos= new_pos + 26
        new_char = self.alphabet[new_pos]
        cipher = cipher + new_char

      else:
        cipher = cipher + letter
    return cipher

任何关于为什么会发生这种情况的见解将不胜感激。

【问题讨论】:

  • 任何有关输入、输出和您期望的示例?
  • 例如,加密词的输入是“shift”,要加密的词是“car”,我想要的输出是 UHZ。但是我得到了 BZQ。
  • 您尝试过如何调试此代码?

标签: python function class encryption return


【解决方案1】:

例如,加密词的输入是“shift”,要加密的词是“car”,我想要的输出是 UHZ。但是我得到了 BZQ

快速分析:C -> pos==2, key_char==i, aaaand...key_char_pos==-1 因为你的key是小写的。

让我们看看你的代码:

你有self.enc_key.upper(),它不会改变任何东西——字符串是不可变的,字符串中的任何操作都会返回一个新的结果。

我建议删除这些行并在 init 中添加 .upper:

self.enc_key = input("Please enter encription word: ").upper()

【讨论】:

    猜你喜欢
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多