首页 > 解决方案 > 有时在加密数据时,我的代码会返回带有奇怪符号的特定结果

问题描述

我正在用 python3 学习密码学

现在我正在研究凯撒密码,这是我的问题

我尝试使用密钥 16 加密“hdjdyueeje”,结果是“zwzt??uuzu”

你能解释一下我做错了什么以及如何解决它

我的代码:

print("\n----------------Caesar_Cipher----------------\n")

print('  1) Crypt mode')
print("  2) Decrypt mode")

try:
    mode = int(input('\n  [#]  Enter number what you need (1,2) : '))

    if mode == 1:
        print("\n--------Crypting process is starting---------")
        key = int(input("\n  [#]  Enter here key which will be used to crypt data \n       (number from 1 to 25 including) --> "))

        if 1 >= key or key > 25:
            print("   You choosed wrong number. I will make it 1 automatically")  
            key = 1
        else:
            pass

        msg = input("\n  [#]  Now enter your message what you wanna crypt \
                \n    -->")
        print("")

        msgc = ""
        for letter in msg:
            x = ord(letter)
            y = chr(x + key)
            msgc += y

        print('\n Crypted data -->',msgc)
    elif mode == 2:
        print("\n-------Decrypting process is starting--------")

        key = int(input("\n  [#]  Enter here key which will be used to decrypt data \n       (number from 1 to 25 including) --> "))

        if 1 >= key or key > 25:
            print("   You choosed wrong number. I will make it 1 automatically")  
            key = 1
        else:
            pass

        msg = input("\n  [#]  Now enter your message what you wanna decrypt \
                \n    -->")
        print("")
        msgd = ""
        for letter in msg:
            x = ord(letter)
            y = chr(x - key)
            msgd += y

        print('\n Decrypted data -->',msgd)
    else:
        print("Number not defined")

就这样

标签: pythonencryption

解决方案


你的问题在这里:

x = ord(letter)
y = chr(x + key) # <- problem
msgc += y

如果没有足够的字母留下更高的代码,则字母表需要环绕。例如,当您尝试加密时,y您只能添加 1 来获取z. 如果密钥为 2,则您需要环绕并返回a. 这种“环绕”可以很容易地通过减去字母表的长度来完成。此版本的代码有效:

x = ord(letter)
y = x + key
if y > ord('z'):
    y -= 26
msgc += chr(y)

请注意,这只适用于小写字母。


推荐阅读