from __future__ import annotations import base64 from urllib.parse import quote_plus, unquote_plus from cryptography.hazmat.decrepit.ciphers.algorithms import Blowfish from cryptography.hazmat.primitives.ciphers import Cipher, modes from cryptography.hazmat.primitives.padding import PKCS7 _SECURE_PDF_KEY = b"T1mC0nT4" def encrypt_secure_pdf_value(value: str) -> str: plaintext = str(value).encode("utf-8") padder = PKCS7(Blowfish.block_size).padder() padded = padder.update(plaintext) + padder.finalize() encryptor = Cipher(Blowfish(_SECURE_PDF_KEY), modes.ECB()).encryptor() ciphertext = encryptor.update(padded) + encryptor.finalize() encoded = base64.b64encode(ciphertext).decode("ascii") return quote_plus(encoded, safe="") def decrypt_secure_pdf_value(value: str) -> str: encoded = unquote_plus(str(value)) ciphertext = base64.b64decode(encoded, validate=True) decryptor = Cipher(Blowfish(_SECURE_PDF_KEY), modes.ECB()).decryptor() padded = decryptor.update(ciphertext) + decryptor.finalize() unpadder = PKCS7(Blowfish.block_size).unpadder() plaintext = unpadder.update(padded) + unpadder.finalize() return plaintext.decode("utf-8")