Fernet 密钥的 Python 加密和解密错误必须是 32 个 url 安全的 base64 编码字节

问题描述 投票:0回答:1

下面是我尝试使用 Python 进行加密和解密的代码,在解密时我收到以下错误。先谢谢您的帮助 代码:

#!usr/bin/env python
from cryptography.fernet import Fernet
encrypted_message=''
secretkey=''

def encrypt_message(message):
    key=Fernet.generate_key()
    secretkey=key
    encoded_message=message.encode()
    f=Fernet(key)
    encrypted_message=f.encrypt(encoded_message)

    print('encrypted message',encrypted_message)

def decrypt_message(message):
    print("message recieved in decrypt block", message)
    #key=Fernet.generate_key()
    f=Fernet(secretkey)
    return f.decrypt(message)

    print(decrypted_message)

if __name__=="__main__":
    #encrypt_message("#h\"53x8S^U\'yzA")
    print(decrypt_message(encrypt_message("#h\"53x8S^U\'yzA")))

错误:

('encrypted message', 'gAAAAABfX2keyhbp5F2A7vvE67qPiv-UkCfdeXXcDrFzTbtEqtLxFKdV8E0yN5OPrFwXH8-P8Un9U-bCI-2xFAKFKSBv-Y_yfA==')
('message recieved in decrypt block', None)
Traceback (most recent call last):
  File "encrypt.py", line 25, in <module>
    print(decrypt_message(encrypt_message("#h\"53x8S^U\'yzA")))
  File "encrypt.py", line 18, in decrypt_message
    f=Fernet(secretkey)
  File "/usr/lib/python2.7/dist-packages/cryptography/fernet.py", line 37, in __init__
    "Fernet key must be 32 url-safe base64-encoded bytes."
ValueError: Fernet key must be 32 url-safe base64-encoded bytes.
python-2.7
1个回答
0
投票

在函数decrypt_message()中,您没有创建解密文件/字符串所需的Fernet实例。您将生成一个新密钥,该密钥必须与 encrypt_message() 函数中创建的密钥相同。

因此你的decrypt_message()应该看起来像这样:

def decrypt_message(message, key):
    print("message recieved in decrypt block", message)
    fernet = Fernet(key)

通过此修改可以工作,但您仍然可能收到相同的错误:

ValueError:Fernet 密钥必须是 32 个 url 安全的 base64 编码字节。

如果错误仍然存在,那么您需要在创建 Fernet 实例时在您的 crypto_message() 中实现此方法:

import pathlib

fernet = Fernet(pathlib.Path(self.key_file_path).read_bytes())
© www.soinside.com 2019 - 2024. All rights reserved.