[nRF51822] 16、nRF51822的随机数生成器,及随机数生成器的一些知识(可以帮您补补随机数发生器的知识)-阿里云开发者社区

开发者社区> 安全> 正文

[nRF51822] 16、nRF51822的随机数生成器,及随机数生成器的一些知识(可以帮您补补随机数发生器的知识)

简介:


 

1、前言

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

 

2、伪随机数发生器

随机数发生器一般包括伪随机数发生器和真随机数发生器。伪随机数发生器的伪随机序列是由数学公式计算产生,如果生成随机数的算法确定了,那么这个随机数序列也就确定了。所以从数学意义上讲,伪随机数并不随机,序列本身也必然会重复。但是只要伪随机数发生器所产生的伪随机序列的周期足够成并且通过相应的检验,就可以在一定范围内使用。而且伪随机数发生器在物理实现上比真随机数简单的多,它的生成速度比真随机数快得多,因而广泛被使用。对伪随机数而言,其算法显得尤为重要。

以园友:学院派的驴 的 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 */
复制代码

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

 

3、真随机数发生器

而真随机数发生器所产生的随机数来源于自然界物理现象的随机特性,因而彻底地消除了伪随机数的周期性问题。由于真随机数发生器产生的真随机序列是不可预测的,因而不可能找到两个完全相同的真随机序列。而用真随机做种子的伪随机生成器仍然有可能产生由于种子相同而后续序列相同的情况,这如果发生在碰撞避退中,则将产生无限的碰撞!只有真随机数发生器才能提供真正的、永不重复的随机数序列。真随机数发生器从本质上来讲是非确定性的,不像伪随机数发生器通过算法产生随机数,因而无法推算以后产生的伪随机序列。因此真随机发生器可以满足一些需要独立产生随机数序列的场合,比如射频通信协议里的碰撞避退算法。

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

 

4、对真随机的需求

4.1、安全性方面的要求

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

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

 
4.2、系统芯片技术发展的要求

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

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

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

 

4.3、高端测量仪器

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

 

5、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] 7、基础实验代码解析大全(前十)

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



本文转自beautifulzzzz博客园博客,原文链接:http://www.cnblogs.com/zjutlitao/p/6336607.html,如需转载请自行联系原作者

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
+ 订阅

云安全开发者的大本营

其他文章