Python 3.x Python Cryptography.fernet不';t按预期正确解密符号

Python 3.x Python Cryptography.fernet不';t按预期正确解密符号,python-3.x,argparse,python-cryptography,fernet,Python 3.x,Argparse,Python Cryptography,Fernet,各位,我正在编写一个简单的cli工具来加密文本并根据传递的参数进行解密。 当我只使用文本时,效果很好。但当我传递一些符号时,它的行为很奇怪 我的源代码 import argparse from cryptography.fernet import Fernet def generate_key(): """ Generates a key and save it into a file """ key

各位,我正在编写一个简单的cli工具来加密文本并根据传递的参数进行解密。 当我只使用文本时,效果很好。但当我传递一些符号时,它的行为很奇怪

我的源代码

import argparse
from cryptography.fernet import Fernet


def generate_key():
    """
    Generates a key and save it into a file
    """
    key = Fernet.generate_key()
    with open("secret.key", "wb") as key_file:
        key_file.write(key)
    return key


def load_key():
    """
    Loads the key named 'secret.key' from current directory
    """
    return open("secret.key", "rb").read()


def encrypt_message(message):
    """
    Encrypts a message
    """
    key = load_key()
    encoded_msg = message.encode()
    f = Fernet(key)
    encrypted_message = f.encrypt(encoded_msg)

    with open("encrypted.txt", "wb") as encrypted_file:
        encrypted_file.write(encrypted_message)

    return encrypted_message


def decrypt_message(encrypted_msg):
    """
    Decrypt an encrypted message
    """
    key = load_key()
    f = Fernet(key)
    decrypted_message = f.decrypt(encrypted_msg)
    return decrypted_message.decode()


def Main():
    parser = argparse.ArgumentParser()
    parser.add_argument("-e", "--en_crypt", help="Pass the text to encrypt as an argument")
    parser.add_argument("-d", "--de_crypt", help="Pass the text to decrypt as an argument", action="store_true")
    parser.add_argument("-k", "--key", help="Generate the 'secret.key' file", action="store_true")
    args = parser.parse_args()

    if args.en_crypt:
        enc = encrypt_message(args.en_crypt)
        print(enc)

    if args.de_crypt:
        with open("encrypted.txt", "rb") as file:
            txt = file.read()
        print(decrypt_message(txt))

    if args.key:
        result = generate_key()
        print("Key Generated -> " + str(result))


if __name__ == "__main__":
    Main()
我的测试用例1-(这是成功解密通过的文本)

我的测试用例2-(这没有按预期工作)

根据测试用例2,我的预期输出应该与加密的
p@$$w0rD
相同,但它显示为
P@4103w0rD

我不知道为什么会这样。我错过了什么重要的事情吗?请给我一些建议。 提前谢谢

附加说明

import argparse
from cryptography.fernet import Fernet


def generate_key():
    """
    Generates a key and save it into a file
    """
    key = Fernet.generate_key()
    with open("secret.key", "wb") as key_file:
        key_file.write(key)
    return key


def load_key():
    """
    Loads the key named 'secret.key' from current directory
    """
    return open("secret.key", "rb").read()


def encrypt_message(message):
    """
    Encrypts a message
    """
    key = load_key()
    encoded_msg = message.encode()
    f = Fernet(key)
    encrypted_message = f.encrypt(encoded_msg)

    with open("encrypted.txt", "wb") as encrypted_file:
        encrypted_file.write(encrypted_message)

    return encrypted_message


def decrypt_message(encrypted_msg):
    """
    Decrypt an encrypted message
    """
    key = load_key()
    f = Fernet(key)
    decrypted_message = f.decrypt(encrypted_msg)
    return decrypted_message.decode()


def Main():
    parser = argparse.ArgumentParser()
    parser.add_argument("-e", "--en_crypt", help="Pass the text to encrypt as an argument")
    parser.add_argument("-d", "--de_crypt", help="Pass the text to decrypt as an argument", action="store_true")
    parser.add_argument("-k", "--key", help="Generate the 'secret.key' file", action="store_true")
    args = parser.parse_args()

    if args.en_crypt:
        enc = encrypt_message(args.en_crypt)
        print(enc)

    if args.de_crypt:
        with open("encrypted.txt", "rb") as file:
            txt = file.read()
        print(decrypt_message(txt))

    if args.key:
        result = generate_key()
        print("Key Generated -> " + str(result))


if __name__ == "__main__":
    Main()
当我在没有
argparse
的情况下尝试相同的工具时,它会按预期工作。请查看下面的代码

from cryptography.fernet import Fernet


def key_generate():
    """
    Generates a key and save it into a file
    """
    key = Fernet.generate_key()
    with open("secret.key", "wb") as key_file:
        key_file.write(key)
    return key


def load_keys():
    """
    Loads the generated key named 'secret.key' from current directory
    """
    return open("secret.key", "rb").read()


def encrypt_message(message):
    """
    Encrypts a message
    """
    key = load_keys()
    encoded_msg = message.encode()
    f = Fernet(key)
    encrypted_message = f.encrypt(encoded_msg)
    return encrypted_message


def decrypt_message(encrypted_msg):
    """
    Decrypt an encrypted message
    """
    key = load_keys()
    f = Fernet(key)
    decrypted_message = f.decrypt(encrypted_msg)
    # print(type(encrypted_msg))
    return decrypted_message.decode()


if __name__ == "__main__":
    key_generate()
    load_keys()

    PLAINTEXT = "P@$$w0rD"
    print("Plain Text", PLAINTEXT)

    ENCRYPTED_TEXT = encrypt_message(PLAINTEXT)
    print("Encrypted Text", ENCRYPTED_TEXT)

    DECRYPTED_TEXT = decrypt_message(ENCRYPTED_TEXT)
    print("Decrypted Text", DECRYPTED_TEXT)
输出

$python3 02_decrypt.py 
Plain Text P@$$w0rD
Encrypted Text b'gAAAAABfVMfzv7H--aTCaUBdHVs05VRbFmuqpnrt-7k1NCTY9FrGMZKH8y2pkKqZsu5oxRqRgp5DzyRHZhfmA9p_cgNniWfsNw=='
Decrypted Text P@$$w0rD

上述行为让我怀疑,
argparse
可能是罪魁祸首。请给出建议。

Argparse没有错,您对shell的使用是错误的

python3 01_crypt.py -e "P@$$w0rD" 
(碰巧是4103)

使用单引号避免替换

python3 01_crypt.py -e 'P@$$w0rD' 
python3 01_crypt.py -e 'P@$$w0rD'