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