區塊鏈資產樸素安全課

區塊鏈資產樸素安全課

概念像空氣,環繞在我們四周。海濤拍岸之時,你可以緊盯K線,也可以死磕概念,這都可以成為你的選擇,但微塵和山河的關係不應該被我們忘記。

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

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

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

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

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

一、私鑰是一個隨機數

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

KxqVS5Bs1T1MoNA5HG9kgFyF5wtNeWMRFUf55Bq2XAqjshWNw85d

但在計算機內部,私鑰是一個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。

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

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

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

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

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

概念像空氣,環繞在我們四周。海濤拍岸之時,你可以緊盯K線,也可以死磕概念,這都可以成為你的選擇,但微塵和山河的關係不應該被我們忘記。


分享到:


相關文章: