首页 > 解决方案 > Vigenere 密码 Python 程序

问题描述

你如何编程这个 Vigenere 密码?

我正在做一个问题,我加密和解密 Caesar 和 Vigenere 密码并且很难想出它。我不允许更改任何代码。我只能在定义下添加代码。我在 github 上有这个。

https://github.com/michaelschmitt39/encryption

我得到的更多信息:

关于 Vigenere 密码: Vigenere 密码使用的密钥是一个字符串。更重要的是,它必须是从纯文本中提取的子字符串。假设密钥是“Bob”,因为“Bob”的长度小于明文,所以需要在加密前将密钥填充到与明文相同的长度:

第一个字母“A”由“B”加密。这意味着“B”在查找列表中的索引为 13,因此“A”将向下移动 13 个位置并变为“b”。另一个例子是第二个字母“l”被“o”加密,基于查找列表的索引为7。因此,“l”将下移 7 个位置,加密后变为“o”。实现 Vigenere 密码的加密和解密方法。encrypt 方法将纯文本作为输入,并生成名为 cipher_text 的加密副本。解密方法解密 cipher_text 并返回纯文本。

我真的对 Vigenere 有一些问题。当代码显示为 if-name-main 时,在此站点上它显示不正确,但假定它是正确的。实际代码应如下所示 --> if__name__=="main":

我已经尝试了很多东西。我知道我必须垫钥匙,我相信这是我的问题。

纯文本

plain_text = “美国汽车工人工会和通用汽车之间的谈判“已经变得更糟,根据工会的首席谈判代表,这表明汽车行业数十年来最长的罢工不会立即结束。几天来双方报告取得进展后,谈判遭遇挫折。他们希望达成一项新的四年协议。美国汽车工人工会谈判小组副主席特里·迪特斯(Terry Dittes)周日中午致信会员,称工会认为该公司最新的合同提案完全不能被工会接受。”

def look_up_list_gen(text):
    return list(text)  


class CaesarCipher:
    alphabet = list('abcdefghijklmnopqrstuvwxyz')

    def __init__(self, key):
        assert(key > 0 and type(key) == int)
        self.key = key


    def encrypt(self, plain_text):
        cipher_text = look_up_list_gen(plain_text)
        encrypt_text = ''
        for letter in cipher_text:
            letter = letter.lower()
            if letter in self.alphabet:
                encrypt_text += self.alphabet[(self.alphabet.index(letter) + self.key) % 26 ]
            else:
                encrypt_text += letter
        self.cipher_text = encrypt_text




    def decrypt(self, plain_text):
        cipher_text = look_up_list_gen(plain_text)
        decrypt_text = ''

        for letter in cipher_text:
            if letter in self.alphabet:
                decrypt_text += self.alphabet[(self.alphabet.index(letter) - self.key) % 26 ]
            else:
                decrypt_text += letter

        return decrypt_text




class VigenereCipher:
    def __init__(self, key, look_up_list):
        assert(type(key) == str)
        self.key = key



    def encrypt(self, plain_text):
        assert(len(self.key) <= len(plain_text))



    def decrypt(self):
        assert(len(self.key) <= len(plain_text))



if __name__ == "__main__":
    caesar = CaesarCipher(3)
    caesar.encrypt(look_up_list_gen(plain_text))
    print("Encrypted text: ",caesar.cipher_text)
    print("""
                ---------------------------- 
    """)
    print("Decrypted text: ",caesar.decrypt(caesar.cipher_text).capitalize())

    vigenere = VigenereCipher(plain_text[:5],look_up_list_gen(plain_text))
    vigenere.encrypt(plain_text)
    print("Encrypted text: ",vigenere.cipher_text)
    print("Decrypted text: ",vigenere.decrypt())

标签: pythonpython-3.xencryptionpaddingvigenere

解决方案


推荐阅读