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