歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux隨機數的產生

Linux隨機數的產生

日期:2017/2/28 16:05:14   编辑:Linux教程

Linux內核采用熵描述數據的隨機性,熵越大表示系統越混亂。計算機本身是可預測的系統,因此用計算機算法不可能產生真正的隨機數。但由於機器中充滿了噪聲,而這些噪聲又很難預測,沒有規律可循,因此這些噪聲可以作為隨機數的產生源。Linux內核就是利用噪聲來產生隨機數的,它維持3個熵池(一級、二級和三級),而這些噪聲課分為4類。如下:

1)I/O中斷。內核調用add_interrupt_randomness()函數將設備兩次中斷的時間間隔作為噪聲源將隨機數據加入熵池,要使用設備的中斷作為系統噪聲,必須用SA_SAMPLE_RANDOM標志注冊其中斷服務程序。這樣,每當設備發生中斷時,中斷系統會自動調用 add_interrupt_randomness()將熵加入熵池。

2)鍵盤:Add_keyboard_randomness()將按鍵的掃描碼和兩次按鍵之間的時間間隔作為噪聲源;

3)鼠標:而add_mouse_randomness()則利用鼠標位置和連續兩次鼠標中斷時間間隔填充熵池;

4)硬盤:最後 add_disk_randomness()函數則以連續兩次磁盤操作之間的間隔產生隨機數。

為跟蹤熵池中數據的隨機性,內核在將數據加入池的時候將估算數據的隨機性,這個過程稱作熵估算。熵估算值描述池中包含的隨機數位數,其值越大表示池中數據的隨機性越好。上面的函數最終都是通過調用 add_timer_randomness()函數將熵加入熵池的。Add_timer_randomness()首先估算所加數據的熵,再調用 batch_entropy_store()函數將數據加入熵池。為了避免中斷的延遲過長影響系統性能,batch_entropy_store()並不直接將熵加入熵池,而是將其加入隊列中。當隊列長度達到一定長度後,由keventd內核線程通過調用batch_entropy_process()函數將隊列中的熵加入池中。Batch_entropy_process()函數枚舉隊列中的每個熵,對每個熵調用 add_entropy_words()函數將其加入熵池,但它並不更新熵池的熵估算值。為此,batch_entropy_process()對每個熵調用完add_entropy_words()後,立刻調用credit_entropy_store()函數更新熵估算值。

Copyright © Linux教程網 All Rights Reserved