首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vigenere Cipher Python 2.0

Vigenere Cipher Python 2.0
EN

Stack Overflow用户
提问于 2014-05-03 09:23:43
回答 2查看 3.7K关注 0票数 0

我对vigenere密码的编码/解码编程有问题。我应该只使用列表,字典和循环。编辑:我在我有的解密中添加了。GetCharList()只获取包含字母表的列表。我不知道有什么问题,它使解码的输出,而不是原始消息。

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2014-05-04 00:23:54

另一种方法是使用ordchr来消除处理字母的一些复杂性,而不是自己修改字母表。至少可以考虑使用itertools.cycleitertools.izip来构造加密/解密对的列表。下面是我解决这个问题的方法:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-05-03 12:39:14

我不知道维吉内尔是怎么工作的。不过,我很确定之后

代码语言:javascript
复制
    num = alphabet.find(key[keyIndex])
    if num != -1:
        num -= alphabet.find(key[keyIndex])

num为零。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23439208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档