1# Randomly Generating a Symmetric Key (ArkTS)
2
3
4This topic uses AES and SM4 as an example to describe how to generate a symmetric key and obtain the binary data.
5
6
7The symmetric key (**SymKey**) object created can be used for subsequent encryption and decryption operations, and the binary data can be used for key storage and transfer.
8
9
10## Randomly Generating an AES Key
11
12For details about the algorithm specifications, see [AES](crypto-sym-key-generation-conversion-spec.md#aes).
13
141. Use [cryptoFramework.createSymKeyGenerator](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatesymkeygenerator) with the string parameter **'AES256'** to create a symmetric key generator (**SymKeyGenerator**) object for a 256-bit AES key.
15
162. Use [SymKeyGenerator.generateSymKey](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#generatesymkey-1) to randomly generate a symmetric key (**SymKey**) object.
17
183. Use [SymKey.getEncoded](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#getencoded) to obtain the binary data of the key.
19
20- Example: Randomly generate a 256-bit AES key (using promise-based APIs).
21
22  ```ts
23  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
24
25  function testGenerateAesKey() {
26    // Create a SymKeyGenerator instance.
27    let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256');
28    // Use SymKeyGenerator to randomly generate a symmetric key.
29    let promiseSymKey = symKeyGenerator.generateSymKey();
30    promiseSymKey.then(key => {
31      // Obtain the binary data of the symmetric key and output a 256-bit key, which is of 32 bytes.
32      let encodedKey = key.getEncoded();
33      console.info('key hex:' + encodedKey.data);
34    });
35  }
36  ```
37
38- Example using synchronous API [generateSymKeySync](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#generatesymkeysync12):
39  ```ts
40  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
41
42  function testSyncGenerateAesKey() {
43    // Create a SymKeyGenerator instance.
44    let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256');
45    // Use SymKeyGenerator to randomly generate a symmetric key.
46    let promiseSymKey = symKeyGenerator.generateSymKeySync();
47    // Obtain the binary data of the symmetric key and output a 256-bit key, which is of 32 bytes.
48    let encodedKey = promiseSymKey.getEncoded();
49    console.info('key hex:' + encodedKey.data);
50  }
51  ```
52
53
54## Randomly Generating an SM4 Key
55
56For details about the algorithm specifications, see [SM4](crypto-sym-key-generation-conversion-spec.md#sm4).
57
581. Use [cryptoFramework.createSymKeyGenerator](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatesymkeygenerator) with the string parameter **'SM4_128'** to create a symmetric key generator (**SymKeyGenerator**) object for a 128-bit SM4 key.
59   If you need to use other algorithms, modify the string parameter.
60
612. Use [SymKeyGenerator.generateSymKey](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#generatesymkey-1) to randomly generate a symmetric key (**SymKey**) object.
62
633. Use [SymKey.getEncoded](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#getencoded) to obtain the binary data of the key.
64
65- Example: Randomly generate a 128-bit SM4 key (using promise-based APIs).
66
67  ```ts
68  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
69
70  function testGenerateSM4Key() {
71    // Create a SymKeyGenerator instance.
72    let symKeyGenerator = cryptoFramework.createSymKeyGenerator('SM4_128');
73    // Use SymKeyGenerator to randomly generate a symmetric key.
74    let promiseSymKey = symKeyGenerator.generateSymKey();
75    promiseSymKey.then(key => {
76      // Obtain the binary data of the symmetric key and output a 128-bit byte stream, which is of 16 bytes.
77      let encodedKey = key.getEncoded();
78      console.info('key hex:' + encodedKey.data);
79    });
80  }
81  ```
82
83- Example using synchronous API [generateSymKeySync](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#generatesymkeysync12):
84  ```ts
85  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
86
87  function testSyncGenerateSm4Key() {
88    // Create a SymKeyGenerator instance.
89    let symKeyGenerator = cryptoFramework.createSymKeyGenerator('SM4_128');
90    // Use SymKeyGenerator to randomly generate a symmetric key.
91    let promiseSymKey = symKeyGenerator.generateSymKeySync();
92    // Obtain the binary data of the symmetric key and output a 128-bit byte stream, which is of 16 bytes.
93    let encodedKey = promiseSymKey.getEncoded();
94    console.info('key hex:' + encodedKey.data);
95  }
96  ```
97