• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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