为啥 Vigenere 密码只能正确加密部分消息?

Posted

技术标签:

【中文标题】为啥 Vigenere 密码只能正确加密部分消息?【英文标题】:Why is Vigenere cipher only encrypting part of message properly?为什么 Vigenere 密码只能正确加密部分消息? 【发布时间】:2017-08-30 00:17:45 【问题描述】:

为什么 Vigenere 密码只能正确加密部分消息?我们开始编写 Caesar 密码,然后使用为 Caesar 创建的辅助函数升级到 Vigenere 密码。我的alphabet_position 和rotate_character 函数似乎正在工作,但是我的Vigenere 加密函数只能正确返回部分加密消息。 例如, 打印加密('BaRFoo',Baz) 应该返回:'CaQGon' 实际返回:'CakGo\x88'

以下是我目前的代码:

import string

def alphabet_position(letter):
    return (ord(letter))

def rotate_character(char,rot):
    encoded = ""
    # loop over characters for ord
    char_ord = alphabet_position(char)
    # non-alphabet characters
    if (char_ord > 90 and char_ord < 97) or char_ord < 65 or char_ord >122:
        encoded = encoded + char
        return encoded
    else:
        # set each according to whether upper or lower case
        # ord of "Z" is 90, so 91 for upper range and ord of "A" is 65 so 
        uppercase boundary
        if char.isupper():
            asciirange = 91
            asciibound = 65
        else:
            # ord of "z" is 122 so 123 for upper range and ord of "a" is 97 
            so lowercase boundary
            asciirange = 123
            asciibound = 97

    enc_char = ((char_ord + rot) % asciirange)
    if enc_char < asciibound:
       enc_char = (enc_char + asciibound)
       encoded = encoded + (chr(enc_char))
    else:
       encoded = encoded + (chr(enc_char))
    return (encoded)

def encrypt(text,keyword):
    encoded_text = ""
    key_start = 0
    # find rot
    alpha = string.ascii_letters
    for char in text:
        # check if char is a letter
        if char.isalpha():
            key_num = (alphabet_position(keyword[key_start]))
            # convert key_num to a letter to find its index
            rot = alpha.find(chr(key_num))
            encoded_text += (rotate_character(char,rot))
            if key_start == (len(keyword)-1):
                key_start = 0
            else:
                key_start += 1
         else:
             encoded_text += char

    return encoded_text

【问题讨论】:

嗨!欢迎来到堆栈溢出,请阅读How to Ask。我认为您需要更具体地了解您的代码的问题是什么 谢谢米克。我重写了我的问题更具体:) 【参考方案1】:
for index, char in enumerate(text):
    print index, char

抱歉,我不确定这是您要求的,但我试试 ;) 希望对您有所帮助。

【讨论】:

感谢 MrGoodKat。我会根据你的建议四处寻找:)

以上是关于为啥 Vigenere 密码只能正确加密部分消息?的主要内容,如果未能解决你的问题,请参考以下文章

Vigenere 没有在 python 中加密我的消息

Python 中的 Vigenere 密码

使用 vigenere 密码加密时出现奇怪的错误

在 vigenere 密码中查找密钥的长度

Vigenere 密码破坏了一些

Python Vigenere 代码重复错误