[nRF51822] 1六、nRF51822的随机数生成器,及随机数生成器的一些知识(能够帮您补补随机数发生器的知识)

 

一、前言

随机数生成器在通讯、加密、图像传输等领域应用普遍,且通常起到关键性做用。我在最近设计的一个近场射频通讯协议的碰撞避退算法的过程当中,便对此有深深体会。html

 

二、伪随机数发生器

随机数发生器通常包括伪随机数发生器和真随机数发生器。伪随机数发生器的伪随机序列是由数学公式计算产生,若是生成随机数的算法肯定了,那么这个随机数序列也就肯定了。因此从数学意义上讲,伪随机数并不随机,序列自己也必然会重复。可是只要伪随机数发生器所产生的伪随机序列的周期足够成而且经过相应的检验,就能够在必定范围内使用。并且伪随机数发生器在物理实现上比真随机数简单的多,它的生成速度比真随机数快得多,于是普遍被使用。对伪随机数而言,其算法显得尤其重要。ios

以园友:学院派的驴 的 C++随机数生成方法(转载,赶忙搜藏)为例,其所用的C++中的random函数基于的是伪随机数发生器,伪随机数发生器通常须要给出一个种子,(一旦种子和伪随机数算法同样,其产生的随机数序列将彻底同样!)。该园友为了产生接近真随机的随机数序列,用系统时间做为伪随机发生器的种子srand(unsigned(time(0))); 这种作法在工程学上是简单且普遍的!算法

 1 #include <iostream>
 2 #include <ctime>
 3 #include <cstdlib>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     double random(double,double);
 9     srand(unsigned(time(0)));
10     for(int icnt = 0; icnt != 10; ++icnt)
11         cout << "No." << icnt+1 << ": " << int(random(0,10))<< endl;
12     return 0;
13 }
14 
15 double random(double start, double end)
16 {
17     return start+(end-start)*rand()/(RAND_MAX + 1.0);
18 }
19 /* 运行结果
20 * No.1: 3
21 * No.2: 9
22 * No.3: 0
23 * No.4: 9
24 * No.5: 5
25 * No.6: 6
26 * No.7: 9
27 * No.8: 2
28 * No.9: 9
29 * No.10: 6
30 */

可是对于一个更复杂的系统,例如:若是运行上述代码的多台主机其系统时间相差在毫秒内,那么就极可能达不到想要的随机效果了,而这种状况在一个传感器网络中是比较常见的!一种更靠谱的作法是用真随机数发生器产生伪随机数发生器的种子。安全

 

三、真随机数发生器

而真随机数发生器所产生的随机数来源于天然界物理现象的随机特性,于是完全地消除了伪随机数的周期性问题。因为真随机数发生器产生的真随机序列是不可预测的,于是不可能找到两个彻底相同的真随机序列。而用真随机作种子的伪随机生成器仍然有可能产生因为种子相同然后续序列相同的状况,这若是发生在碰撞避退中,则将产生无限的碰撞!只有真随机数发生器才能提供真正的、永不重复的随机数序列。真随机数发生器从本质上来说是非肯定性的,不像伪随机数发生器经过算法产生随机数,于是没法推算之后产生的伪随机序列。所以真随机发生器能够知足一些须要独立产生随机数序列的场合,好比射频通讯协议里的碰撞避退算法。网络

所以提取真随机序列的最好的方法就是提取真是世界的随机序列!而随机事件是天然界存在的客观现象,这种现象是广泛存在的,是不依赖于事件、空间或者其它的条件。所以,可使用随机噪声选取真是世界的天然随机性。用人们打字的随机方式来产生随机位,测量连续击键的时间,而后取这些测量的最低有效位,即测量键盘反应时间做为随机源;利用电子器件中的热噪声做为随机源,该类热噪声源有电阻、半导体二极管和密封的磁盘驱动器中的空气扰动;也能够利用CMOS电路中存在着的噪声。随着微电子学的发展,廉价的高质量集成电路芯片的出现,是的电路的噪声成为最容易得到的随机物理信号。dom

 

四、对真随机的需求

4.一、安全性方面的要求

随着计算机科学与通讯技术的快速发展,信息在存储、传送、接收和处理过程当中的安全问题已受到人们的普遍关注,对高质量随机数的要求也与日俱增。随机数在信息安全系统中扮演着重要的角色,在基于计算机或internet的通讯和交易中有着普遍的应用。好比数据加密、密钥管理、电子商务、数字签名、身份鉴定以及蒙特卡罗仿真等都要用到随机数。对于不少加密系统而言,其安全性彻底取决于使用的密钥和一些协议中的参数等条件,若采用传统模型产生的伪随机序列做为密钥,若是攻击者拥有足够的计算能力,则彻底能够预测到伪随机数的产生规律。对于许多使用伪随机数的安全系统来讲,因为软件方法不能保证足够的不肯定性,伪随机数注定成为它们性能提升的瓶颈。即便一个安全系统的其余部件都足够安全,使用伪随机数也会使整个系统变得很脆弱、易受到攻击。jsp

