阿土仔走進房間,鎖門關窗,變出一個私鑰。他很得意,因爲這個房間密不透風,之後一個月他陸續把 18.5 個比特幣放進對應的地址。

兩天後,這些幣不翼而飛。

阿土仔一屁股坐在地上,欲哭無淚,保密工作嚴絲合縫,不會是被人猜到了私鑰吧?

這是個坊間傳聞,讓人不寒而慄。我們先繞開這個故事的真實性,從概率角度幫阿土仔算算私鑰被人猜到的可能性,並且吹散一朵懸在你心頭已久的疑雲:

爲什麼私鑰不可能被猜到?

一、私鑰是一個隨機數

如果你有過比特幣,那你眼中的私鑰應該長這樣:

KxqVS5 Bs1T1MoNA5HG9kgFyF5wtNeWMRFUf55 Bq2XAqjshWNw85d

但在計算機內部,私鑰是一個 256 位的隨機數,表現爲 256 個 0 或 1。我們借 Excel 用 8✕32 的表格展現。注意,實際上並不是八行,而是一行:

圖 1 比特幣私鑰是個 256 位隨機數

每一位只有 0 或 1 兩種可能,但 256 位的長度,使得這個隨機數的可能數量達到 2 的 256 次方。如果你用計算器算,就會發現結果是 1.16×10 的 77 次方:

我們都知道這是個很大的數,但到底能有多大,並不是每個人都清楚。

假如你從 3 歲起數星星,每秒數 1 只,不喫不喝不睡,節假日雙不休,數到 303 歲,那麼你能數完 100 億顆星星。

而這個數字,是 10 的 10 次方:

你可能會想,如果開個掛,300 年的星星在 1 秒內數完,是不是能快點?那麼恭喜你,用同樣的勤勉數上 300 年,能數完的星星數量是 10 的 20 次方:

好吧,你累了,兄弟我來陪你一起數,而且繼續開掛:把 10 的 20 次方個星星打包成 1 顆星,1 秒數完,那麼到我們 150 歲生日那天,能數完的星星數量是 10 的 30 次方:

太好了,我們並肩數完了全宇宙的星星,可是私鑰還有很多呀。我們把三生三世數過的十里星光換算成私鑰的數量,並且操起量子計算機的鍋鏟,再炒三世輪迴,那我們能遍歷多少私鑰呢?

答案是 10 的 60 次方:

那現在我們距離私鑰世界的盡頭 10 的 77 次方還要走幾里路呢?

數學說:很好,你倆已完成了全部工作量的 0.0000000000000000001%

心好累。

量子助場,幾世開掛,本想死磕自己,卻沒想到磕死了兄弟我,還沒磕出根毛。

其實也不奇怪,因爲私鑰個數在數量級上接近一個數字:宇宙中全部原子的個數——10 的 80 次方:

我們花幾輩子去數全宇宙的原子,數不完也不冤。所以可想而知,作爲一個隨機數,被人撞出來得有多憋屈?

不過確實有一種可能,使得私鑰被撞不是神話,因爲一些工具生成的私鑰是僞隨機數。

二、什麼是僞隨機數?

僞隨機數由確定性算法產生,乍看很難找出規律,但只要重複足夠多次,週期特徵就會浮出屏幕。

爲什麼會這樣?

因爲僞隨機數的生成原理:種子驅動

每個僞隨機數都由上一個數和種子決定。種子來自其他隨機算法,是隨機數的隨機數,最常見的種子是時間,如 2018 年 3 月 10 日 18:30。

任何人只要知道隨機算法和種子,就能根據前一數掐算出後一數。也就是說,如果算法和種子被人猜到,隨機數就是明文

我們平時可以用僞隨機數在單位年會上抽個獎,但在雕刻私鑰的場合,還是應該謹慎些,因爲僞隨機數的可測性使得它在密碼學上並不安全。

