Vigenere密码破坏了一些

时间:2015-09-09 00:10:51

标签: python encryption vigenere

我在python中制作了一个简单的vigenere密码加密器/解密器,它在很大程度上起作用。我没有收到任何错误,但有些信件没有正确加密或解密(或两者兼而有之)。这是我的代码:

import sys
if not len(sys.argv) == 4:
    print "Not enough arguments."
    print "Usage: python vigener.py <encrypt/decrypt> 'ciphertext' 'key'"
    sys.exit()
mode = sys.argv[1]
ctext = sys.argv[2]
key = sys.argv[3]
if mode == "encrypt":
    print "Encrypting using vigener cipher..."
elif mode == "decrypt":
    print "Decrypting using vigener cipher..."
else:
    print "Unknown function '"+str(mode)+"'."
    print "Usage: python vigener.py <encrypt/decrypt> 'ciphertext' 'key'"
MAGIC_NUMBER = 96
ctext = ctext.lower()
repeated_key = ( key * (1+len(ctext)/len(key)) )[:len(ctext)]
if mode == "encrypt":
    ctext = ctext.replace(" ", "{")
    nums = [ord(ltr)-MAGIC_NUMBER for ltr in ctext]
    rk_nums = [ord(ltr)-MAGIC_NUMBER for ltr in repeated_key]
    enc_nums = [(num+rk_nums[ nums.index(num) ]) % 27 for num in nums]
    enc_ltrs = [chr(num+MAGIC_NUMBER) for num in enc_nums]
    print "".join(enc_ltrs)
elif mode == "decrypt":
    enc_nums = [ord(ltr)-MAGIC_NUMBER for ltr in ctext]
    rk_nums = [ord(ltr)-MAGIC_NUMBER for ltr in repeated_key]
    dec_nums = [(num-rk_nums[ enc_nums.index(num) ]) for num in enc_nums]
    dec_nums2 = [ (num + 27 if num < 1 else num) for num in dec_nums]
    dec_ltrs = [chr(num+MAGIC_NUMBER) for num in dec_nums2]
    dec_str = "".join(dec_ltrs)
    dec_str = dec_str.replace("{", " ")
    print "".join(dec_str)

这是我的终端输出:

$ python vigener.py encrypt 'this is confidential' 'secretkey'
Encrypting using vigener cipher...
lmljeljeagsiliyslltq
$ python vigener.py decrypt 'lmljeljeagsiliyslltq' 'secretkey'
Decrypting using vigener cipher...
thts ts conftfenttal
$

它似乎只是错误地加密/解密某些字母。到底是怎么回事?

1 个答案:

答案 0 :(得分:1)

简短回答 - 这两行需要修复:

list.index()

答案很长:代码使用'banana'的方式是一个逻辑错误。

假设我们正在进行加密,明文为'secretkey',密钥为nums = [2, 1, 14, 1, 14, 1] # 'banana' rk_nums = [19, 5, 3, 18, 5, 20] # 'secret' enc_nums = [ ( 2 + rk_nums[nums.index( 2)]) % 27, ( 1 + rk_nums[nums.index( 1)]) % 27, (14 + rk_nums[nums.index(14)]) % 27, ( 1 + rk_nums[nums.index( 1)]) % 27, (14 + rk_nums[nums.index(14)]) % 27, ( 1 + rk_nums[nums.index( 1)]) % 27 ] 。在旧代码中,会发生这种情况:

enc_nums

我们可以详细说明列表enc_nums = [ ( 2 + rk_nums[0]) % 27, ( 1 + rk_nums[1]) % 27, (14 + rk_nums[2]) % 27, ( 1 + rk_nums[1]) % 27, (14 + rk_nums[2]) % 27, ( 1 + rk_nums[1]) % 27 ]

的内容
list.index()

当明文中出现一个以上的字母时,会出现问题。方法rk_nums返回第一次出现的索引。因此,密钥的错误索引(zip([9, 8, 7, 6], [0, 1, 2, 3]))用于加密字母。

简单的解决方案是使用zip()函数,该函数将同一索引处的两个列表中的元素配对。例如,[(9,0), (8,1), (7,2), (6,3)]将返回列表<Fill> <CssParameter name="fill"> <ogc:Function name="if_then_else"> <ogc:Function name="isNull"> <ogc:PropertyName>LTE_RSRP</ogc:PropertyName> </ogc:Function> <ogc:Literal>#FF0000</ogc:Literal> <ogc:Function name="Interpolate"> <ogc:PropertyName>LTE_RSRP</ogc:PropertyName> <ogc:Literal>-80</ogc:Literal> <ogc:Literal>#ff0000</ogc:Literal> <ogc:Literal>-70</ogc:Literal> <ogc:Literal>#00ff00</ogc:Literal> <ogc:Literal>-60</ogc:Literal> <ogc:Literal>#0000ff</ogc:Literal> <ogc:Literal>color</ogc:Literal> </ogc:Function> </ogc:Function> </CssParameter> <CssParameter name="fill-opacity">0.3</CssParameter> </Fill> 。这样,您可以确保始终使用明文编号和密钥编号。