1# 消息摘要计算MD5(C/C++) 2 3对应的算法规格请查看[消息摘要计算算法规格](crypto-generate-message-digest-overview.md#支持的算法与规格)。 4 5## 在CMake脚本中链接相关动态库 6```txt 7target_link_libraries(entry PUBLIC libohcrypto.so) 8``` 9 10## 开发步骤 11 12在调用update接口传入数据时,可以[一次性传入所有数据](#摘要算法一次性传入),也可以把数据人工分段,然后[分段update](#分段摘要算法)。对于同一段数据而言,计算结果没有差异。对于数据量较大的数据,开发者可以根据实际需求选择是否分段传入。 13 14下面分别提供两种方式的示例代码。 15 16### 摘要算法(一次性传入) 17 181. 调用[OH_CryptoDigest_Create](../../reference/apis-crypto-architecture-kit/_crypto_digest_api.md#oh_cryptodigest_create),指定摘要算法MD5,生成摘要实例(OH_CryptoDigest)。 19 202. 调用[OH_CryptoDigest_Update](../../reference/apis-crypto-architecture-kit/_crypto_digest_api.md#oh_cryptodigest_update),传入自定义消息,进行摘要更新计算。单次update长度没有限制。 21 223. 调用[OH_CryptoDigest_Final](../../reference/apis-crypto-architecture-kit/_crypto_digest_api.md#oh_cryptodigest_final),获取摘要计算结果。 23 244. 调用[OH_CryptoDigest_GetLength](../../reference/apis-crypto-architecture-kit/_crypto_digest_api.md#oh_cryptodigest_getlength),获取摘要计算长度,单位为字节。 25 265. 调用[OH_DigestCrypto_Destroy](../../reference/apis-crypto-architecture-kit/_crypto_digest_api.md#oh_digestcrypto_destroy),销毁摘要实例(OH_CryptoDigest)。 27 28以下使用单次传入数据,获取摘要计算结果为例: 29 30```c++ 31#include "CryptoArchitectureKit/crypto_common.h" 32#include "CryptoArchitectureKit/crypto_digest.h" 33#include <string.h> 34 35static OH_Crypto_ErrCode doTestMd() 36{ 37 OH_Crypto_ErrCode ret; 38 OH_CryptoDigest *ctx = nullptr; 39 char *testData = const_cast<char *>("0123456789"); 40 Crypto_DataBlob in = {.data = (uint8_t *)(testData), .len = strlen(testData)}; 41 Crypto_DataBlob out = {.data = nullptr, .len = 0}; 42 int mdLen = 0; 43 ret = OH_CryptoDigest_Create("MD5", &ctx); 44 if (ret != CRYPTO_SUCCESS) { 45 return ret; 46 } 47 do { 48 ret = OH_CryptoDigest_Update(ctx, &in); 49 if (ret != CRYPTO_SUCCESS) { 50 break; 51 } 52 ret = OH_CryptoDigest_Final(ctx, &out); 53 if (ret != CRYPTO_SUCCESS) { 54 break; 55 } 56 mdLen = OH_CryptoDigest_GetLength(ctx); 57 } while (0); 58 OH_Crypto_FreeDataBlob(&out); 59 OH_DigestCrypto_Destroy(ctx); 60 return ret; 61} 62``` 63 64### 分段摘要算法 65 661. 调用[OH_CryptoDigest_Create](../../reference/apis-crypto-architecture-kit/_crypto_digest_api.md#oh_cryptodigest_create),指定摘要算法MD5,生成摘要实例(OH_CryptoDigest)。 67 682. 传入自定义消息,将一次传入数据量设置为20字节,多次调用[OH_CryptoDigest_Update](../../reference/apis-crypto-architecture-kit/_crypto_digest_api.md#oh_cryptodigest_update),进行摘要更新计算。 69 703. 调用[OH_CryptoDigest_Final](../../reference/apis-crypto-architecture-kit/_crypto_digest_api.md#oh_cryptodigest_final),获取摘要计算结果。 71 724. 调用[OH_CryptoDigest_GetLength](../../reference/apis-crypto-architecture-kit/_crypto_digest_api.md#oh_cryptodigest_getlength),获取摘要计算长度,单位为字节。 73 745. 调用[OH_DigestCrypto_Destroy](../../reference/apis-crypto-architecture-kit/_crypto_digest_api.md#oh_digestcrypto_destroy),销毁摘要实例(OH_CryptoDigest)。 75 76- 以下使用分段传入数据,获取摘要计算结果为例: 77 78```c++ 79#include <stdlib.h> 80#include "CryptoArchitectureKit/crypto_common.h" 81#include "CryptoArchitectureKit/crypto_digest.h" 82#define OH_CRYPTO_DIGEST_DATA_MAX (1024 * 1024 * 100) 83 84static OH_Crypto_ErrCode doLoopMd() 85{ 86 OH_Crypto_ErrCode ret; 87 OH_CryptoDigest *ctx = nullptr; 88 uint8_t *testData = (uint8_t *)malloc(OH_CRYPTO_DIGEST_DATA_MAX); 89 Crypto_DataBlob out = {.data = nullptr, .len = 0}; 90 int mdLen = 0; 91 int isBlockSize = 20; 92 int offset = 0; 93 94 ret = OH_CryptoDigest_Create("MD5", &ctx); 95 if (ret != CRYPTO_SUCCESS) { 96 return ret; 97 } 98 do { 99 for (int i = 0; i < 640 / isBlockSize; i++) { 100 Crypto_DataBlob in = {.data = reinterpret_cast<uint8_t *>(testData + offset), 101 .len = static_cast<size_t>(isBlockSize)}; 102 ret = OH_CryptoDigest_Update(ctx, &in); 103 if (ret != CRYPTO_SUCCESS) { 104 break; 105 } 106 offset += isBlockSize; 107 } 108 ret = OH_CryptoDigest_Final(ctx, &out); 109 if (ret != CRYPTO_SUCCESS) { 110 break; 111 } 112 mdLen = OH_CryptoDigest_GetLength(ctx); 113 } while (0); 114 OH_Crypto_FreeDataBlob(&out); 115 OH_DigestCrypto_Destroy(ctx); 116 return ret; 117} 118``` 119