| @@ -1,82 +0,0 @@ | |||
| from Crypto.Cipher import AES | |||
| from Crypto.Hash import SHA256 | |||
| from Crypto.PublicKey import ECC | |||
| from Crypto.Util.Padding import pad, unpad | |||
| class ECC_AES: | |||
| def __init__(self, curve='P-256'): | |||
| self.curve = curve | |||
| self._aes_key = None | |||
| self._private_key = None | |||
| def _derive_aes_key(self, ecc_key, nonce): | |||
| if not self._aes_key: | |||
| hasher = SHA256.new() | |||
| hasher.update(ecc_key.export_key(format='DER') + nonce.encode()) | |||
| self._aes_key = hasher.digest()[:32] | |||
| return self._aes_key | |||
| def generate_key_pair(self): | |||
| private_key = ECC.generate(curve=self.curve) | |||
| public_key = private_key.public_key() | |||
| pem_private = private_key.export_key(format='PEM') | |||
| pem_public = public_key.export_key(format='PEM') | |||
| return pem_private, pem_public | |||
| def load_private_key(self, private_key_pem): | |||
| self._private_key = ECC.import_key(private_key_pem) | |||
| self._aes_key = None | |||
| def encrypt(self, text, nonce): | |||
| if not self._private_key: | |||
| raise ValueError("Private key not loaded") | |||
| # Generate AES key using ECC private key and nonce | |||
| aes_key = self._derive_aes_key(self._private_key, nonce) | |||
| # Encrypt data using AES key | |||
| cipher = AES.new(aes_key, AES.MODE_ECB) | |||
| padded_text = pad(text.encode(), AES.block_size) | |||
| ciphertext = cipher.encrypt(padded_text) | |||
| return ciphertext | |||
| def decrypt(self, ciphertext, nonce): | |||
| if not self._private_key: | |||
| raise ValueError("Private key not loaded") | |||
| # Generate AES key using ECC private key and nonce | |||
| aes_key = self._derive_aes_key(self._private_key, nonce) | |||
| # Decrypt data using AES key | |||
| cipher = AES.new(aes_key, AES.MODE_ECB) | |||
| padded_plaintext = cipher.decrypt(ciphertext) | |||
| plaintext = unpad(padded_plaintext, AES.block_size) | |||
| return plaintext.decode() | |||
| if __name__ == '__main__': | |||
| ecc_aes = ECC_AES() | |||
| # Generate key pairs for the user | |||
| private_key, public_key = ecc_aes.generate_key_pair() | |||
| ecc_aes.load_private_key(private_key) | |||
| nonce = "THIS-IS-USER-ID" | |||
| print(private_key) | |||
| # Encrypt a message | |||
| message = "Hello, this is a secret message!" | |||
| encrypted_message = ecc_aes.encrypt(message, nonce) | |||
| print(f"Encrypted message: {encrypted_message.hex()}") | |||
| # Decrypt the message | |||
| decrypted_message = ecc_aes.decrypt(encrypted_message, nonce) | |||
| print(f"Decrypted message: {decrypted_message}") | |||
| # Check if the original message and decrypted message are the same | |||
| assert message == decrypted_message, "Original message and decrypted message do not match" | |||