五、公鑰與私鑰
在老張寫給老王的交易文件裏出現了一個新名詞:公鑰。什麽是公鑰?既然有公鑰,那麽有沒有私鑰呢?
有的。公鑰(public key)和私鑰(private key),正是我們即將介紹的另一組新概念。
俗話說,一把鑰匙開一把鎖。然而,在公鑰和私鑰係統中,我們卻非得給一把鎖配兩把鑰匙:被鑰匙A鎖上的鎖隻能用與之對應的鑰匙B才能打開;反之亦然,被鑰匙B鎖上的鎖也隻能用鑰匙A來開鎖。
我可以選擇這兩把鑰匙中的一把作為私鑰,藏在一個非常安全的地方。除了自己,任何其他人都休想得到它。剩下那把鑰匙則可以作為公鑰,配上一千多把,滿大街亂扔,誰想用誰用。
自家的鑰匙滿大街亂扔?萬一被不懷好意的人拿了去會不會出岔子?
其實不必擔心,我們說過,公鑰和私鑰是一對鑰匙,二者必須配合起來才能起到應有的效果。讓我們先舉一例來說明它們的用途。
話說大唐天子唐明皇很寵愛一位名叫楊玉環的貴妃。這楊玉環生的天仙一般,不但人聰明,還懂音律,擅歌舞,甚得天子歡心。
楊貴妃平生有兩大愛好,一是泡溫泉,一是吃遍天下的水果。泡溫泉很容易,因為他們在驪山腳下就有一處豪華行宮,閑來無事去那裏住住非常方便。而吃水果就有點難了,因為好的水果大多生長在南方,從遙遠的南方把水果送到長安,路上要很多人經手。這些人雖然口口聲聲死心塌地地效忠大唐天子,然而依然難保他們會在途中產生二心,給那鮮美的水果玩些掉包、卡油、或以次充好、以小充大的勾當。
為了讓最疼愛的妃子吃到可口的原裝水果,唐明皇想出了一個絕妙的計策:讓工匠製作了數千個水果專用匣,每個匣上配有皇家禦用鎖。所有匣子上的鎖都使用兩把鑰匙,一把公鑰,一把私鑰。私鑰隻有一把,由唐明皇親自保管。公鑰隨鎖附在匣子上,一起被分發給全國各地的大小官員。唐明皇傳出聖喻:今後各地官員凡欲向朕進貢水果者,必先以此禦匣小心盛之,再以所附公鑰封之,不得有誤—―欽此。
從此之後,唐明皇每天都會收到很多從全國各地送來的水果匣。每當收到這些匣子時,他總要拿出貼身藏著的私鑰,親自動手打開上麵的將軍鎖。每當看到那將軍鎖“哢嚓”一聲被打開,唐明皇的臉上就會露出得意的笑容。他知道:這匣水果的確是原裝的,中間沒有人動過手腳,自己今天又能討得愛妃的歡心了。
這便是公鑰和私鑰的一種用法。在過去,這樣的設計也許隻對極為尊貴的貴族才有意義,因為普通人連飯都吃不飽,若是有人給你送東西,你早就樂得屁顛屁顛的,哪管它是不是原裝?可社會發展到了今天,普通草民也要講究起來了。比如說,我今天買房,中介要從網上給我寄一份含有敏感信息的文件,我不希望文件在網上流動時內容被別人看見,又不想親自跑一趟去拿。怎麽辦?很簡單,我可以產生一對電子鑰匙,就像前麵那樣,一個公鑰,一個私鑰。私鑰我自己留著,公鑰我送給中介。中介用公鑰把文件加密後寄給我,我用私鑰打開,非常安全。請注意,公鑰被別人偷了去一點兒關係也沒有,因為它隻能用來加密,不能用來解密。
公鑰和私鑰還有另外一種用途,那就是防偽,還是舉一個容易被理解的例子加以說明。
據說現在市麵上偽造的茅台酒特別多,很多茅台酒的忠實客戶也開始抱怨,說自己的利益受損,希望茅台酒廠嚴格把關。
茅台酒廠領導在聽到群眾的呼聲之後,召開了一個擴大座談會議,嚴肅地討論了這個問題。在會上,他們一致認為:群眾的疾苦就是我們的疾苦,群眾的困難就是我們的困難。我們一定要開動腦筋,群策群力,想出一個好辦法來保障消費者的權益。
會議最後得出的結論是,他們將為每一瓶茅台酒的瓶口加一把鎖。這些鎖一律配有兩把鑰匙,一把是私鑰,由茅台酒廠保管,出廠前用此鑰匙把瓶口鎖住。另一把是公鑰,它的設計圖紙及製作流程將公布於天下。
一時間,各大企業、商家、小商販紛紛開始複製茅台酒廠的公鑰,將其賣給喜愛茅台酒的人。茅台酒廠的領導並不去追究這種山寨自己公鑰的行為,因為他們知道,得到公鑰的人越多,假酒就越沒有市場,自己的利益反而會得到保護。果不其然,當酒廠開始發售被上了鎖的茅台酒之後,人們喝酒前總會拿出公鑰去開那酒瓶子。假如打不開,那肯定是假酒。漸漸地,茅台假酒從市場上銷聲匿跡了,酒廠的效益也隨之直線上升。茅台酒廠甚至將自己的廣告詞換成了:“隻有用這把鑰匙打得開的酒,才是真正的茅台酒。”
在這裏,公鑰和私鑰發揮了防偽的作用。
當然,在互聯網世界裏我們同樣可以用公鑰和私鑰實現上述功能,隻不過,這裏的鑰匙並非金屬所製,而是由普通的數字所組成。
任何一對數字,隻要它具有下述特性,就可以作為公鑰和私鑰使用:如果用其中一把鑰匙給信息加密,那麽就隻能用另外一把來解密,反之亦然。
數字的確可以起到鑰匙的作用,具體例子請見下節。現在假定我們已經找到符合上述要求的一對數字,並且願將其中的一個作為公鑰,另一個作為私鑰。
有了公鑰,我們可以像唐明皇那樣,將它遍灑於天下,讓所有人向我們進貢極品。有了私鑰,我們就可以向世人證明:我就是我,如假包換。
這其實正是銀行之類的大機構為我們提供的基本服務。在去銀行開賬號的時候,我們需要提交身份證明,銀行在驗明正身後會給我們一串數字作為賬號,還要求我們想出一個隻有自己才知道的密碼。這樣,當我們走到這家銀行的任何一個提款機前時,就可以用此密碼從自己的賬號裏提取現金。在這裏,銀行起到的作用是什麽呢?很簡單,把我們的密碼和銀行賬號這兩個數字聯係起來。
再想想公鑰和私鑰吧,不需要社會安全號,不需要駕照或其他身份證明,它們本身就可以通過數學算法聯係在一起。既然我們能通過算法和把兩個數字安全地聯係起來,那還需要銀行做什麽!
事實上,私鑰和公鑰正是比特幣這座摩天大廈的堅固基石。我們所申請到的比特幣賬號,實際上就是一對數字:私鑰和公鑰。為了保證自己的財富不至流失,我們應該妥善地保管私鑰,把它放在最安全的地方。但公鑰則是知道的人越多越好:我們可以用郵件把它發給陌生人,把它印在名片上,製成二維碼隨便讓人掃描等等。誰不希望天下的人都往自己的賬號裏打錢呢?
讓我們再次回到區塊鏈裏存儲的比特幣交易記錄:
……
區塊100
交易1:承接區塊99之交易2,自賬號Q轉10元錢進賬號Z。
交易2:承接區塊99之交易3,自賬號Q轉10元錢金賬號M。
交易3:承接區塊99之交易3,自賬號Q轉10元錢金賬號W。
……
這裏的Q、Z、M、W分別相當於老錢、老張、老馬和老王比特幣賬號的公鑰。
再看老張為從老王那裏購買燒餅而產生的交易文件:
吾,公鑰Z持有者,特授權將區塊100第一筆交易所得金額之陸元整轉入賬號W,餘下四元整轉入賬號Z (簽名)
這個交易文件中出現了兩個公鑰,一個Z,一個W。從區塊100的第一筆交易記錄看,Z的確從Q那裏得到過十元錢。那麽怎麽保證產生這個交易文件的主人是不是公鑰Z的持有者呢?這就是文件末尾(簽名)的重要性所在。這個簽名就像茅台酒瓶子上的那把鎖,隻有用相應的公鑰才能打開。換個角度來闡述這個問題:你現在要從賬號Z往外轉錢,而你聲稱自己是賬號Z的主人並且留下了用私鑰Z簽好的簽名,那我現在就用公鑰Z來驗證這個簽名。如果驗證通過,證明你的確擁有和Z相對應的私鑰,也就證明了你是賬號Z的主人。否則,這個文件的真實性就非常可疑。
這個文件被傳到網上後,所有人都可以根據簽名來驗證文件的真實性。在真實性得到確定之後,這筆交易就會被寫到區塊鏈中,成為永久性記錄:
……
區塊101
交易1:承接區塊100之交易1,自賬號Z轉6元錢進賬號W。
交易2:承接區塊100之交易1,自賬號Z轉4元錢進賬號Z。
……
至此,老張賬號下的6元錢便轉到了老王的賬號裏。而餘下的4元錢,依然保存在老張的名下,雖然它在區塊鏈裏的位置改變了。
(待續)