信息熵與隨機數


在程序開發中,我們經常會用到隨機數,確保某個事件發生是具有隨機性,不可預測性的。而事實是隨機性卻不是那么隨機,我們大多用的都是偽隨機數。那什么才是真隨機數呢?

 

信息熵

什么是熵?在物理學中,熵(entropy)是一個描述系統混亂程度的物理量,熵越大說明系統越無序、越混亂,不確定性越大。例如:一杯水,所有的水分子都是聚集在一起叫低熵,把這杯水靜置一段時間,水分子擴散出處,彌漫到整個房間,這個過程叫熵增。整個宇宙事實上都在做熵增的運動。而人可能喜歡有序,盡量把物體放置整齊,垃圾分類處理,減少熵的增加,讓世界整齊有序活動,喜歡可預測可掌控生活。

那么什么是信息熵?信息熵是描述信息的復雜程度,信息克服了多大的不確定性。例如:abcdefgh..... 我們很容易推測到后面應該是ijklmn,例如數列: 1 1 2 3 5 8 13.... 我們也容易知道后面的數是21。這些都是可預測性的規律,信息熵就比較低。同樣的一本書,英文版本的書信息熵比較低,而中文版的信息熵比較高。因為英文有大量介詞,定冠詞等字母。即時去掉一兩個也同樣能理解這句話的意思,但是同樣的一句話中文表達的信息量就遠大於英文。古代的文言文信息熵就遠大於今天的漢語,因為文言文的信息熵比較高,這也是省了不少竹簡呀!同樣高效的語言文本,最高效的信息熵應該是亂碼,雜亂無章,沒任何規律可循。列如:服務器密鑰文件,比特幣、以太坊私鑰的生成都已經克服了很大的不確定性,足夠混亂,至少現在看來是安全的。

 

隨機數

在Linux內核中采用熵來描述數據的隨機性。為了能產生足夠高效隨機數,Linux系統維護了一個專門用於收集噪聲的熵池(entropy pool),熵池的信息來自外界的熵信息 如:設備驅動的噪音,鼠標點擊的聲音,設備風扇運作的噪音。將這些噪聲收集起來被用於產生真正的隨機數。如果熵池中沒有足夠的噪音資源,就需要等待熵池的收集。只要設備的物理混亂程度越大,熵增就越快,熵池的信息越飽和,隨機性的效率就越高。

/dev/random 是 Linux/Unix  操作系統中的一個設備文件,用來作為隨機數發生器/偽隨機數發生器。它允許程序訪問來自設備驅動程序或其它來源的背景噪聲,Linux是第一個以背景噪聲產生真正的隨機數的實現。這種設計使得/dev/random是真正的隨機數發生器,提供了最大可能的隨機數據熵。因為它是真正以熵池的背景噪音為種子產生隨機數,所以在調用時可能會有堵塞,需要等待熵池有足夠多的熵信息。另外一種 /dev/urandom ,它是非阻塞的發生器,它會重復使用熵池中的信息產生偽隨機數。這種隨機數的生成一般運用在密鑰強度要求不是太高的地方。另外還有一些常見的隨機數算法有線性同余法(Linear Congruential Generator)、梅森旋轉法(Mersenne twister)等。其中線性同余的隨機性相對較差點,而梅森旋轉法的隨機性較好,ruby、python的底層實現采用了這種隨機數算法。
 
 
以太坊私鑰生成,是采用secp256k1曲線,生成橢圓曲線密鑰對,其中橢圓曲線加密算法是當前主流區塊鏈的基石。具體的實現邏輯本篇不在繼續探討,目前還在學習中,在后續文章中會着重介紹。如果你覺得本篇文章對你有幫助,get到了你未知的點,請關注微信公眾號“刻意鏈習”,帶你理解更多的區塊鏈技術。
       
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM