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