比如,本來應該遍歷我們七生七世數過的星星數,但一次不經意的循環就能指數級地剝落遍歷範圍,使得最終能遍歷到的隨機數數量,僅限於我們第一世數過的星星:100 億個。

所以,即使惡意者不知道你的種子,但只要他們搬出一臺小小的量子計算機,就能一炮轟開你的財富大門,因爲你算法能遍歷的空間就這麼一點。如果換作普通計算機,一年半載也能攻破。

可事實卻是:

絕大多數人在製作私鑰時,並不會在意是否使用了僞隨機數生成器,也不會在意使用的種子是什麼貨色,更不會在意暴力遍歷全局所需的時間。

僞隨機數像一個頭箍一樣,套在我們看不見的曠野上,把原本龐大的可能性越箍越細,極速收斂,收斂到只剩一點,甚至是點中的點。

但是,如果你從沒在意過這些也不必焦慮。還記得麼?我們幾世輪迴開掛數過的星星數目,最終也不過是根毛。所以,如果一個僞隨機數生成器能遍歷到我們那樣的範圍,同時很難找到規律,那也算個英雄。

很多研究稱程序算法生成的都是僞隨機數,這是有充分根據的。可如果遍歷範圍足夠大、不可測性足夠高、破解時間需要成萬上億年,那麼在數學意義上它也足夠安全。

你可能已經發現,每枚硬幣都是一個僞隨機數生成器,只是遍歷範圍小,而且規律明顯:出現頻率各爲 50% 的 0 和 1。但 256 枚硬幣拼出的僞隨機數矩陣,就接近一個真隨機數生成器。

三、真隨機數不在燈火闌珊處

真隨機數指依賴硬件參數變化產生的隨機數,能遍歷所有數字空間——維基百科

我們可以用物理方法產生真隨機數:拋硬幣、擲篩子、使用電子元件的噪音信號。基於真隨機數產生的私鑰範圍充斥 1 到 2 的 256 次方之間,而且完全摸不到規律。

說到真隨機數,有個無法繞過的概念——熵池

熵池是貯藏隨機性的思維工具,用熵池值度量。你可以把熵池值理解爲搗糨糊的程度:漿糊搗得越濃厚,熵池值就越高,能提供的隨機性也越大,在此基礎上烤出來的隨機數就越香。

基於圖 1 的私鑰原理,我們可以土法煉鋼,燒製出自己的真隨機數私鑰。方法是拋硬幣,逐一記下結果,斷網後用數學工具將結果轉成私鑰格式。

但是你把一個硬幣連拋 256 次,熵池值就不如你分別拋 256 個硬幣來得高;一口氣拋 256 個硬幣,熵池值就不如每天吸一口氣、分十口氣拋完來得高。

熵池的概念同樣適用於僞隨機數,如果你鍾情高熵池,可以先打開錢包,再打開我們公衆號撫摸兩篇文章,再生成私鑰,就能獲得更多的隨機性。

熵池解決的是隨機性問題,讓人找不到下一個數出現的規律。這是真僞隨機數共享的概念,而區別於僞隨機數最重要的點在於:真隨機數範圍極大。

你一定聽過國王在棋盤上獎勵別人大米的故事:64 個格子,第 1 個格子獎 1 粒米,之後每格獎的米粒比前一格多一倍,到第 64 個格子,需要獎出的米是全球 800 年大米產量之和。

在任何不起眼的小點上翻一倍,持續翻,用不了多久就會出現一個令人乍舌的數字。

把國王的故事反過來看:對着任何好運攔腰連砍 256 刀,就能切碎所有偶然。所以,真隨機數雖然存在,但並不在燈火闌珊處,並非閒雜人士用千百次回首就能找到。

於是我們能推測,用量子計算機去刺探真隨機數私鑰,有生之年是刺不過來的。

量子計算機看起身強力壯,但在遍歷真隨機數私鑰上是肌無力的,它咬緊牙關也只能往前爬 10-20 個數量級,而真隨機數私鑰有 77 個數量級,有種手握圓珠筆頭、心想戳穿地球的感覺。

