隨機數 科普 真隨機數和偽隨機數

2021-10-13 15:56:02 字數 1489 閱讀 9517

位元幣使用者很喜歡討論「非對稱加密」、「橢圓曲線」、「量子計算機」這類高深莫測的話題,然後再以一種非常莫名其妙的方式把幣弄丟,比如說:「隨機」。

隨機很重要,對於位元幣這種密碼學電子貨幣來說,尤其重要。可惜社群內對於隨機的討論並不多,導致很多人缺乏正確的認識,因此,我們今天就和大家聊聊隨機。

說到隨機,有兩個必須要搞清楚的概念:「真隨機數生成器」(trng)和偽隨機數生成器(prng)。

大部分電腦程式和語言中的隨機函式,都是偽隨機數生成器,它們都是由確定的演算法,通過乙個「種子」(比如「時間」),來產生「看起來隨機」的結果。

毫無疑問,任何人只要知道演算法和種子,或者之前已經產生了的隨機數,都可能獲得接下來隨機數序列的資訊。因為它們的可**性,在密碼學上並不安全,所以我們稱其為「偽隨機」。這種隨機數,用來讓遊戲裡的小人跑跑路沒多大問題,如果用來生成位元幣私鑰,那可就太不安全了。

再說說真隨機數生成器,中文維基中,將「硬體隨機數生成器」(hrng)等同於真隨機數生成器,這其實並不十分準確,嚴格意義上的真隨機可能僅存在於量子力學之中,我們當前所想要的(或者所能要的),並不是這種隨機。

我們其實想要一種不可**的、統計意義上的、密碼學安全的隨機數,只要能做到這一點的隨機數生成器,都可以稱其為真隨機數生成器。這種真隨機,並不一定非得是特殊設計的硬體,linux作業系統核心中的隨機數生成器(/dev/random),維護了乙個熵池(蒐集硬體雜訊,如:鍵盤、滑鼠操作、網路訊號強度變化等),使得它能夠提供最大可能的隨機資料熵,因此同樣是高品質的真隨機數生成器。

不過/dev/random是阻塞的,也就是說,如果熵池空了,對於/dev/random的讀操作將被掛起,直到收集到足夠的環境雜訊為止。

因此,在開發程式時,我們應使用/dev/urandom,作為/dev/random的乙個副本,它不會阻塞,但其輸出的熵可能會小於/dev/random。

好了,在說了這麼多之後,在我們開發位元幣應用時,應該使用何種隨機數生成器來生成私鑰呢?

答案很簡單:urandom。永遠只用urandom。

不要使用任何第三方的隨機數解決方案,哪怕是一些高階的安全庫,所提供的聲稱「非常安全」的隨機函式。因為它們都是使用者態的密碼學隨機數生成器,而urandom是核心態的隨機數生成器,核心有權訪問裸裝置的熵,核心可以確保,不在應用程式間,共享相同的狀態。

歷史上,無數次隨機數失敗案例,大多出現在使用者態的隨機數生成器,而且,使用者態的隨機數生成器幾乎總是要依賴於,核心態的隨機數生成器(如果不依賴,那風險則更大),除了沒準兒能簡化您的某些開發工作,絲毫看不出任何額外的好處,反而增加了因引入第三方**,所可能導致的潛在安全風險。

因此,開發者在需要密碼學安全的隨機數時,應使用urandom。

最後,有小朋友問,你們的bithd硬體錢包生成的是真隨機數嗎?

這裡回答一下:當然是啦~

bithd的晶元是有硬體隨機數發生器的,它會通過獲取物理雜訊源來生成真隨機數,這個是不可**,不可探測的,是真正的隨機源。

隨機數生成 偽隨機數和真隨機數

c語言隨機數的生成,很隨機,又不隨機,比如像下面的程式 c語言生成隨機數的函式在stdlib.h庫中 include includeint main return 0 上面的 經過執行生成了 41 18467 6334 26500但是無論執行多好遍結果都是一樣的,隨機數並不隨機。這是因為rand 函...

隨機數 偽隨機數

隨機數 偽隨機數 rand函式在產生隨機數前,需要系統提供的生成偽隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次呼叫rand函式生成的偽隨機數序列都是一樣的。srand unsigned seed 通過引數seed改變系統提供的種子值,從而可以使得每次呼...

生成偽隨機數

真正的隨機數只能自然生成,所以我們人工得到的隨機數被稱為偽隨機數。使用中的rand 函式可以生成0 rand max之間的隨機整數.rand 函式使用乙個起始的種子值生成一系列數字,對於乙個特定的種子產生的序列數永遠是相同的。如果使用rand 函式只使用乙個種子值,即預設的種子值,就會使得序列數是有...