在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 從Linux內(nèi)核中獲取真隨機(jī)數(shù)

            從Linux內(nèi)核中獲取真隨機(jī)數(shù)

            作者: 時(shí)間:2016-10-08 來(lái)源:網(wǎng)絡(luò) 收藏

            內(nèi)核隨機(jī)數(shù)產(chǎn)生器

            本文引用地址:http://www.biyoush.com/article/201610/305407.htm

            Linux內(nèi)核實(shí)現(xiàn)了一個(gè)隨機(jī)數(shù)產(chǎn)生器,從理論上說(shuō)這個(gè)隨機(jī)數(shù)產(chǎn)生器產(chǎn)生的是真隨機(jī)數(shù)。與標(biāo)準(zhǔn)C庫(kù)中的rand(),srand()產(chǎn)生的偽隨機(jī)數(shù)不同,盡管偽隨機(jī)數(shù)帶有一定的隨機(jī)特征,但這些數(shù)字序列并非統(tǒng)計(jì)意義上的隨機(jī)數(shù)。也就是說(shuō)它們是可重現(xiàn)的--只要每次使用相同的seed值,就能得到相同的偽隨機(jī)數(shù)列。通常通過(guò)使用time()的返回值來(lái)改變seed,以此得到不同的偽隨機(jī)數(shù)序列,但time()返回值的結(jié)果并不是不確定的(可預(yù)測(cè)),也就是這里仍然缺少一個(gè)不確定的噪聲源。對(duì)于需要真隨機(jī)數(shù)的程序,都不能允許使用偽隨機(jī)數(shù)。

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

            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上用來(lái)處理某條中斷線上注冊(cè)的ISR例程的函數(shù)。這里我們感興趣的地方是:如果ISR在注冊(cè)期間指定了 SA_SAMPLE_RANDOM標(biāo)志,在處理完action后,還要調(diào)用add_interrupt_randomness()這個(gè)函數(shù),它使用中斷間隔時(shí)間為內(nèi)核隨機(jī)數(shù)產(chǎn)生器產(chǎn)生熵。內(nèi)核就是在這里為熵池填充新數(shù)據(jù)的。

            如果我們完全不操作計(jì)算機(jī)會(huì)如何呢?也就是作為噪聲源的產(chǎn)生者,我們完全不去碰鍵盤,鼠標(biāo)等外設(shè),不讓熵池獲得新的數(shù)據(jù),這個(gè)時(shí)候如果去熵池取數(shù)據(jù)內(nèi)核會(huì)如何反應(yīng)?

            內(nèi)核在每次從熵池中取數(shù)據(jù)后都會(huì)減少熵的估計(jì)值,如果熵估計(jì)值等于0了,內(nèi)核此時(shí)可以拒絕用戶對(duì)隨機(jī)數(shù)的請(qǐng)求操作。

            獲取內(nèi)核隨機(jī)數(shù)

            有兩種方法可以從熵池中獲取內(nèi)核隨機(jī)數(shù)。一種是通過(guò)內(nèi)核導(dǎo)出的隨機(jī)數(shù)接口,另一種是通過(guò)特殊的設(shè)備文件/dev/random和/dev/urandom。下面分別討論兩種方法。

            熵的輸出接口

            ?

            1 void get_random_bytes(void *buf, int nbytes)

            該函數(shù)返回長(zhǎng)度為nbytes字節(jié)的緩沖區(qū)buf,無(wú)論熵估計(jì)是否為0都將返回?cái)?shù)據(jù)。使用這個(gè)函數(shù)時(shí)需要在內(nèi)核空間。我們寫一個(gè)小模塊來(lái)測(cè)試一下。

            ?

            #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: %ldn, 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~1ADMINI~1LOCALS~1Temp)A[Y)I~](ZC9Z[3Y)IDK7LK.gif[/img]b/modules/$(KDIR)file:///C:DOCUME~1ADMINI~1LOCALS~1TempOOY5$4OW5H`8`9%(9$)T67M.gifild M=$(PWD) modules

            clean:

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

            #end#

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

            [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


            上一頁(yè) 1 2 下一頁(yè)

            關(guān)鍵詞:

            評(píng)論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