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