1e41f4b71Sopenharmony_ci# Randomly Generating a Symmetric Key (C/C++)
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci
4e41f4b71Sopenharmony_ciThe following uses AES and SM4 as an example to describe how to randomly generate a symmetric key (**OH_CryptoSymKey**).
5e41f4b71Sopenharmony_ci
6e41f4b71Sopenharmony_ciThe symmetric key object can be used for subsequent encryption and decryption.
7e41f4b71Sopenharmony_ci
8e41f4b71Sopenharmony_ci## Adding the Dynamic Library in the CMake Script
9e41f4b71Sopenharmony_ci```txt
10e41f4b71Sopenharmony_ci   target_link_libraries(entry PUBLIC libohcrypto.so)
11e41f4b71Sopenharmony_ci```
12e41f4b71Sopenharmony_ci
13e41f4b71Sopenharmony_ci## Randomly Generating an AES Key
14e41f4b71Sopenharmony_ci
15e41f4b71Sopenharmony_ciFor details about the algorithm specifications, see [AES](crypto-sym-key-generation-conversion-spec.md#aes).
16e41f4b71Sopenharmony_ci
17e41f4b71Sopenharmony_ci1. Use [OH_CryptoSymKeyGenerator_Create](../../reference/apis-crypto-architecture-kit/_crypto_sym_key_api.md#oh_cryptosymkeygenerator_create) with the string parameter **'AES256'** to create a symmetric key generator (**OH_CryptoSymKeyGenerator**) object for a 256-bit AES key.
18e41f4b71Sopenharmony_ci2. Use [OH_CryptoSymKeyGenerator_Generate](../../reference/apis-crypto-architecture-kit/_crypto_sym_key_api.md#oh_cryptosymkeygenerator_generate) to randomly generate a symmetric key object (**OH_CryptoSymKey**).
19e41f4b71Sopenharmony_ci3. Use [OH_CryptoSymKey_GetKeyData](../../reference/apis-crypto-architecture-kit/_crypto_sym_key_api.md#oh_cryptosymkey_getkeydata) to obtain the binary data of the key object.
20e41f4b71Sopenharmony_ci
21e41f4b71Sopenharmony_ci**Example**
22e41f4b71Sopenharmony_ci
23e41f4b71Sopenharmony_ci
24e41f4b71Sopenharmony_ci```c++
25e41f4b71Sopenharmony_ci#include "CryptoArchitectureKit/crypto_common.h"
26e41f4b71Sopenharmony_ci#include "CryptoArchitectureKit/crypto_sym_key.h"
27e41f4b71Sopenharmony_ci
28e41f4b71Sopenharmony_cistatic OH_Crypto_ErrCode testGenerateSymKey()
29e41f4b71Sopenharmony_ci{
30e41f4b71Sopenharmony_ci    OH_CryptoSymKeyGenerator *ctx = nullptr;
31e41f4b71Sopenharmony_ci    OH_CryptoSymKey *keyCtx = nullptr;
32e41f4b71Sopenharmony_ci    Crypto_DataBlob out = {.data = nullptr, .len = 0};
33e41f4b71Sopenharmony_ci    OH_Crypto_ErrCode ret = OH_CryptoSymKeyGenerator_Create("AES256", &ctx);
34e41f4b71Sopenharmony_ci    if (ret != CRYPTO_SUCCESS) {
35e41f4b71Sopenharmony_ci        return ret;
36e41f4b71Sopenharmony_ci    }
37e41f4b71Sopenharmony_ci    ret = OH_CryptoSymKeyGenerator_Generate(ctx, &keyCtx);
38e41f4b71Sopenharmony_ci    if (ret != CRYPTO_SUCCESS) {
39e41f4b71Sopenharmony_ci        OH_CryptoSymKeyGenerator_Destroy(ctx);
40e41f4b71Sopenharmony_ci        return ret;
41e41f4b71Sopenharmony_ci    }
42e41f4b71Sopenharmony_ci    ret = OH_CryptoSymKey_GetKeyData(keyCtx, &out);
43e41f4b71Sopenharmony_ci    OH_CryptoSymKeyGenerator_Destroy(ctx);
44e41f4b71Sopenharmony_ci    OH_CryptoSymKey_Destroy(keyCtx);
45e41f4b71Sopenharmony_ci    if (ret != CRYPTO_SUCCESS) {
46e41f4b71Sopenharmony_ci        return ret;
47e41f4b71Sopenharmony_ci    }
48e41f4b71Sopenharmony_ci    OH_Crypto_FreeDataBlob(&out);
49e41f4b71Sopenharmony_ci    return ret;
50e41f4b71Sopenharmony_ci}
51e41f4b71Sopenharmony_ci```
52e41f4b71Sopenharmony_ci
53e41f4b71Sopenharmony_ci## Randomly Generating an SM4 Key
54e41f4b71Sopenharmony_ci
55e41f4b71Sopenharmony_ciFor details about the algorithm specifications, see [SM4](crypto-sym-key-generation-conversion-spec.md#sm4).
56e41f4b71Sopenharmony_ci
57e41f4b71Sopenharmony_ci1. Use [OH_CryptoSymKeyGenerator_Create](../../reference/apis-crypto-architecture-kit/_crypto_sym_key_api.md#oh_cryptosymkeygenerator_create) with the string parameter **'SM4_128'** to create a symmetric key generator (**OH_CryptoSymKeyGenerator**) object for a 128-bit SM4 key.
58e41f4b71Sopenharmony_ci2. Use [OH_CryptoSymKeyGenerator_Generate](../../reference/apis-crypto-architecture-kit/_crypto_sym_key_api.md#oh_cryptosymkeygenerator_generate) to randomly generate a symmetric key object (**OH_CryptoSymKey**).
59e41f4b71Sopenharmony_ci3. Use [OH_CryptoSymKey_GetKeyData](../../reference/apis-crypto-architecture-kit/_crypto_sym_key_api.md#oh_cryptosymkey_getkeydata) to obtain the binary data of the key object.
60e41f4b71Sopenharmony_ci
61e41f4b71Sopenharmony_ci**Example**
62e41f4b71Sopenharmony_ci
63e41f4b71Sopenharmony_ci
64e41f4b71Sopenharmony_ci```c++
65e41f4b71Sopenharmony_ci#include "CryptoArchitectureKit/crypto_common.h"
66e41f4b71Sopenharmony_ci#include "CryptoArchitectureKit/crypto_sym_key.h"
67e41f4b71Sopenharmony_ci
68e41f4b71Sopenharmony_cistatic OH_Crypto_ErrCode testGenerateSM4Key()
69e41f4b71Sopenharmony_ci{
70e41f4b71Sopenharmony_ci    OH_CryptoSymKeyGenerator *ctx = nullptr;
71e41f4b71Sopenharmony_ci    OH_CryptoSymKey *keyCtx = nullptr;
72e41f4b71Sopenharmony_ci    Crypto_DataBlob out = {.data = nullptr, .len = 0};
73e41f4b71Sopenharmony_ci    OH_Crypto_ErrCode ret = OH_CryptoSymKeyGenerator_Create("SM4_128", &ctx);
74e41f4b71Sopenharmony_ci    if (ret != CRYPTO_SUCCESS) {
75e41f4b71Sopenharmony_ci        return ret;
76e41f4b71Sopenharmony_ci    }
77e41f4b71Sopenharmony_ci    ret = OH_CryptoSymKeyGenerator_Generate(ctx, &keyCtx);
78e41f4b71Sopenharmony_ci    if (ret != CRYPTO_SUCCESS) {
79e41f4b71Sopenharmony_ci        OH_CryptoSymKeyGenerator_Destroy(ctx);
80e41f4b71Sopenharmony_ci        return ret;
81e41f4b71Sopenharmony_ci    }
82e41f4b71Sopenharmony_ci    ret = OH_CryptoSymKey_GetKeyData(keyCtx, &out);
83e41f4b71Sopenharmony_ci    OH_CryptoSymKeyGenerator_Destroy(ctx);
84e41f4b71Sopenharmony_ci    OH_CryptoSymKey_Destroy(keyCtx);
85e41f4b71Sopenharmony_ci    if (ret != CRYPTO_SUCCESS) {
86e41f4b71Sopenharmony_ci        return ret;
87e41f4b71Sopenharmony_ci    }
88e41f4b71Sopenharmony_ci    OH_Crypto_FreeDataBlob(&out);
89e41f4b71Sopenharmony_ci    return ret;
90e41f4b71Sopenharmony_ci}
91e41f4b71Sopenharmony_ci```
92