1e41f4b71Sopenharmony_ci# Random Number Generation
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci
4e41f4b71Sopenharmony_ciRandom numbers are used to generate temporary session keys and asymmetric encryption algorithm keys. In encryption and decryption, a secure random number generator must feature randomness, unrepeatability, and unpredictability. The random numbers generated by the system meet the requirements of cryptography security pseudo-randomness.
5e41f4b71Sopenharmony_ci
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ciYou can call APIs to:
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci
10e41f4b71Sopenharmony_ci- Generate a random number of the specified length and uses it to generate a key.
11e41f4b71Sopenharmony_ci
12e41f4b71Sopenharmony_ci- Generate a series of random sequences based on a seed.
13e41f4b71Sopenharmony_ci
14e41f4b71Sopenharmony_ci
15e41f4b71Sopenharmony_ciIt will be helpful if you have basic knowledge of encryption and decryption and understand the following basic concepts:
16e41f4b71Sopenharmony_ci
17e41f4b71Sopenharmony_ci
18e41f4b71Sopenharmony_ci- Internal state
19e41f4b71Sopenharmony_ci  
20e41f4b71Sopenharmony_ci  A value in the random number generator memory. The same internal state produces a random number of the same sequence.
21e41f4b71Sopenharmony_ci
22e41f4b71Sopenharmony_ci- Random seed
23e41f4b71Sopenharmony_ci  
24e41f4b71Sopenharmony_ci  A number used to initialize the internal state of a pseudorandom number generator. The random number generator generates a series of random sequences based on the seeds.
25e41f4b71Sopenharmony_ci
26e41f4b71Sopenharmony_ci  In the OpenSSL implementation, the internal state of the random number generator changes continuously. Therefore, the generated random number sequences are different even if the same seed is used.
27e41f4b71Sopenharmony_ci
28e41f4b71Sopenharmony_ci
29e41f4b71Sopenharmony_ci## Supported Algorithms and Specifications
30e41f4b71Sopenharmony_ci
31e41f4b71Sopenharmony_ciThe random number generation algorithm uses the **RAND_priv_bytes** interface of OpenSSL to generate random numbers.
32e41f4b71Sopenharmony_ci
33e41f4b71Sopenharmony_ci| Algorithm| Length (Byte)| 
34e41f4b71Sopenharmony_ci| -------- | -------- |
35e41f4b71Sopenharmony_ci| CTR_DRBG | [1, INT_MAX] | 
36e41f4b71Sopenharmony_ci
37e41f4b71Sopenharmony_ci
38e41f4b71Sopenharmony_ci## How to Develop
39e41f4b71Sopenharmony_ci
40e41f4b71Sopenharmony_ci1. Use [cryptoFramework.createRandom](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreaterandom) to create a **Random** instance.
41e41f4b71Sopenharmony_ci
42e41f4b71Sopenharmony_ci2. (Optional) Use [Random.setSeed](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#setseed) to set a seed for the random number generation pool.
43e41f4b71Sopenharmony_ci
44e41f4b71Sopenharmony_ci3. Use [Random.generateRandom](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#generaterandom) or [Random.generateRandomSync](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#generaterandomsync10) to generate a random number.
45e41f4b71Sopenharmony_ci   
46e41f4b71Sopenharmony_ci   The length of the random number to generate ranges from **1** to **INT_MAX**, in bytes.
47e41f4b71Sopenharmony_ci
48e41f4b71Sopenharmony_ci- Return the result using **await**:
49e41f4b71Sopenharmony_ci  ```ts
50e41f4b71Sopenharmony_ci  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
51e41f4b71Sopenharmony_ci  
52e41f4b71Sopenharmony_ci  async function doRand() {
53e41f4b71Sopenharmony_ci    let rand = cryptoFramework.createRandom();
54e41f4b71Sopenharmony_ci    let seed = new Uint8Array([1, 2, 3]);
55e41f4b71Sopenharmony_ci    rand.setSeed({ data: seed });
56e41f4b71Sopenharmony_ci    let len = 12;
57e41f4b71Sopenharmony_ci    let randOutput = await rand.generateRandom(len);
58e41f4b71Sopenharmony_ci    console.info('rand output:' + randOutput.data);
59e41f4b71Sopenharmony_ci  }
60e41f4b71Sopenharmony_ci  ```
61e41f4b71Sopenharmony_ci
62e41f4b71Sopenharmony_ci- Return the result synchronously:
63e41f4b71Sopenharmony_ci  ```ts
64e41f4b71Sopenharmony_ci  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
65e41f4b71Sopenharmony_ci  import { BusinessError } from '@kit.BasicServicesKit';
66e41f4b71Sopenharmony_ci  
67e41f4b71Sopenharmony_ci  function doRandBySync() {
68e41f4b71Sopenharmony_ci    let rand = cryptoFramework.createRandom();
69e41f4b71Sopenharmony_ci    let len = 24; // Generate a 24-byte random number.
70e41f4b71Sopenharmony_ci    try {
71e41f4b71Sopenharmony_ci      let randData = rand.generateRandomSync(len);
72e41f4b71Sopenharmony_ci      if (randData != null) {
73e41f4b71Sopenharmony_ci        console.info("[Sync]: rand result: " + randData.data);
74e41f4b71Sopenharmony_ci      } else {
75e41f4b71Sopenharmony_ci        console.error("[Sync]: get rand result fail!");
76e41f4b71Sopenharmony_ci      }
77e41f4b71Sopenharmony_ci    } catch (error) {
78e41f4b71Sopenharmony_ci      let e: BusinessError = error as BusinessError;
79e41f4b71Sopenharmony_ci      console.error(`do rand failed, ${e.code}, ${e.message}`);
80e41f4b71Sopenharmony_ci    }
81e41f4b71Sopenharmony_ci  }
82e41f4b71Sopenharmony_ci  ```
83