若是安全系统内部使用的是真随机数的话,即便攻击者有很强的计算能力,而且已知全部产生的序列,也不能预测系统下一个要产生的随机数。这样就提升了安全系数,下降了安全隐患。
ide

 
4.二、系统芯片技术发展的要求

系统芯片就是将一个系统的多个部分集成在一个芯片上,可以完成某种完整电子系统功能的芯片系统。该系统由硬件部分和软件部分两个部分构成。硬件部分包括uP、BUS、ROM/RAM、数字接口等计算机的基本部件;软件部分主要包括操做系统和应用软件。SOC设计的三大支撑技术包括软硬件协同设计技术、IP设计和复用技术、超深亚微米设计技术等。函数

系统芯片一般包含一些具备通用功能的组件。例如,不少系统芯片都带有锁相环用以产生内部时钟,也须要用到随机数来完成某些功能。之前的作法就是使用外部随机数发生器来提供随机数,或者经过软件方法产生伪随机数来知足其须要。第一种方法浪费资源、费用、功耗较大;第二种方法难以知足安全性须要。所以,利用系统芯片的片上资源来实现一个随机数发生器成为一种现实的须要。片上集成系统减小了片外器件和芯片引脚的数量,避免了用大电流驱动芯片引脚,下降了各类封装寄生效应的影响,使电路更紧凑,可靠性更高,功耗、体积和成本都可以进一步下降。post

利用系统芯片的片上资源来实现一个随机数发生器的方法简单可行,产生的随机数具备真随机性、安全性更高,适应当代系统芯片技术发展的要求,易于系统集成,也能够做为一个核应用于加密芯片、智能卡芯片、嵌入式系统、通讯系统等产品中,应用前景广阔。

 

4.三、高端测量仪器

在高端测量仪器领域,好比核试验仪器研制,须要研制可靠的信号发生器来对探测器的输出信号进行模拟和仿真,用于原子核科学技术测试研究。其中,信号发生器一个重要的功能是模拟核信号在时间上的统计规律:即前后相邻两脉冲信号的时间间隔服从指数分布,所以就须要研究怎样产生高质量的均匀分布的随机序列,进而产生指数分布的随机序列来知足系统的功能需求,能够方便而快捷地开展数字化核测量系统的研究。

 

五、nRF51822的随机数发生器

nRF51822_Product Specification_v3.1.pdf中介绍nrf自带真随机生成器:
The Random Number Generator (RNG) generates true non-deterministic random numbers derived from thermal noise that are suitable for cryptographic purposes. The RNG does not require a seed value.

该spec上介绍的比较少,更详细的在http://infocenter.nordicsemi.com/index.jsp

The random number generator (RNG) driver includes two layers: the hardware access layer (HAL) and the driver layer (DRV).
The hardware access layer provides basic APIs for accessing the registers of the random number generator. See the API documentation for the  RNG HAL and driver for details.
The driver layer provides APIs on a higher level than the HAL. See the API documentation for the  RNG driver for details.
 
The  Random Number Generator Example provides sample code that you can use to quickly get started.

上面给出的一个简单的例子:

 1 /** @brief Function for getting vector of random numbers.
 2 *
 3 * @param[out] p_buff Pointer to unit8_t buffer for storing the bytes.
 4 * @param[in] length Number of bytes to take from pool and place in p_buff.
 5 *
 6 * @retval Number of bytes actually placed in p_buff.
 7 */
 8 uint8_t random_vector_generate(uint8_t *p_buff, uint8_t size)
 9 {
10     uint8_t available;
11     uint32_t err_code;
12     err_code = nrf_drv_rng_bytes_available(&available);
13     APP_ERROR_CHECK(err_code);
14     uint8_t length = (size < available) ? size : available;
15     err_code = nrf_drv_rng_rand(p_buff, length);
16     APP_ERROR_CHECK(err_code);
17     return length;
18 }

 

 

相关连接:

[1] C++随机数生成方法(转载,赶忙搜藏)

[2] 读《图解密码技术》:密钥、随机数和应用技术

[3] [nRF51822] 七、基础实验代码解析大全(前十)

[4] 霍嘉. 随机数发生器的设计与研究[D].西安科技大学,2010.

 

:: 若是您以为不错,请推荐给更多人,帮助他们更快地解决实际问题中的坑~


@beautifulzzzz
智能硬件、物联网,热爱技术,关注产品
博客:http://blog.beautifulzzzz.com
园友交流群:414948975
相关文章
相关标签/搜索