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