[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
相關文章
相關標籤/搜索