Python 字节 & 列表 & 加密

Python Bytes & Lists & Encryption

我正在使用 Fernet 通过 this implementation 加密我的数据。假设我有这三个数据:

data = [fernet.encrypt("Hello".encode()), fernet.encrypt("Stack".encode()), fernet.encrypt("Overflow".encode())]

在这个操作之后,Python自动将bytes转换为string,我正在将它们写入一个csv文件。当我需要像这样解密它们时:

fernet.decrypt(data)

它给我一个错误,比如你只能解密字节等。我还检查了我在 csv 文件中的数据已经是字节但字符串形式。

b'gAAAAABiVUw5BzOkOv3VxlV5xa57Iaf0R4dzPbgsrnheAME8uYeslCZfTx9GeyRWe7l9VMM-gdDXiPZ4zsAXoXkG6T1dyXH6EztcqirrPhXX3YCt65_3xXvykVTDPdbEXs51cHvR-3HH'

fernet.encrypt returns bytes(我猜,你没有具体说明你使用的是哪个实现,我猜 this one)。 .decode() 他们到一个字符串。那么您的 CSV 将包含“gAAA...”,而不是“b'gAAA...'”。当再次从 CSV 中读取这些内容时,.encode() 将字符串传递给 fernet.decrypt.

  • fernet.encrypt returns bytes
  • bytes.decode()bytes 变成 str
  • CSV 想要 str
  • str.encode()str 变成 bytes
  • fernet.decrypt 想要 bytes

编码、写入文本、读取和解码的 end-to-end 使用示例。

Fernet 文档可以是 referenced here

from cryptography.fernet import Fernet

# Auto-generate a secret key.
key = Fernet.generate_key()
f = Fernet(key)

# Encode the string 'Hello' and encrypt.
encoded = f.encrypt('Hello'.encode())

这将创建一个字节串(一个 bytes 对象)作为:

b'gAAAAABiVVOOeO-hUG2QaKCVOyshntpbqVbxnexIVsFr7ttBGmKhHlDeM7jkTCjPPGphZxbh4D15X82pts3hKes12DjzwI8_jQ=='

写入、读取和解密:

# Write the *decoded* encrypted string to a TXT file.
with open('/tmp/encoded.txt', 'w') as fh:
    fh.write(encoded.decode())
    
# Read the encrypted string from TXT file.
with open('/tmp/encoded.txt') as fh:
    encoded = fh.read()
    
# Encode the string, pass through fernet for decryption, 
# and decode the bytes output.
f.decrypt(encoded.encode()).decode()

输出:

'Hello'