1# 指定二进制数据转换对称密钥(C/C++)
2
3
4以3DES和HMAC为例,根据指定的对称密钥二进制数据,生成密钥(OH_CryptoSymKey),即将外部或存储的二进制数据转换为算法库的密钥对象,该对象可用于后续的加解密等操作。
5
6## 在CMake脚本中链接相关动态库
7```txt
8   target_link_libraries(entry PUBLIC libohcrypto.so)
9```
10
11## 指定二进制数据转换3DES密钥
12
13对应的算法规格请查看[对称密钥生成和转换规格:3DES](crypto-sym-key-generation-conversion-spec.md#3des)。
14
151. 获取3DES二进制密钥数据,封装成[Crypto_DataBlob](../../reference/apis-crypto-architecture-kit/_crypto_common_api.md#crypto_datablob)。
16
172. 调用[OH_CryptoSymKeyGenerator_Create](../../reference/apis-crypto-architecture-kit/_crypto_sym_key_api.md#oh_cryptosymkeygenerator_create),指定字符串参数'3DES192',创建密钥算法为3DES、密钥长度为192位的对称密钥生成器(OH_CryptoSymKeyGenerator)。
18
193. 调用[OH_CryptoSymKeyGenerator_Convert](../../reference/apis-crypto-architecture-kit/_crypto_sym_key_api.md#oh_cryptosymkeygenerator_convert),根据指定的对称密钥二进制数据,生成对称密钥对象(OH_CryptoSymKey)。
20
214. 调用[OH_CryptoSymKey_GetKeyData](../../reference/apis-crypto-architecture-kit/_crypto_sym_key_api.md#oh_cryptosymkey_getkeydata),获取密钥对象的二进制数据。
22
23以下以生成3DES密钥为例:
24
25  ```c++
26  #include "CryptoArchitectureKit/crypto_common.h"
27  #include "CryptoArchitectureKit/crypto_sym_key.h"
28
29  static OH_Crypto_ErrCode doTestDataCovertSymKey() {
30      const char *algName = "3DES192";
31      OH_CryptoSymKeyGenerator *ctx = nullptr;
32      OH_CryptoSymKey *convertKeyCtx = nullptr;
33      Crypto_DataBlob out = {.data = nullptr, .len = 0};
34      OH_Crypto_ErrCode ret;
35      uint8_t arr[] = {0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56, 0xad, 0x47, 0xfc, 0x5a,
36                      0x46, 0x39, 0xee, 0x7c, 0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72};
37      Crypto_DataBlob convertBlob = {.data = arr, .len = sizeof(arr)};
38      ret = OH_CryptoSymKeyGenerator_Create(algName, &ctx);
39      if (ret != CRYPTO_SUCCESS) {
40          return ret;
41      }
42      ret = OH_CryptoSymKeyGenerator_Convert(ctx, &convertBlob, &convertKeyCtx);
43      if (ret != CRYPTO_SUCCESS) {
44          OH_CryptoSymKeyGenerator_Destroy(ctx);
45          return ret;
46      }
47      ret = OH_CryptoSymKey_GetKeyData(convertKeyCtx, &out);
48      OH_CryptoSymKeyGenerator_Destroy(ctx);
49      OH_CryptoSymKey_Destroy(convertKeyCtx);
50      if (ret != CRYPTO_SUCCESS) {
51          return ret;
52      }
53      OH_Crypto_FreeDataBlob(&out);
54      return ret;
55  }
56  ```
57
58## 指定二进制数据转换HMAC密钥
59
60对应的算法规格请查看[对称密钥生成和转换规格:HMAC](crypto-sym-key-generation-conversion-spec.md#hmac)。
61
621. 获取HMAC二进制密钥,封装成[Crypto_DataBlob](../../reference/apis-crypto-architecture-kit/_crypto_common_api.md#crypto_datablob)。
63
642. 调用[OH_CryptoSymKeyGenerator_Create](../../reference/apis-crypto-architecture-kit/_crypto_sym_key_api.md#oh_cryptosymkeygenerator_create),指定字符串参数'HMAC',创建密钥算法为HMAC、密钥长度为[1, 32768]位的对称密钥生成器(OH_CryptoSymKeyGenerator)。
65
663. 调用[OH_CryptoSymKeyGenerator_Convert](../../reference/apis-crypto-architecture-kit/_crypto_sym_key_api.md#oh_cryptosymkeygenerator_convert),根据指定的对称密钥二进制数据,生成对称密钥对象(OH_CryptoSymKey)。
67
684. 调用[OH_CryptoSymKey_GetKeyData](../../reference/apis-crypto-architecture-kit/_crypto_sym_key_api.md#oh_cryptosymkey_getkeydata),获取密钥对象的二进制数据。
69
70以下以生成HMAC密钥为例:
71
72  ```c++
73  #include "CryptoArchitectureKit/crypto_common.h"
74  #include "CryptoArchitectureKit/crypto_sym_key.h"
75  #include <string.h>
76
77  static OH_Crypto_ErrCode testConvertHmacKey() {
78      const char *algName = "HMAC";
79      OH_CryptoSymKeyGenerator *ctx = nullptr;
80      OH_CryptoSymKey *convertKeyCtx = nullptr;
81      Crypto_DataBlob out = {.data = nullptr, .len = 0};
82      OH_Crypto_ErrCode ret;
83
84      char *arr = const_cast<char *>("12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh");
85      Crypto_DataBlob convertBlob = {.data = (uint8_t *)(arr), .len = strlen(arr)};
86      ret = OH_CryptoSymKeyGenerator_Create(algName, &ctx);
87      if (ret != CRYPTO_SUCCESS) {
88          return ret;
89      }
90      ret = OH_CryptoSymKeyGenerator_Convert(ctx, &convertBlob, &convertKeyCtx);
91      if (ret != CRYPTO_SUCCESS) {
92          OH_CryptoSymKeyGenerator_Destroy(ctx);
93          return ret;
94      }
95      ret = OH_CryptoSymKey_GetKeyData(convertKeyCtx, &out);
96      OH_CryptoSymKeyGenerator_Destroy(ctx);
97      OH_CryptoSymKey_Destroy(convertKeyCtx);
98      if (ret != CRYPTO_SUCCESS) {
99          return ret;
100      }
101      OH_Crypto_FreeDataBlob(&out);
102      return ret;
103  }
104  ```
105