精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
linux下真正的"偽隨機數(shù)"

      偽隨機數(shù),程序員哪個不知,哪個不曉。在linux下,設置好隨機種子,然后調用rand()函數(shù),但你真的知道了解它嗎?其實你錯了,這個"偽"確實夠偽的,騙了很多人,不信,看如下代碼:

1
2
3
4
5
6
7
#include <stdio.h>
#include <stdlib.h>
int main(void) {
    srand(100);
    printf("%d\n",rand());
    return EXIT_SUCCESS;
}

      你把代碼運行10遍,發(fā)現(xiàn)啥了?咦,怎么每次的結果都一樣啊,這樣別人如果知道種子(100)了,就知道結果了,這樣的結果配叫隨機數(shù)啊。常用的方法就是種子用時間來計算,但安全性不高,你我都知道你會用時間做種子算法,那還安全啊,我每次打游戲老怪就老蹲在一個地方打,反正你是"隨機坐標"出來的怪獸嘛!顯然問題相當嚴重了,那咋辦?
      最簡單的辦法:種子也用隨機數(shù)來表示。這,我不說你都知道問題了,本來就是求隨機數(shù)都沒出來,你還整個隨機種子,表妹知道肯定說打死我。哎,好在linux給我們提供了“真正的”隨機數(shù),在內核中,linux會維護一些偶然出現(xiàn)的數(shù)據,并且為用戶提供訪問接口。之所以稱之為真正的隨機數(shù),是因為這些數(shù)據來源于計算機本身的偶然操作,比如硬盤操作、鍵盤和鼠標的操作,等等。這些操作比起那些通過固定算法生成的偽隨機數(shù)來說,當然是更真實一些了,它被叫做“熵”。內核提供的接口是/dev/random和/dev/urandom設備,二者的區(qū)別是讀取時random肯定會返回一個數(shù),如果沒有足夠的數(shù)據,就會阻塞。而urandom則不會阻塞,但是不保證返回的是合適的數(shù)據。下面就針對這兩個接口來看看真正的隨機數(shù)是怎么產生的:
      一,使用/dev/random接口,代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <sys/time.h>
#include <fcntl.h>
unsigned int new_rand ()
{
    int fd;
    unsigned int n = 0;
    fd = open ("/dev/random", O_RDONLY);
    if (fd > 0)
    {
        read (fd,&n,sizeof (n));
    }
    close (fd);
    return n;
}
int main ()
{
    int n, i;
    //init_random ();
    srand(new_rand());
    n = rand ();
    printf ("n=%d ",rand());
    return 0;
}

      這一種方法夠簡單明了,通過讀取linux中真正的偽隨機接口/dev/random來真正的隨機產生種子,種子都隨機了,結果還不隨機啊。但問題明顯,我剛說了,讀取時random肯定會返回一個數(shù),如果沒有足夠的數(shù)據,就會阻塞。這個阻塞有時是會帶來安全問題的。
      二,使用/dev/urandom接口,代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <sys/time.h>
#include <fcntl.h>
void init_random ()
{
    unsigned int ticks;
    struct timeval tv;
    int fd;
    gettimeofday (&tv, NULL);
    ticks = tv.tv_sec + tv.tv_usec;
    fd = open ("/dev/urandom", O_RDONLY);
    if (fd > 0)
    {
        unsigned int r;
        int i;
        for (i = 0; i < 512; i++)
        {
            read (fd, &r, sizeof (r));
            ticks += r;
        }
        close (fd);
    }
    srand (ticks);
}
 
int main ()
{
    int n, i;
    init_random ();
    n = rand ();
    printf ("n=%d ", n);
    return 0;
}

      這個方法相比較第一種而言,很明顯獲取隨機種子時麻煩一些,表現(xiàn)在居然循環(huán)了512次,遮掩做主要是因為剛說過讀取/dev/urandom設備會立即返回,但并不保證會得到合適的數(shù),所以多做幾次,保證能獲得需要的數(shù)。

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
000.【Web安全】你所使用的隨機數(shù)真的安全嗎?
概率與測度 (3):概率模型 ? Free Mind
/dev/random和/dev/urandom區(qū)別 ? 死灰的博客
Linux內核隨機數(shù)產生器的設計與實現(xiàn)(zt)
linux shell實現(xiàn)隨機數(shù)多種方法(date,random,uuid)
今天聊一聊Linux系統(tǒng)中這兩個特殊的設備文件
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服

主站蜘蛛池模板: 南开区| 开平市| 正定县| 营山县| 绍兴县| 郁南县| 巴楚县| 长葛市| 南澳县| 乐都县| 永清县| 邳州市| 汤原县| 长汀县| 云浮市| 秭归县| 桃源县| 乐至县| 城口县| 潮安县| 莱西市| 芦溪县| 溧水县| 建昌县| 保德县| 高邑县| 楚雄市| 东方市| 浠水县| 海城市| 五峰| 彰化县| 敦煌市| 孝义市| 屏东市| 城固县| 临桂县| 中阳县| 贵阳市| 泗水县| 和静县|