溪穀過客

從一個過客的角度來理解和詮釋世界。
正文

比特幣及區塊鏈淺說(四)

(2016-07-05 07:44:13) 下一個

六、電子簽名設計舉例

這裏我們設計一種最為簡單,極易被破解的電子簽名算法。它雖然不安全,卻能夠很好地說明用公鑰和私鑰產生電子簽名的基本原理。這段文字的目的在於讓讀者理解電子簽名在數學層麵上的實現過程。對數字天生反感的人可以跳過這一節。

比如說我現在有一對數字,7和3。我把7藏起來作為私鑰,而把3作為公鑰告知天下。

我隨便寫了一個數字,比如9,現在我要向天下人證明,這個9是我寫的。

電子簽名的基本思路是:把我所寫的數字與我的私鑰進行運算,得到的結果即為簽名;任何人想要驗證我的簽名,隻需把我得簽名和我的公鑰進行運算,所得到的應該就是數字本身。在這個運算過程中,內容、私鑰、公鑰、簽名通過算法變成了緊緊相扣的統一體,任何一個部分稍加更改,整個運算就不再成立。公鑰和私鑰就是以這種方式來達到驗證文件真偽的目的。

加密的過程是:把9加上我的私鑰7,然後把結果去除以10,最後得到的餘數就是被加密的數字。寫成算式是:

(9 + 7) ÷ 10 = 1 餘 6

現在我鄭重地向世界宣布:這個數字9是我寫的,我還為它做了防偽簽名,這個簽名是6。你們誰要是不相信,可以用我的公鑰3去驗證。

世上還真有好事之徒,他們看到我的宣告之後,立即進行了驗證,驗證的算法和我加密的算法一模一樣,隻不過他們是用簽名6來驗證數字9:

(6 + 3) ÷ 10 = 0 餘 9

看,我把9用私鑰7去簽名,得到簽名6,而人們把我的簽名6用公鑰3去驗證,得到了我寫的數字9,驗證通過。

給一個一位數的數字簽名很容易,假如是一串數字,比如說12345,該怎麽簽名?

我們可以先用一個算法把12345變成一位數的數字,比如說先做1 + 2 + 3 + 4 + 5 = 15,15依然大於10,於是重複此步驟做1 + 5 = 6。 6小於10,最後我把所得結果6用私鑰加密成為簽名:

(6 + 7)÷ 10 = 1 餘3

在發送信息的時候,我需要把內容和簽名一起發出去,例如用下麵的格式:

12345(3)

信息中除了內容之外,還包含了括號中的簽名。人們收到這則信息後,依然可以拿我的公鑰3來驗明正身信息的真假,步驟如下:

1 + 2 + 3 + 4 + 5 = 15

1 + 5 = 6

(3 + 3)÷ 10 = 1 餘6

把信息本身的數字相加相加再相加,最後得出了6,用我的公鑰3去驗證簽名3,最後也得出了6,所以人們得出結論:此消息的確為我所發。

為了幫助大家理解,讓我們把上麵的過程符號化。假設有信息X(長短任意),公鑰A,私鑰B,那麽簽名的過程就是:

現在假定有人寫了一個文件23456,並想偽造簽名,那麽第一步他應該這麽做:把23456相加相加再,直至得到一個小於10的數字2。接下來,因為他沒有私鑰7,所以無法把2 與私鑰進行運算得出簽名。但是他可以隨意猜想簽名是個什麽數字,然後用公鑰來驗證。比方說,他假定簽名是4,然後就可以用公鑰3去驗證,如果通過,那麽證明他猜對了,偽造文件成功!如果驗證通不過,就換一個假定繼續試,直到試通了為止。

假如簽名真像我們所舉的例子這樣隻有一位數,那麽它的確很容易被黑客用上述方法猜到。但是,如果我們把簽名變為一個較大的數,比如說,一個256位的數字,那麽黑客想要用上述方法猜出簽名的可能性就非常低了。即使他使用當今世界上最強大的電腦,也恐怕得算上幾億年才能得到結果。假如哪個黑客真的有這樣的恒心,那就讓他去以此慢慢地消磨自己的時光吧。

七、礦工挖礦

老張為了向老王買燒餅,產生了一個交易文件,此文件被發到網上。那麽是誰來核實文件的真偽,並最終把記錄寫進區塊鏈中呢?答曰:是一群礦工。

礦工(Miner)是比特幣網絡裏一群比較特殊的人,他們專門負責核對每筆比特幣交易並把通過核對的交易記錄在案。這個過程被稱作挖礦(Mining)。

誰能成為礦工來擔當這麽重要的工作呢,有沒有資格考試來挑選稱職的人?有沒有上崗培訓?成為礦工的人是不是每年都要接受KPI考核?

答案是地球上的任何人,隻要他/她願意,都可以成為礦工,這其中當然包括我和你。因為隻有這樣,比特幣才能擺脫掉中間的金融機構,成為一種全自由的貨幣。

那麽普通人為什麽要當礦工呢,他們會通過挖礦得到什麽實實在在的好處嗎?

