• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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