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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.primitives import padding from cryptography.hazmat.backends import default_backend import os import base64
class AES: def __init__(self): self.key: bytes = None self.iv: bytes = None
self.encryptor = None self.decryptor = None self.padder = None self.unpadder = None
self.initialized = False def generate_key(self): self.key = os.urandom(32) self.iv = os.urandom(16) return self def save_key_iv(self, key_file: str, iv_file: str): with open(key_file, "wb") as f: f.write(self.key) with open(iv_file, "wb") as f: f.write(self.iv) return self
def load_key_iv(self, key_file: str, iv_file: str): with open(key_file, "rb") as f: self.key = f.read() with open(iv_file, "rb") as f: self.iv = f.read() return self def save_key_hex(self, key_file: str, iv_file: str): with open(key_file, "w", encoding='utf-8-sig') as f: f.write(self.byte_to_hex(self.key)) with open(iv_file, "w", encoding='utf-8-sig') as f: f.write(self.byte_to_hex(self.iv)) return self
def load_key_hex(self, key_file: str, iv_file: str): with open(key_file, "r", encoding='utf-8-sig') as f: self.key = self.hex_to_byte(f.read()) with open(iv_file, "r", encoding='utf-8-sig') as f: self.iv = self.hex_to_byte(f.read()) return self def init(self): self.cipher = Cipher(algorithms.AES256(self.key), modes.CBC(self.iv), backend=default_backend()) self.encryptor = self.cipher.encryptor() self.decryptor = self.cipher.decryptor() self.padder = padding.PKCS7(128).padder() self.unpadder = padding.PKCS7(128).unpadder() self.initialized = True return self def encrypt(self, data: bytes) -> bytes: self.init() padded_data = self.padder.update(data) + self.padder.finalize() ciphertext = self.encryptor.update(padded_data) + self.encryptor.finalize() return ciphertext def decrypt(self, ciphertext: bytes) -> bytes: self.init() decrypted_padded_data = self.decryptor.update(ciphertext) + self.decryptor.finalize() decrypted_data = self.unpadder.update(decrypted_padded_data) + self.unpadder.finalize() return decrypted_data def byte_to_base64(self, data: bytes) -> str: return base64.b64encode(data).decode("utf-8") def base64_to_byte(self, data: str) -> bytes: return base64.b64decode(data) def byte_to_hex(self, data: bytes) -> str: return data.hex()
def hex_to_byte(self, data: str) -> bytes: return bytes.fromhex(data)
|