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