Spaces:
Running
Running
File size: 1,776 Bytes
92c34be |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import padding
from base64 import b64encode, b64decode
import os
class AESCipher:
def __init__(self, key: str):
self.backend = default_backend()
salt = os.urandom(16)
kdf = PBKDF2HMAC(
algorithm=hashes.SHA256(),
length=32,
salt=salt,
iterations=100000,
backend=self.backend
)
self.key = kdf.derive(key.encode())
self.iv = os.urandom(16)
def encrypt(self, plaintext: str) -> str:
padder = padding.PKCS7(algorithms.AES.block_size).padder()
padded_data = padder.update(plaintext.encode()) + padder.finalize()
cipher = Cipher(algorithms.AES(self.key), modes.CBC(self.iv), backend=self.backend)
encryptor = cipher.encryptor()
encrypted_data = encryptor.update(padded_data) + encryptor.finalize()
return b64encode(self.iv + encrypted_data).decode('utf-8')
def decrypt(self, ciphertext: str) -> str:
encrypted_data = b64decode(ciphertext)
iv = encrypted_data[:16]
encrypted_data = encrypted_data[16:]
cipher = Cipher(algorithms.AES(self.key), modes.CBC(iv), backend=self.backend)
decryptor = cipher.decryptor()
padded_plaintext = decryptor.update(encrypted_data) + decryptor.finalize()
unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()
plaintext = unpadder.update(padded_plaintext) + unpadder.finalize()
return plaintext.decode('utf-8')
|