www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 嵌入式 > 嵌入式軟件
[導讀] 內核隨機數產生器Linux內核實現了一個隨機數產生器,從理論上說這個隨機數產生器產生的是真隨機數。與標準C庫中的rand(),srand()產生的偽隨機數不同,盡管偽隨機數帶有一

 內核隨機數產生器

Linux內核實現了一個隨機數產生器,從理論上說這個隨機數產生器產生的是真隨機數。與標準C庫中的rand(),srand()產生的偽隨機數不同,盡管偽隨機數帶有一定的隨機特征,但這些數字序列并非統(tǒng)計意義上的隨機數。也就是說它們是可重現的--只要每次使用相同的seed值,就能得到相同的偽隨機數列。通常通過使用time()的返回值來改變seed,以此得到不同的偽隨機數序列,但time()返回值的結果并不是不確定的(可預測),也就是這里仍然缺少一個不確定的噪聲源。對于需要真隨機數的程序,都不能允許使用偽隨機數。

為了獲得真正意義上的隨機數,需要一個外部的噪聲源。Linux內核找到了一個完美的噪聲源產生者--就是使用計算機的人。我們在使用計算機時敲擊鍵盤的時間間隔,移動鼠標的距離與間隔,特定中斷的時間間隔等等,這些對于計算機來講都是屬于非確定的和不可預測的。雖然計算機本身的行為完全由編程所控制,但人對外設硬件的操作具有很大的不確定性,而這些不確定性可以通過驅動程序中注冊的中斷處理例程(ISR)獲取。內核根據這些非確定性的設備事件維護著一個熵池,池中的數據是完全隨機的。當有新的設備事件到來,內核會估計新加入的數據的隨機性,當我們從熵池中取出數據時,內核會減少熵的估計值。

asmlinkage int handle_IRQ_EVEnt(unsigned int irq, struct pt_regs *regs,

struct irqaction *action)

{

int status = 1;

int retval = 0;

if (!(action->flags & SA_INTERRUPT))

local_irq_enable();

do

{

status |= action->flags;

retval |= action->handler(irq, action->dev_id, regs);

action = action->next;

}while (action);

if (status & SA_SAMPLE_RANDOM)

add_interrupt_randomness(irq);

local_irq_disable();

return retval;

}

上面這段代碼是x86上用來處理某條中斷線上注冊的ISR例程的函數。這里我們感興趣的地方是:如果ISR在注冊期間指定了 SA_SAMPLE_RANDOM標志,在處理完action后,還要調用add_interrupt_randomness()這個函數,它使用中斷間隔時間為內核隨機數產生器產生熵。內核就是在這里為熵池填充新數據的。

如果我們完全不操作計算機會如何呢?也就是作為噪聲源的產生者,我們完全不去碰鍵盤,鼠標等外設,不讓熵池獲得新的數據,這個時候如果去熵池取數據內核會如何反應?

內核在每次從熵池中取數據后都會減少熵的估計值,如果熵估計值等于0了,內核此時可以拒絕用戶對隨機數的請求操作。

獲取內核隨機數

有兩種方法可以從熵池中獲取內核隨機數。一種是通過內核導出的隨機數接口,另一種是通過特殊的設備文件/dev/random和/dev/urandom。下面分別討論兩種方法。

熵的輸出接口

?

1 void get_random_bytes(void *buf, int nbytes)

該函數返回長度為nbytes字節(jié)的緩沖區(qū)buf,無論熵估計是否為0都將返回數據。使用這個函數時需要在內核空間。我們寫一個小模塊來測試一下。

?

#include

#include

#include

#define NUM 10

void get_random_bytes(void *buf, int nbytes);

static int get_random_number(void)

{

unsigned long randNum[10];

int i = 0;

printk(KERN_ALERT "Get some real random number.\n");

for (i=0; i

{

get_random_bytes(&randNum, sizeof(unsigned long));

printk(KERN_ALERT "We get random number: %ld\n", randNum);

}

return 0;

}

static void random_exit(void)

{

printk(KERN_ALERT "quit get_random_num.\n");

}

module_init(get_random_number);

module_exit(random_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("Test");

Makefile如下:

?

obj-m = get_random_num.o

KDIR = $(shell uname -r)

PWD = $(shell pwd)

all:

make -C [img]file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\)A[Y)I~](ZC9Z[3Y)IDK7LK.gif[/img]b/modules/$(KDIR)file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\OOY5$4OW5H`8`9%(9$)T67M.gifild M=$(PWD) modules

clean:

make -C [img]file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\)A[Y)I~](ZC9Z[3Y)IDK7LK.gif[/img]b/modules/$(KDIR)file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\OOY5$4OW5H`8`9%(9$)T67M.gifild M=$(PWD) clean

#end#

編譯之后加載模塊,通過dmesg命令輸出系統(tǒng)log最新的信息,可以看到我們的小模塊輸出了10個從內核熵池中得到的隨機數。卸載模塊后再次加載可以重新獲取新的隨機數,觀察輸出結果,與之前得到的隨機數完全不一樣。

[37972.467955] Get some real random number.

[37972.468392] We get random number: -82199505

[37972.468580] We get random number: -276237802

[37972.468586] We get random number: 411869317

[37972.468590] We get random number: 1779353222

[37972.468594] We get random number: 823507551

[37972.468598] We get random number: 1061461415

[37972.468602] We get random number: 1372137935

[37972.468606] We get random number: 1460835009

[37972.468610] We get random number: 2002191729

[37972.468614] We get random number: -272204344

[38059.349589] quit get_random_num.

[38070.575433] Get some real random number.

[38070.575462] We get random number: 1111808207

[38070.575476] We get random number: -13789055[!--empirenews.page--]

[38070.575481] We get random number: 240443446

[38070.575485] We get random number: -606998911

[38070.575489] We get random number: 538794850

[38070.575493] We get random number: -500786675

[38070.575497] We get random number: -1240394927

[38070.575501] We get random number: 1233931345

[38070.575504] We get random number: 1488497117

[38070.575508] We get random number: -177688514

/dev/random & /dev/urandom

這兩個特殊設備都是字符型設備。我們可以在用戶空間通過read系統(tǒng)調用讀這兩個設備文件以此獲取隨機數。這兩個設備文件的區(qū)別在于:如果內核熵池的估計值為0時,

/dev/random將被阻塞,而/dev/urandom不會有這個限制。

#include

#include

#include

#include

#include

/* 從min和max中返回一個隨機值 */

int random_number(int min, int max)

{

static int dev_random_fd = -1;

char *next_random_byte;

int bytes_to_read;

unsigned random_value;

assert(max > min);

if (dev_random_fd == -1)

{

dev_random_fd = open("/dev/random", O_RDONLY);

assert(dev_random_fd != -1);

}

next_random_byte = (char *)&random_value;

bytes_to_read = sizeof(random_value);

/* 因為是從/dev/random中讀取,read可能會被阻塞,一次讀取可能只能得到一個字節(jié),

* 循環(huán)是為了讓我們讀取足夠的字節(jié)數來填充random_value.

*/

do

{

int bytes_read;

bytes_read = read(dev_random_fd, next_random_byte, bytes_to_read);

bytes_to_read -= bytes_read;

next_random_byte += bytes_read;

}while(bytes_to_read > 0);

return min + (random_value % (max - min + 1));

}

同樣,還可以用dd命令從/dev/urandom中獲取指定字節(jié)數的隨機值并寫入文件中保存--如果你需要以文件的形式提供隨機數的話。

dd if=/dev/urandom of = file count = 1 bs = bytes

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