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