AlreadyFinalized(“上下文已经确定。”)

2024-10-03 17:20:01 发布

您现在位置:Python中文网/ 问答频道 /正文

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import padding
import os

class EncryptionManager:
    def __init__(self):
        key = os.urandom(32)
        iv = os.urandom(16)
        aesContext = Cipher(algorithms.AES(key),
        modes.CBC(iv),
        backend=default_backend())
        self.encryptor = aesContext.encryptor()
        self.decryptor = aesContext.decryptor()
        self.padder = padding.PKCS7(128).padder()
        self.unpadder = padding.PKCS7(128).unpadder()

    def update_encryptor(self, plaintext):
        return self.encryptor.update(self.padder.update(plaintext))

    def finalize_encryptor(self):
        return self.encryptor.update(self.padder.finalize()) + self.encryptor.finalize()

    def update_decryptor(self, ciphertext):
        return self.unpadder.update(self.decryptor.update(ciphertext))

    def finalize_decryptor(self):
        return self.unpadder.update(self.decryptor.finalize()) + self.unpadder.finalize()
 
# Auto generate key/IV for encryption
manager = EncryptionManager()

plaintexts = [
b"SHORT",
b"MEDIUM MEDIUM MEDIUM",
b"LONG LONG LONG LONG LONG LONG"
]

ciphertexts = []

for m in plaintexts:
    ciphertexts.append(manager.update_encryptor(m))
    ciphertexts.append(manager.finalize_encryptor())

for c in ciphertexts:
    print("Recovered", manager.update_decryptor(c))
    print("Recovered", manager.finalize_decryptor())

这个例外总是会引起:

raise AlreadyFinalized("Context was already finalized.") cryptography.exceptions.AlreadyFinalized: Context was already finalized.

当“明文”列表中的第二项中的for循环失败时,会出现此错误

for m in plaintexts:
    ciphertexts.append(manager.update_encryptor(m)) # If m == plaintexts[1] the exception raise here
    ciphertexts.append(manager.finalize_encryptor())

Tags: importselfforreturndefmanagerupdatelong