1# 随机生成对称密钥(C/C++) 2 3以AES和SM4为例,随机生成对称密钥(OH_CryptoSymKey)。 4 5对称密钥对象可用于后续加解密操作,二进制数据可用于存储或运输。 6 7## 在CMake脚本中链接相关动态库 8```txt 9target_link_libraries(entry PUBLIC libohcrypto.so) 10``` 11 12## 随机生成AES密钥 13 14对应的算法规格请查看[对称密钥生成和转换规格:AES](crypto-sym-key-generation-conversion-spec.md#aes)。 15 161. 调用[OH_CryptoSymKeyGenerator_Create](../../reference/apis-crypto-architecture-kit/_crypto_sym_key_api.md#oh_cryptosymkeygenerator_create),指定字符串参数'AES256',创建密钥算法为AES、密钥长度为256位的对称密钥生成器(OH_CryptoSymKeyGenerator)。 17 182. 调用[OH_CryptoSymKeyGenerator_Generate](../../reference/apis-crypto-architecture-kit/_crypto_sym_key_api.md#oh_cryptosymkeygenerator_generate),随机生成对称密钥对象(OH_CryptoSymKey)。 19 203. 调用[OH_CryptoSymKey_GetKeyData](../../reference/apis-crypto-architecture-kit/_crypto_sym_key_api.md#oh_cryptosymkey_getkeydata),获取密钥对象的二进制数据。 21 22```c++ 23#include "CryptoArchitectureKit/crypto_common.h" 24#include "CryptoArchitectureKit/crypto_sym_key.h" 25 26static OH_Crypto_ErrCode testGenerateSymKey() 27{ 28 OH_CryptoSymKeyGenerator *ctx = nullptr; 29 OH_CryptoSymKey *keyCtx = nullptr; 30 Crypto_DataBlob out = {.data = nullptr, .len = 0}; 31 OH_Crypto_ErrCode ret = OH_CryptoSymKeyGenerator_Create("AES256", &ctx); 32 if (ret != CRYPTO_SUCCESS) { 33 return ret; 34 } 35 ret = OH_CryptoSymKeyGenerator_Generate(ctx, &keyCtx); 36 if (ret != CRYPTO_SUCCESS) { 37 OH_CryptoSymKeyGenerator_Destroy(ctx); 38 return ret; 39 } 40 ret = OH_CryptoSymKey_GetKeyData(keyCtx, &out); 41 OH_CryptoSymKeyGenerator_Destroy(ctx); 42 OH_CryptoSymKey_Destroy(keyCtx); 43 if (ret != CRYPTO_SUCCESS) { 44 return ret; 45 } 46 OH_Crypto_FreeDataBlob(&out); 47 return ret; 48} 49``` 50 51## 随机生成SM4密钥 52 53对应的算法规格请查看[对称密钥生成和转换规格:SM4](crypto-sym-key-generation-conversion-spec.md#sm4)。 54 551. 调用[OH_CryptoSymKeyGenerator_Create](../../reference/apis-crypto-architecture-kit/_crypto_sym_key_api.md#oh_cryptosymkeygenerator_create),指定字符串参数'SM4_128',创建密钥算法为SM4、密钥长度为128位的对称密钥生成器(OH_CryptoSymKeyGenerator)。 56 572. 调用[OH_CryptoSymKeyGenerator_Generate](../../reference/apis-crypto-architecture-kit/_crypto_sym_key_api.md#oh_cryptosymkeygenerator_generate),随机生成对称密钥对象(OH_CryptoSymKey)。 58 593. 调用[OH_CryptoSymKey_GetKeyData](../../reference/apis-crypto-architecture-kit/_crypto_sym_key_api.md#oh_cryptosymkey_getkeydata),获取密钥对象的二进制数据。 60 61```c++ 62#include "CryptoArchitectureKit/crypto_common.h" 63#include "CryptoArchitectureKit/crypto_sym_key.h" 64 65static OH_Crypto_ErrCode testGenerateSM4Key() 66{ 67 OH_CryptoSymKeyGenerator *ctx = nullptr; 68 OH_CryptoSymKey *keyCtx = nullptr; 69 Crypto_DataBlob out = {.data = nullptr, .len = 0}; // 对称密钥二进制数据。 70 OH_Crypto_ErrCode ret = OH_CryptoSymKeyGenerator_Create("SM4_128", &ctx); // 创建对称密钥生成器。 71 if (ret != CRYPTO_SUCCESS) { 72 return ret; 73 } 74 ret = OH_CryptoSymKeyGenerator_Generate(ctx, &keyCtx); // 随机生成对称密钥对象。 75 if (ret != CRYPTO_SUCCESS) { 76 OH_CryptoSymKeyGenerator_Destroy(ctx); 77 return ret; 78 } 79 ret = OH_CryptoSymKey_GetKeyData(keyCtx, &out); // 获取对称密钥对象的二进制数据。 80 OH_CryptoSymKeyGenerator_Destroy(ctx); 81 OH_CryptoSymKey_Destroy(keyCtx); 82 if (ret != CRYPTO_SUCCESS) { 83 return ret; 84 } 85 OH_Crypto_FreeDataBlob(&out); 86 return ret; 87} 88``` 89