[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://blog.beautifulzzzz.com
園友交流群:414948975

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM