凯撒密码不能正确旋转字母? (Python)的

时间:2017-09-08 13:46:07

标签: python caesar-cipher

我曾尝试为我在学校的第一个Python项目制作一个Caesar Cipher。我有点复制了来自youtube视频的代码作为主密码段,但是当我加密用户输入的消息时,它会做一个随机密码而不是他输入shell的密钥。这是代码:

abc = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz'

def main():
    message = input("What's the message to encrypt/decrypt? ")
    key = int(input("What number would you like for your key value? "))
    choice = input("Choose: encrypt or decrypt. ")
    if choice == "encrypt":
        encrypt(message, key)
    elif choice == "decrypt":
        encrypt(message, key * (-1))
    else:
        print("Bad answer, try again.")

def encrypt(message, key):
    cipherText = ""
    for letter in message:
        if letter in abc:
            newPosition = (abc.find(letter) + key) % 26
            cipherText += abc[newPosition]
        else:
            cipherText += letter
    print(cipherText)
    return cipherText

main()

请有人帮我解决这个问题。另外请不要让它变得非常复杂,因为我是Python的初学者而且我根本不太了解。

谢谢!

4 个答案:

答案 0 :(得分:1)

虽然我同意@glibdud,但还有另一个错误。 您正在以密钥值+ abc中的位置取模26。 但abc长度为52个字符 - 因此,为了能够解密您加密的内容,您需要将其更改为newPosition = (abc.find(letter) + key) % 52

如果您想使加密字符串更加随意,比如说要包含一些标点符号或数字字符,请将26或52替换为加密字符串的计算长度。

答案 1 :(得分:0)

abc = 'AaBbCcDdEeFfGgHhIiJjKKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz'

def main():
    message = input("What's the message to encrypt/decrypt? ")
    key = int(input("What number would you like for your key value? "))
    choice = input("Choose: encrypt or decrypt. ")
    if choice == "encrypt":
        encrypt(message, key)
    elif choice == "decrypt":
        encrypt(message, key * (-1))
    else:
        print("Bad answer, try again.")

def encrypt(message, key):
    cipherText = ""
    for letter in message:
        if letter in abc:
            newPosition = (abc.find(letter) + key) % 26
            cipherText += abc[newPosition]
        else:
            cipherText += letter
    print(cipherText)
    return cipherText

main()

缺少消息,加密中的关键参数

答案 2 :(得分:0)

问题在于你在字符集中交织大写和小写字母。因此,当你尝试用一个字符替换一个字符时,例如,前面的5个字符,你实际上正在翻转案例并向前移动2-3个字符(取决于你开始的情况)。有更好的方法来实现这一点,但事实证明,一个简单的更改可以使您的代码按预期工作:

newPosition = (abc.find(letter) + key * 2) % 52

如果在找到替换字符时将密钥加倍,那么您将跳过字符集中的大写和小写字母。而且,由于您的双键始终是均匀的,因此您最终会得到与您开始时相同的情况。您还需要根据R.Sharp指出将模数相应地更改为52。

答案 3 :(得分:0)

(abc.find(letter) + key) % 26

因为abc有大写和小写混合。应用于字符“C”的键(例如2)将导致“D”而不是“E”。