在python中修改Vigenere密码 - 字母表

时间:2014-02-01 09:25:11

标签: python encryption alphabet vigenere

这就是我要做的事情:

  

在Python中编写一个脚本,该脚本是用于英文文本的Vigenere密码版本的实现。您的脚本应区分小写和大写字母(即,加密密钥和明文允许由小写和大写字母组成,但密文应为大写)。除了字母之外,纯文本中还有四个其他字符:逗号(26),点(27),短划线(28),下划线(29),将加密函数更改为模块30。

     

您的脚本应从标准输入读取并写入标准输出。它应该提示用户输入大小为k的加密密钥。密钥不允许像标准Vigenere密码那样重复。相反,我们将遵循基于分组密码的想法。基本上,明文和密文将具有大小为k的块,其与密钥大小相同。如果密钥长度短于明文,则将前一个块的块大小k的密文连接到密钥。以下是关键字为“Carbondale”且k = 10的示例:

Plaintext :  SIU_CS-Department_is_the_best
 Key       :  CarbondaleUIHAQBBDPTUZ,MUOUCX
 Ciphertext:  UIHAQBBDPTUZ,MUOUCXHTODQTPYUM

所以,我想知道如何处理额外字符的部分“,”“。” “/”“_”。这是进行加密的功能:

a = len(key)

b = len(text)

while (len(key1) <= len(text1)):

    for i in range(0,a):
        num1 = ord(text1[i+var])%97
        num2 = ord(key1[i+var])%97
        num3 = num1+num2
        if (num3 > 25):
            encr.append(num3%25)
        else:
            encr.append(num3)
        i + 1

    for i in range(0,a):
        encr1.append(chr(encr[i+var]+97))
        i + 1

    for i in range(0,a):
        key1.append(encr1[i+var])
        i + 1
    var = var + a

1 个答案:

答案 0 :(得分:0)

您的代码目前存在以下问题(我假设var = 0encr = []encr1 = []key1 = list(key)text1 = list(text)发生在您拥有的代码之前贴):

  1. 如果密钥长于明文,您的while循环将永远不会启动,否则永远不会结束,因为您永远不会缩短text1(这样做会破坏您的索引);
  2. 您无需在for循环中手动增加计数器(如果您愿意,i + 1如果没有有效的分配,则需要i += 1);
  3. 使用mod(%)时,您无需检查是否num3 < 25;和
  4. 如果您想要包含它们,请注意您列出的额外字符与指定的字符("/" != "-")不同。
  5. 而不是使用ordchr,我会建立自己的字母表来循环,例如。

    from string import ascii_uppercase
    
    alphabet = list(ascii_uppercase) + [",", ".", "-", "_"]
    

    您可能会发现“标准”Vigenère的这种实现很有帮助:

    from itertools import cycle
    
    def vigenere(plain, key, alphabet):
        for p, k in zip(plain, cycle(key)):
            index = alphabet.index(p) + alphabet.index(k)
            yield alphabet[index % len(alphabet)]
    

    以下是修改后的实现的一些伪代码:

    convert all text (plain, key) to upper case
    create a list to hold output
    split plain into blocks of length len(key)
    for each block in plain:
        if it's the first block, use key to encode
        otherwise, use the last block of encoded text in output