# AES Encryption

`AesEncryption` is an implementation of the `Encryption` interface, offering Advanced Encryption Standard (AES) encryption and decryption services. It uses the Galois/Counter Mode (GCM) of operation which is suitable for encrypting individual files or strings of data.

### Setup

For proper functioning, an AES secret key needs to be either generated or imported into the `AesEncryption` class. Once set up, you can utilize the class methods to encrypt and decrypt data using the AES-GCM mechanism.

Note: If you're integrating `AesEncryption` with `EncryptionHandler`, ensure that the secret key is either generated or imported in the `AesEncryption` instance beforehand. Otherwise, it won't be possible to encrypt/decrypt data.

### Usage

Below is a demonstration of how to use the `AesEncryption` class.

```ts
import { AesEncryption } from '@4thtech-sdk/encryption';
import { arrayBufferToString, stringToArrayBuffer } from '@4thtech-sdk/utils';

// Create an instance of AesEncryption
const aesEncryption = new AesEncryption();

// Generate a secret key
await aesEncryption.generateSecretKey();

// Export the generated secret key
const exportedSecretKeyHex = await aesEncryption.exportSecretKey();

// Or import an existing secret key
// const secretKeyHex = 'YOUR_SECRET_KEY_IN_HEX';
// await aesEncryption.importSecretKey(secretKeyHex);

// Or use the static method to create an AesEncryption instance from a secret key
// const aesEncryption = await AesEncryption.fromSecretKey(secretKeyHex);

// Encrypt data
const plainData = stringToArrayBuffer('Your data to be encrypted');
const encryptedData = await aesEncryption.encrypt(plainData);

// Decrypt data
const decryptedDataBuffer = await aesEncryption.decrypt(encryptedData);
const decryptedData = arrayBufferToString(decryptedDataBuffer);
```
