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