from Crypto.Cipher import AES from Crypto.Protocol.SecretSharing import Shamir from Crypto.Random import get_random_bytes from Crypto.Util.Padding import unpad from base64 import b64decode def decrypt(ciphertext_iv_hex: str, key: bytes): """ Decrypts data encrypted using Web Crypto API with AES-GCM in Python. Args: ciphertext_iv_hex (str): Encrypted data as hex string, in format "IV.CIPHERTEXT". key (bytes): The decryption key as a byte array. Returns: str: The decrypted plaintext message. """ try: # Split IV and ciphertext from hex string iv_hex, ciphertext_hex = ciphertext_iv_hex.split(".") iv_bytes = bytes.fromhex(iv_hex) # print([b for b in iv_bytes]) ciphertext_bytes = bytes.fromhex(ciphertext_hex) # print([b for b in ciphertext_bytes]) # Create AES-GCM cipher object with 128-bit tag (for compatibility with Web Crypto) cipher = AES.new(key, AES.MODE_CBC, iv=iv_bytes) # Decrypt the ciphertext (assuming authentication is handled elsewhere) decrypted_bytes = cipher.decrypt(ciphertext_bytes) # decrypted_text = unpad(decrypted_bytes, AES.block_size) # print("Decrypted ggg:", decrypted_text) # cb = [b for b in decrypted_bytes] print("Decrypted bytes:", decrypted_bytes.replace(b"\x05", b"")) decrypted_text = decrypted_bytes.decode("utf-8") # Assuming UTF-8 encoding return decrypted_text except ValueError as e: print("Decryption error:", e) return None # Return None on decryption failure # Example usage key = b"YourSecretKey1234"[:16] # Keep this key secure! encrypted_data = "714fd62d80c40154f87d1d174b1d01bf.ca73441f070a344512f85474372e7329ec01722a4a28699218f9bcd13bc81c3d87c80e4b81859f39df70917b54fc6df38bb222d749e5d20c5e1687dbc20956fb" # Get this from JavaScript decrypted_text = decrypt(encrypted_data, key) print("Decrypted message:", decrypted_text) print("http://localhost:3000/uploads/photo_2024-03-19_01-44-38.jpg".encode())