是的,你每成功核實並記錄一筆交易後,會有一定數量的比特幣送給你作為酬報。這是所有礦工們至今仍在奮力挖礦的一個基本動力。由於比特幣自誕生之日起對美元兌換率便開始不斷走高,因而時至今日,那些早年便開始挖礦的礦工們應該早就賺得盆滿缽滿了。

礦工們的工作是什麽呢?第一,他們要從網上收集諸如由老張所產生的那個交易文件。第二,拿到文件後,他們要用文件中的公鑰去驗證附在後麵的簽名。第三,他們要驗證文件中所提到的區塊記錄仍然有效。第四,他們要驗證交易文件中所寫的金額是正確的。最後,他們要把這筆交易寫到新的區塊鏈中去。

驗證簽名,除了需要驗證老張是公鑰Z的主人之外,還得確保交易文件本身沒有被更改過。

試想,老張產生了交易文件,並把它交給了老王。老王一看,文件裏寫著要付我六元錢。忽然,他腦子裏閃過一個念頭:既然文件是由我送到互聯網上去,那麽我何不就此做個手腳,把文件中的6改為8,那麽我不就能神不知鬼不覺地多賺兩元錢了嗎?

或者,在老王把文件送到互聯網上但尚未到達礦工手裏之時,或許會有黑客入侵,把文件中老王的公鑰W改成了自己的公鑰H,那麽錢會不會就被轉到黑客的賬號裏去了呢?

如果您看過第六節裏舉的例子,就會知道,被篡改的文件在通過驗證簽名這一關時會輕易失效。

因為老張所作的電子簽名其實是包含著原始文件中每一個字符的信息。哪怕就是改動原文的一個標點符號,解密也會失效。

老張的交易文件如下:

吾,公鑰Z持有者,特授權將區塊100第一筆交易所得金額之陸元整轉入賬號W,餘下四元整轉入賬號Z (簽名)

在簽名時,首先老張會把“吾,公鑰Z持有者……轉入賬號Z “這句話做數學運算,得出一個數字,假如說是1234。然後,他再用自己的私鑰去加密1234,比如說他得到了WXYZ 。這個WXYZ便是他的電子簽名。

在驗證此文件時,礦工們需要用同樣的算法把“吾,公鑰Z持有者……轉入賬號Z “這句話做數學運算,得到1234,然後用公鑰去解密簽名WXYZ,假如這時我們也得到了1234,驗證就通過了。

礦工們的任務就是把從網上收集而來的多個類似這樣的交易文件編輯起來,形成一個新的區塊,並將其加入區塊鏈的鏈接中。加入之後,他/她還必須將新形成的區塊鏈發放給網上所有其他礦工,隻有當大多數礦工都開始使用新版本的區塊鏈時,老張和老王之間的交易才算是正式確立。從此之後,老王便可以用從老張那裏得到的6元錢去做新的消費了。

八、找錢及湊錢

在前麵的例子裏,老張向老王買燒餅需要6元錢,而他所使用的是從煤老板老錢那裏得到的10元錢。餘下的4元錢怎麽辦,是像我們平時買東西那樣,讓老張先付給老王10元錢,再由老王找給老張4元錢嗎?

答案是不用那麽麻煩,讓我們仔細看看老張所產生的交易文件的後半段:

吾,公鑰Z持有者,特授權……餘下四元整轉入賬號Z (簽名)

是的,老張的這個交易文件中其實含有兩筆交易:一筆是把6元錢付給老王,另一筆是把餘下的4元錢轉給自己。因而,比特幣的找錢是由買東西的人自我實現的。通過這次交易,區塊鏈中產生了兩個新的記錄,一個記錄歸在老王名下(6元),另一個仍由老張所有(4元),這兩個記錄都可以被各自的主人繼續消費。而原來歸在老張名下的10元錢的記錄由於已經被消費了,因而就不能再被使用。

假如老張看到老王6元錢的燒餅個兒太小,想用16元錢買另外一種豪華燒餅怎麽辦?有兩種辦法可以解決這個問題。其一,老張可以看看自己是否有過一筆收益大於或等於10元的交易,如果有,他就可以用那筆交易的收益去支付燒餅錢。其二,他還可以把兩筆或多筆交易的錢湊在一起做一次性支付。例如,他可以把從煤老板老錢那裏得到的10元錢和從油老板老財那裏得到的6元錢組合起來購買老王的豪華燒餅,在交易書裏他是這麽寫的:

吾,公鑰Z持有者,特授權將區塊99第五筆交易所得金額之陸元整轉入賬號W,區塊100第一筆交易所得金額之拾元整轉入賬號W(簽名)

比特幣的基本原則是,一筆交易的金額隻能被使用一次。假如你動用了任何一筆交易所得的金額,就必須當場把它全部用掉。至於拿多少錢去付賬,多少錢作為找錢送回給自己,那完全是你自己的事情。

(待續)

[ 打印 ]
閱讀 ()評論 (0)
評論
目前還沒有任何評論
登錄後才可評論.