而且,假設未來出現超越量子計算機的技術,能追上真隨機數的數量,但只要輕輕拉長私鑰長度,哪怕只長出一位,就能讓這種尖端技術的鋒芒像棉花一樣噗嗤軟下來。

下面我們從視覺角度,對比真僞隨機數的生成,白線和藍線代表兩種隨機數遊走的結果:

剛開始,我們並不能斷言誰真誰僞:

還是看不出規律?此時,如果讓藍線繼續遊走,週期特徵立即瞭然:

經過足夠多次的重複遊走,真僞隨機數的面目已然清晰:

我們並不能因此斷言白色就是真隨機數,因爲如果把上圖向四周擴展到足球場那麼大,可能會出現另一種規律。但相對藍數,白數僞得不是很厲害。

有研究稱,嚴格意義上的真隨機數只存在於量子力學中。到底有沒有真隨機數?我們無力遍歷,也無法證僞,所以這種討論會飄成一個哲學問題。

但有一點可以明確,如果兩次產生了相同的私鑰,那一定是程序問題,歷史上幾次因隨機數導致的丟幣,都是因爲寫錯程序,比如 blockchain.info 上兩三次隨機數事件。

回憶一下我們曾面對的星空,對於 2 的 256 次方來說,碰撞絕無可能,這是整個密碼學的根基

具體體現在:如果你確實知道,那你當場就能拿出私鑰。可如果不知道,那你盼穿雙眼、望盡飛鴻,飛鴻也不會理你。

真隨機相對僞隨機不僅遍歷範圍大,而且沒規律。如果僞隨機數是地球上的石頭,那真隨機數就是宇宙裏的沙子。

同時,任何一顆沙子往下個數量級一滾,就會潑出一片宇宙,我們擡眼望到的宇宙星空全景,不過是一顆微塵表面無法被人感知的突起。

所以,如果有人問你爲什麼真隨機數私鑰無法被人猜中,那古倩敏寫的一句歌詞就是對他最好的回答:

山河大地本是微塵,更何況是塵中的塵。

結語

阿土仔並非虛構,而是確有其人:Turkeyslam。他曾用一個月陸續存入 10 筆比特幣,兩天後被人轉走,他跑去 Reddit 上求助,還貼出自己地址的交易記錄。

但這於事無補,因爲那個世界沒有法院,只認私鑰。

這是密碼學的底層哲學——用數學燃盡心懷惡意者的好運,以此保護你的財產神聖不可侵犯。可人們常常未曾在意過數學端來的這份好意,這和我們生活的場景有很大關係。

比如,日常生活中得知同事工資比自己多 10% 時,很多人會心生雜念,但直面大數時,人類往往束腦無策,因爲它極少出現在生活場景中。很多人對超大數的感知和嬰兒對手槍的陌生是一樣的。

在超大數層面,幾倍的不同都可以認爲完全相等,數量級外的差距才值得關注。

這是我們基因中缺失的一縷 DNA。

人類祖先剛把大腦從史前空運而來,這讓我們對超大超小數的概念停留在結繩計數時代——所有的數不過是十根手指嘛。科技爆炸短短百年,我們還不習慣脫離本能思考,所以總在看不見的數量級上一臉茫然。

唯一的應對方式是凝視自己的直覺,不斷啓用大腦皮層的邏輯思考區域,而真隨機數的概念是對這種認知模式的小小歷練。

我們從真隨機數的星空回到日常生活,凡事都有利弊,但不是所有弊端都值得計較。很多時候經你權衡,很容易算出優劣,並且常常是數量級的差距。

很多牛人忽略小事不是大老粗的個性,而是因爲細算過的理性。

誰都曾用扔掉西瓜的代價去撿過芝麻,所以我們需要明辨的除了輕重緩急,還有輕重的數量級,然後把精力和資源傾注到那些最重要的事情上,這是數學曾在我們耳邊私語過的悄悄話。

來源鏈接:None