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