维吉尼亚密码 Python 2.0

Posted

技术标签:

【中文标题】维吉尼亚密码 Python 2.0【英文标题】:Vigenere Cipher Python 2.0 【发布时间】:2014-05-03 01:23:42 【问题描述】:

我在为 vigenere 密码进行编码/解码编程时遇到问题。我只应该使用列表、字典和循环。 编辑:我添加了我拥有的解密。 GetCharList() 只是获取一个包含字母表的列表。我不知道它使 decrpyt 的输出不是原始消息有什么问题。

def encryptVig(msg, keyword):
    alphabet = getCharList() #Get char list is another function which creates a list containing a - z
    key = keyword.upper()
    keyIndex = 0 
    dicList = []
    for symbol in msg:
        num = alphabet.find(key[keyIndex])
        if num != -1:
            num += alphabet.find(key[keyIndex])
            alphabet.find(key[keyIndex])
            num%= len(alphabet)
            if symbol.isupper():
                dicList.append(alphabet[num])
        elif symbol.islower():
            dicList. append(alphabet[num].lower())
        keyIndex += 1
        if keyIndex == len(key):
            keyIndex = 0
        else:
            dicList.append(symbol)
return " " .join(dicList)

def decryptVig(msg, keyword):
    getCharList()
    key = keyword.upper()
    keyIndex = 0 
    dicList = []
    for symbol in msg:
        num = alphabet.find(key[keyIndex])
        if num != -1:
            num -= alphabet.find(key[keyIndex])
            alphabet.find(key[keyIndex])
            num%= len(alphabet)
            if symbol.isupper():
            dicList.append(alphabet[num])
        elif symbol.islower():
            dicList. append(alphabet[num].lower())
        keyIndex -= 1
        if keyIndex == len(key):
            keyIndex = 0
        else:
            dicList.append(symbol)
return " " .join(dicList)

【问题讨论】:

您遇到了什么问题? 所以基本上我们无法运行你的东西,你有一些问题,但你没有告诉我们它是什么?! 当我编码时,它会产生一个输出,例如 Q O Q O O Q 当我使用解码函数对其进行解码时,它与 + 到 - 的功能基本相同,以反转密码,它不会解密消息。 如果问题出在decrypt,那么您应该发布该函数。 发布了解密:\任何能引导我走向正确方向的帮助,谢谢! 【参考方案1】:

与其自己破解字母表,另一种方法是使用ordchr 来消除处理字母的一些复杂性。至少考虑使用itertools.cycleitertools.izip 来构建加密/解密对列表。以下是我将如何解决它:

def letters_to_numbers(str):
    return (ord(c) - ord('A') for c in str)

def numbers_to_letters(num_list):
    return (chr(x + ord('A')) for x in num_list)

def gen_pairs(msg, keyword):
    msg = msg.upper().strip().replace(' ', '')
    msg_sequence = letters_to_numbers(msg)
    keyword_sequence = itertools.cycle(letters_to_numbers(keyword))
    return itertools.izip(msg_sequence, keyword_sequence)

def encrypt_vig(msg, keyword):
    out = []
    for letter_num, shift_num in gen_pairs(msg, keyword):
        shifted = (letter_num + shift_num) % 26
        out.append(shifted)
    return ' '.join(numbers_to_letters(out))

def decrypt_vig(msg, keyword):
    out = []
    for letter_num, shift_num in gen_pairs(msg, keyword):
        shifted = (letter_num - shift_num) % 26
        out.append(shifted)
    return ' '.join(numbers_to_letters(out))

msg = 'ATTACK AT DAWN'
keyword = 'LEMON'
print(encrypt_vig(msg, keyword))
print(decrypt_vig(encrypt_vig(msg, keyword), keyword))

>>> L X F O P V E F R N H R
    A T T A C K A T D A W N

【讨论】:

【参考方案2】:

我不知道 Vigenere 应该如何工作。不过我很确定之后

    num = alphabet.find(key[keyIndex])
    if num != -1:
        num -= alphabet.find(key[keyIndex])

num 为零。

【讨论】:

以上是关于维吉尼亚密码 Python 2.0的主要内容,如果未能解决你的问题,请参考以下文章

维吉尼亚密码的Python实现

维吉尼亚密码 C++

密码那些事儿|(十)“钥匙”打开维吉尼亚的锁

维吉尼亚密码(Vigenère cipher)

维吉尼亚密码:加密强悍,却为何没人用?

《密码学》维吉尼亚密码。