1.C僞隨機數,可預測,可用來作加密解密,如git
int main() { // This program will create same sequence of // random numbers on every program run for(int i = 0; i<43; i++) printf(" %d ", rand()%48); return 0; } 而執行後的結果竟然是固定的: >$ ./seed 7 22 9 19 17 31 10 12 9 13 26 43 2 43 35 22 12 18 4 40 11 8 39 45 38 26 14 19 19 31 41 42 6 18 29 39 1 40 19 10 21 45 21 ### 加密算法實現 > flag:Flag:{0b172e75-18a0-4d06-a8ec-421775ac12f9} > key:!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{} 根據c的僞隨機能夠預測,按位加密flag:**key[rand() % keysize]*flag[i]%256**
引用一篇文章介紹僞隨機數:github
srand(unsigned(time(NULL))); //隨機種子算法
int rand_number = rand(); //得到隨機數數組
這裏主要涉及到了三個函數,srand(),rand()和time()。dom
不知道這三個函數是作什麼的?MSDN文檔中解釋了這三個函數的做用:函數
srand():Sets the starting seed value for the pseudorandom number generator(設置僞隨機數生成器的起始種子值)。網站
它的搭檔rand():Generates a pseudorandom number(生成一個僞隨機數)。加密
而time()的解釋就更簡單了:Get the system time(得到系統時間)。code
這三個函數組合在一塊兒,就能夠生成隨機數。事件
細心的同窗可能會發現這裏有一個特殊的詞-僞隨機數。那麼什麼是僞隨機數呢?
關於僞隨機數的概念我就很少說了,你們自行搜索一下就有不少解釋,在這裏我只說一下本身的理解:
先說一下真隨機,真隨機也就是咱們平常說的隨機,一個隨機事件的結果是不肯定的,好比拋硬幣,在正常狀況下,拋硬幣的結果是不肯定的,換句話說,結果是不可預測的。
而後說說僞隨機,僞隨機是計算機生成隨機數的一種方式,計算機不能真正模仿隨機事件,而只能經過計算來生成隨機數。換句話說,若是咱們知道了計算機計算隨機數的算法,咱們是能夠預測僞隨機數的。
固然咱們得用例子說話。
從上面的討論咱們能夠知道,由於rand()產生的數字是僞隨機數,因此它必定有一個固定的算法來生成僞隨機數,那麼算法是固定的,不固定的只有srand()所設置的種子了。
肯定了這一點以後,咱們就能夠作實驗驗證咱們的猜測了。
若是srand()設定的種子是一個固定值會發生什麼?
srand(1);
int rand_number = rand();
在我執行了N次以後,結果都是固定的。(你們能夠親自試一試)
這就說明咱們的「隨機數」就是經過某種算法計算出來的結果,因此要想這個結果發生變化,就須要設定一個不斷變化的「種子」。
那麼這裏也就解釋了「種子」的做用-用來給隨機數生成器提供一個輸入,以後隨機數生成器就會使用這個「種子」生成不一樣的僞隨機數。
舉個栗子~
若是咱們的隨機數生成算法是這樣的:
rand=1+x;
那麼咱們的「種子」就是上式中的x,,每當咱們輸入不一樣的x,產生的結果rand也就會不一樣。
至於爲何選擇time()做爲「種子」嘛,上面說了,這個函數呢,用來獲取系統時間,由於系統時間是一直在變化的,就至關於咱們隨機數的「種子」是在一直變化的,因此每次調用time()函數,都會得到不一樣的值,這樣咱們的rand()每次生成的結果也就不同啦~
最後總結一下這三個函數在生成僞隨機數的時候是怎麼配合的。
首先,time()獲取了系統時間;而後,srand()把獲取到的系統時間設置爲rand()的「種子」;最後,由rand()經過計算,把「種子」轉換爲一個數字。
好啦,這篇文章就寫到這裏了~
歡迎你們訪問個人網站:https://bfss.github.io/,若是以爲個人文章幫到了您,能夠在網站上點擊「支持我」對我進行鼓勵喲~(手機端網頁在左上角,電腦端網頁在右上角)
做者:北方素素
https://www.bilibili.com/read/cv311534
2.隱寫術,載荷對信號幾乎無影響,跟噪聲沒法區分。