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