1e41f4b71Sopenharmony_ci# Encryption and Decryption with an AES Symmetric Key (ECB Mode) (ArkTS)
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci
4e41f4b71Sopenharmony_ciFor details about the algorithm specifications, see [AES](crypto-sym-encrypt-decrypt-spec.md#aes).
5e41f4b71Sopenharmony_ci
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ci**Encryption**
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci
10e41f4b71Sopenharmony_ci1. Use [cryptoFramework.createSymKeyGenerator](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatesymkeygenerator) and [SymKeyGenerator.generateSymKey](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#generatesymkey-1) to generate a 128-bit AES symmetric key (**SymKey**).
11e41f4b71Sopenharmony_ci   
12e41f4b71Sopenharmony_ci   In addition to the example in this topic, [AES](crypto-sym-key-generation-conversion-spec.md#aes) and [Randomly Generating a Symmetric Key](crypto-generate-sym-key-randomly.md) may help you better understand how to generate an AES symmetric key. Note that the input parameters in the reference documents may be different from those in the example below.
13e41f4b71Sopenharmony_ci
14e41f4b71Sopenharmony_ci2. Use [cryptoFramework.createCipher](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatecipher) with the string parameter **'AES128|ECB|PKCS7'** to create a **Cipher** instance. The key type is **AES128**, block cipher mode is **ECB**, and the padding mode is **PKCS7**.
15e41f4b71Sopenharmony_ci
16e41f4b71Sopenharmony_ci3. Use [Cipher.init](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#init-1) to initialize the **Cipher** instance. In the **Cipher.init** API, set **opMode** to **CryptoMode.ENCRYPT_MODE** (encryption), **key** to **SymKey** (the key for encryption), and **params** to **IvParamsSpec** corresponding to the ECB mode.
17e41f4b71Sopenharmony_ci
18e41f4b71Sopenharmony_ci4. If a small amount of data is to be encrypted, use [Cipher.doFinal](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#dofinal-1) after **Cipher.init** to generate the ciphertext.
19e41f4b71Sopenharmony_ci
20e41f4b71Sopenharmony_ci**Decryption**
21e41f4b71Sopenharmony_ci
22e41f4b71Sopenharmony_ci
23e41f4b71Sopenharmony_ci1. Use [Cipher.init](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#init-1) to initialize the **Cipher** instance. In the **Cipher.init** API, set **opMode** to **CryptoMode.DECRYPT_MODE** (decryption), **key** to **SymKey** (the key for decryption), and **params** to **IvParamsSpec** corresponding to the ECB mode.
24e41f4b71Sopenharmony_ci
25e41f4b71Sopenharmony_ci2. If a small amount of data is to be decrypted, you can use [Cipher.doFinal](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#dofinal-1) after **Cipher.init** to generate the plaintext.
26e41f4b71Sopenharmony_ci
27e41f4b71Sopenharmony_ci
28e41f4b71Sopenharmony_ci- Example (using asynchronous APIs):
29e41f4b71Sopenharmony_ci
30e41f4b71Sopenharmony_ci  ```ts
31e41f4b71Sopenharmony_ci  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
32e41f4b71Sopenharmony_ci  import { buffer } from '@kit.ArkTS';
33e41f4b71Sopenharmony_ci
34e41f4b71Sopenharmony_ci  // Encrypt the message.
35e41f4b71Sopenharmony_ci  async function encryptMessagePromise(symKey: cryptoFramework.SymKey, plainText: cryptoFramework.DataBlob) {
36e41f4b71Sopenharmony_ci    let cipher = cryptoFramework.createCipher('AES128|ECB|PKCS7');
37e41f4b71Sopenharmony_ci    await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null);
38e41f4b71Sopenharmony_ci    let cipherData = await cipher.doFinal(plainText);
39e41f4b71Sopenharmony_ci    return cipherData;
40e41f4b71Sopenharmony_ci  }
41e41f4b71Sopenharmony_ci  // Decrypt the message.
42e41f4b71Sopenharmony_ci  async function decryptMessagePromise(symKey: cryptoFramework.SymKey, cipherText: cryptoFramework.DataBlob) {
43e41f4b71Sopenharmony_ci    let decoder = cryptoFramework.createCipher('AES128|ECB|PKCS7');
44e41f4b71Sopenharmony_ci    await decoder.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, null);
45e41f4b71Sopenharmony_ci    let decryptData = await decoder.doFinal(cipherText);
46e41f4b71Sopenharmony_ci    return decryptData;
47e41f4b71Sopenharmony_ci  }
48e41f4b71Sopenharmony_ci
49e41f4b71Sopenharmony_ci  async function genSymKeyByData(symKeyData: Uint8Array) {
50e41f4b71Sopenharmony_ci    let symKeyBlob: cryptoFramework.DataBlob = { data: symKeyData };
51e41f4b71Sopenharmony_ci    let aesGenerator = cryptoFramework.createSymKeyGenerator('AES128');
52e41f4b71Sopenharmony_ci    let symKey = await aesGenerator.convertKey(symKeyBlob);
53e41f4b71Sopenharmony_ci    console.info('convertKey success');
54e41f4b71Sopenharmony_ci    return symKey;
55e41f4b71Sopenharmony_ci  }
56e41f4b71Sopenharmony_ci
57e41f4b71Sopenharmony_ci  async function aesECB() {
58e41f4b71Sopenharmony_ci    try {
59e41f4b71Sopenharmony_ci      let keyData = new Uint8Array([83, 217, 231, 76, 28, 113, 23, 219, 250, 71, 209, 210, 205, 97, 32, 159]);
60e41f4b71Sopenharmony_ci      let symKey = await genSymKeyByData(keyData);
61e41f4b71Sopenharmony_ci      let message = "This is a test";
62e41f4b71Sopenharmony_ci      let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
63e41f4b71Sopenharmony_ci      let encryptText = await encryptMessagePromise(symKey, plainText);
64e41f4b71Sopenharmony_ci      let decryptText = await decryptMessagePromise(symKey, encryptText);
65e41f4b71Sopenharmony_ci      if (plainText.data.toString() === decryptText.data.toString()) {
66e41f4b71Sopenharmony_ci        console.info('decrypt ok');
67e41f4b71Sopenharmony_ci        console.info('decrypt plainText: ' + buffer.from(decryptText.data).toString('utf-8'));
68e41f4b71Sopenharmony_ci      } else {
69e41f4b71Sopenharmony_ci        console.error('decrypt failed');
70e41f4b71Sopenharmony_ci      }
71e41f4b71Sopenharmony_ci    } catch (error) {
72e41f4b71Sopenharmony_ci      console.error(`AES ECB "${error}", error code: ${error.code}`);
73e41f4b71Sopenharmony_ci    }
74e41f4b71Sopenharmony_ci  }
75e41f4b71Sopenharmony_ci  ```
76e41f4b71Sopenharmony_ci
77e41f4b71Sopenharmony_ci- Example (using synchronous APIs):
78e41f4b71Sopenharmony_ci
79e41f4b71Sopenharmony_ci  ```ts
80e41f4b71Sopenharmony_ci  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
81e41f4b71Sopenharmony_ci  import { buffer } from '@kit.ArkTS';
82e41f4b71Sopenharmony_ci
83e41f4b71Sopenharmony_ci  // Encrypt the message.
84e41f4b71Sopenharmony_ci  function encryptMessage(symKey: cryptoFramework.SymKey, plainText: cryptoFramework.DataBlob) {
85e41f4b71Sopenharmony_ci    let cipher = cryptoFramework.createCipher('AES128|ECB|PKCS7');
86e41f4b71Sopenharmony_ci    cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null);
87e41f4b71Sopenharmony_ci    let cipherData = cipher.doFinalSync(plainText);
88e41f4b71Sopenharmony_ci    return cipherData;
89e41f4b71Sopenharmony_ci  }
90e41f4b71Sopenharmony_ci  // Decrypt the message.
91e41f4b71Sopenharmony_ci  function decryptMessage(symKey: cryptoFramework.SymKey, cipherText: cryptoFramework.DataBlob) {
92e41f4b71Sopenharmony_ci    let decoder = cryptoFramework.createCipher('AES128|ECB|PKCS7');
93e41f4b71Sopenharmony_ci    decoder.initSync(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, null);
94e41f4b71Sopenharmony_ci    let decryptData = decoder.doFinalSync(cipherText);
95e41f4b71Sopenharmony_ci    return decryptData;
96e41f4b71Sopenharmony_ci  }
97e41f4b71Sopenharmony_ci
98e41f4b71Sopenharmony_ci  async function genSymKeyByData(symKeyData: Uint8Array) {
99e41f4b71Sopenharmony_ci    let symKeyBlob: cryptoFramework.DataBlob = { data: symKeyData };
100e41f4b71Sopenharmony_ci    let aesGenerator = cryptoFramework.createSymKeyGenerator('AES128');
101e41f4b71Sopenharmony_ci    let symKey = await aesGenerator.convertKey(symKeyBlob);
102e41f4b71Sopenharmony_ci    console.info('convertKey success');
103e41f4b71Sopenharmony_ci    return symKey;
104e41f4b71Sopenharmony_ci  }
105e41f4b71Sopenharmony_ci
106e41f4b71Sopenharmony_ci  async function main() {
107e41f4b71Sopenharmony_ci    try {
108e41f4b71Sopenharmony_ci      let keyData = new Uint8Array([83, 217, 231, 76, 28, 113, 23, 219, 250, 71, 209, 210, 205, 97, 32, 159]);
109e41f4b71Sopenharmony_ci      let symKey = await genSymKeyByData(keyData);
110e41f4b71Sopenharmony_ci      let message = "This is a test";
111e41f4b71Sopenharmony_ci      let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
112e41f4b71Sopenharmony_ci      let encryptText = encryptMessage(symKey, plainText);
113e41f4b71Sopenharmony_ci      let decryptText = decryptMessage(symKey, encryptText);
114e41f4b71Sopenharmony_ci      if (plainText.data.toString() === decryptText.data.toString()) {
115e41f4b71Sopenharmony_ci        console.info('decrypt ok');
116e41f4b71Sopenharmony_ci        console.info('decrypt plainText: ' + buffer.from(decryptText.data).toString('utf-8'));
117e41f4b71Sopenharmony_ci      } else {
118e41f4b71Sopenharmony_ci        console.error('decrypt failed');
119e41f4b71Sopenharmony_ci      }
120e41f4b71Sopenharmony_ci    } catch (error) {
121e41f4b71Sopenharmony_ci      console.error(`AES ECB "${error}", error code: ${error.code}`);
122e41f4b71Sopenharmony_ci    }
123e41f4b71Sopenharmony_ci  }
124e41f4b71Sopenharmony_ci  ```
125