Python cryptograpy.fernet无法按预期正确解密符号

如何解决Python cryptograpy.fernet无法按预期正确解密符号

伙计们,我正在编写一个简单的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 -(这已成功解​​密了传递的文本)

$ python3 01_crypt.py -k
Key Generated -> b'N5Ll6414I8nvcMlBytk8VwdFC4oVZZZMTCVTLpQ9big='
$ python3 01_crypt.py -e "Some Sample Text to Encrypt"
b'gAAAAABfVMU3JxZOrwLIudKLAqzq5IhivhhkyvJ6TMDxM-MmVQywo4AiZ1zGK5F5gO5JFXfHznV5zPjz6sD8qhOpIR_60Hq4_YLVIV0ztPAWBjln6reg1S0='
$ python3 01_crypt.py -d
Some Sample Text to Encrypt

我的测试案例2 -(此功能无法正常工作

$ python3 01_crypt.py -k
Key Generated -> b'UDUpsIP-Ltjz8XGm-BUSwApXYE_L8eFl6rmE1yBbYW4='
$ python3 01_crypt.py -e "P@$$w0rD"
b'gAAAAABfVMX4tSIU4T1CM5Sw9jGR_O2cuIhccEM4htVTkerQD0YxWuCoUZeDwoeMIfpcP4HV7vYKmrxD22sf7yk27hGCdx0jQA=='
$ python3 01_crypt.py -d
P@4103w0rD

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

我不知道为什么会这样。我缺少重要的东西吗?请指教。 预先感谢!

附加说明

当我尝试不带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的使用是

NewbornBaby

has your Unix shell substitute the current PID for $$(恰好是4103)。

使用单引号避免替换。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?