• 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> **说明:**
11>
12> 从API version 12开始,轻量级智能穿戴设备支持获取随机数相关操作。
13
14随机数主要用于临时会话密钥生成和非对称加密算法密钥生成等场景。在加解密场景中,安全随机数生成器需要具备随机性、不可预测性与不可重现性。当前系统生成的随机数满足密码学安全伪随机性要求。
15
16开发者可以调用接口,完成以下功能:
17
18- 生成指定长度的安全随机数,并将其用于生成对应的密钥。
19
20- 指定随机种子,生成一系列的随机序列。
21
22在开发前,开发者应该先对加解密基础知识有一定了解,并熟知以下随机数相关的基本概念:
23
24- **内部状态**
25
26  代表随机数生成器内存中的数值,当内部状态相同时,随机数生成器会生成固定的随机数序列。
27
28- **随机种子**
29
30  一个用来对伪随机数的内部状态进行初始化的数据,随机数生成器通过种子来生成一系列的随机序列。
31
32  当前OpenSSL实现方式,随机数生成器内部状态是不断变化的,即使设置相同的种子,生成的随机数序列也不会相同。
33
34## 支持的算法与规格
35
36随机数生成算法使用OpenSSL的RAND_priv_bytes接口生成安全随机数。
37
38| 算法 | 长度(Byte) |
39| -------- | -------- |
40| CTR_DRBG | [1, INT_MAX] |
41
42## 开发步骤
43
441. 调用[OH_CryptoRand_Create](../../reference/apis-crypto-architecture-kit/capi-crypto-rand-h.md#oh_cryptorand_create),创建随机数生成器。
45
462. (可选)调用[OH_CryptoRand_SetSeed](../../reference/apis-crypto-architecture-kit/capi-crypto-rand-h.md#oh_cryptorand_setseed),为随机数生成器设置种子。
47
483. 调用[OH_CryptoRand_GenerateRandom](../../reference/apis-crypto-architecture-kit/capi-crypto-rand-h.md#oh_cryptorand_generaterandom),生成指定长度的安全随机数。指定字节长度范围为1~INT_MAX。
49
504. 调用[OH_CryptoRand_GetAlgoName](../../reference/apis-crypto-architecture-kit/capi-crypto-rand-h.md#oh_cryptorand_getalgoname),获取随机数生成器使用的算法名称。
51
52```C++
53#include "CryptoArchitectureKit/crypto_architecture_kit.h"
54#include <stdio.h>
55
56static OH_Crypto_ErrCode doTestRandomNumber()
57{
58    // 创建随机数生成器。
59    OH_CryptoRand *rand = nullptr;
60    OH_Crypto_ErrCode ret = OH_CryptoRand_Create(&rand);
61    if (ret != CRYPTO_SUCCESS) {
62        return ret;
63    }
64
65    // 设置随机种子(可选)。
66    uint8_t seedData[12] = {0x25, 0x65, 0x58, 0x89, 0x85, 0x55, 0x66, 0x77, 0x88, 0x99, 0x11, 0x22};
67    Crypto_DataBlob seed = {
68        .data = seedData,
69        .len = sizeof(seedData)
70    };
71    ret = OH_CryptoRand_SetSeed(rand, &seed);
72    if (ret != CRYPTO_SUCCESS) {
73        OH_CryptoRand_Destroy(rand);
74        return ret;
75    }
76
77    // 生成指定长度的随机数。
78    Crypto_DataBlob out = {0};
79    uint32_t randomLength = 24; // 生成24字节的随机数。
80    ret = OH_CryptoRand_GenerateRandom(rand, randomLength, &out);
81    if (ret != CRYPTO_SUCCESS) {
82        OH_CryptoRand_Destroy(rand);
83        return ret;
84    }
85
86    // 获取并打印随机数生成器的算法名称。
87    const char *algoName = OH_CryptoRand_GetAlgoName(rand);
88    if (algoName != nullptr) {
89        printf("Random number generator algorithm: %s\n", algoName);
90    }
91
92    printf("Generated random number length: %u\n", out.len);
93
94    // 清理资源。
95    OH_Crypto_FreeDataBlob(&out);
96    OH_CryptoRand_Destroy(rand);
97    return CRYPTO_SUCCESS;
98}
99```