密碼學(xué)是如何保護區(qū)塊鏈的?
本文摘自Logan Brutsche的圖書《The Layman's Guide to Bitcoin》。
密碼學(xué)是應(yīng)用數(shù)學(xué)函數(shù)以保證數(shù)據(jù)安全性的科學(xué)。
許多風(fēng)靡的影視作品都在向人們暗示:只要有足夠厲害的黑客,任何系統(tǒng)都可以被攻破。這種“好萊塢式黑客攻擊”并不是真實世界的場景——黑客必須發(fā)現(xiàn)系統(tǒng)暴露的漏洞,例如未上鎖的服務(wù)器機房、易于猜測的密碼、未受保護的網(wǎng)絡(luò)端口或者內(nèi)部安裝的“后門”,以進而實現(xiàn)未經(jīng)授權(quán)的訪問。
雖然我們的確永遠(yuǎn)無法確保一個系統(tǒng)沒有任何漏洞——畢竟系統(tǒng)都是由不完美的人類所完成的,但是“任何系統(tǒng)都可以被攻破”這一觀點卻是錯誤的。自90年代初以來,我們利用密碼技術(shù)已經(jīng)可以實現(xiàn)完全免受黑客攻擊。但這一技術(shù)在應(yīng)用時有時會留下被黑客利用的空間。
密碼學(xué)本身并不會被黑客攻破以生成偽造的數(shù)字簽名(馬上會給出定義),就像數(shù)學(xué)不能被黑客攻擊而使得2+2=5一樣——雖然密碼學(xué)和數(shù)學(xué)都可能被錯誤地使用。如果一個使用密碼學(xué)的系統(tǒng)被攻破,那只可能是因為設(shè)計者錯誤地應(yīng)用了密碼學(xué)。這不是因為密碼學(xué)不起作用,也不是因為有人“破解”了密碼學(xué)——就像你的銀行錯誤地處理了你的賬戶時不是數(shù)學(xué)的錯誤、你的媽媽下載不熟悉的附件而感染計算機病毒時不是電子郵件的錯誤一樣。這是一個很重要的特點,因為比特幣是一個非常直接的密碼學(xué)應(yīng)用。
密碼學(xué)并不是一種未經(jīng)考驗的新技術(shù)。比特幣所使用的所有密碼學(xué)技術(shù)自互聯(lián)網(wǎng)誕生以來一直都在使用著,是每天使用的許多常見互聯(lián)網(wǎng)協(xié)議的重要部分。計算機科學(xué)家認(rèn)為密碼學(xué)是可靠和必要的,就像NASA(美國國家航空航天局)認(rèn)為宇航科學(xué)是可靠和必要的一樣。
公私鑰對:密碼學(xué)的基石
公私鑰對是區(qū)塊鏈所使用密碼學(xué)的基石。公私鑰對包含兩部分:私鑰和公鑰。這兩個密鑰實際上只不過是具有特定數(shù)學(xué)關(guān)系的大整數(shù),用于代替密碼和用戶名。
你會擁有一個公鑰,就像你的名字或用戶名一樣:在大多數(shù)情況下,你可以向任意請求者分享你的公鑰,而擁有它的人可以用它來引用或聯(lián)系你。它與你的名聲(或者比特幣中你的交易歷史)綁定,所以你可能會有多個公鑰(因此有多個公私鑰對)用于不同的目的。公鑰可用于引用或查看帳戶,但它自身并不能對該帳戶作任何操作。
私鑰應(yīng)該像密碼一樣:不應(yīng)向任何人分享,它用于驗證某些操作,例如發(fā)送BTC(比特幣)。
但是私鑰和密碼之間存在重要的區(qū)別。要使用密碼,你必須將其發(fā)送給某個人或服務(wù)器,以便其對密碼進行驗證。你需要相信密碼在發(fā)送后會被負(fù)責(zé)任地處理。相比之下,私鑰可用于證明自己的身份而無需將其發(fā)送給任何人。它曾經(jīng)存儲或直接使用過的唯一場所就是在你的本地設(shè)備上。
這一點很重要,因為如果你可以在不向任何人發(fā)送你的秘密信息的情況下對自己進行身份認(rèn)證,則可以保證完全控制其安全性——你不易受其他系統(tǒng)的安全漏洞影響。這是使比特幣不可撼動的重要組成部分。比特幣本身并沒有存儲可能泄露給攻擊者的密碼或私鑰,但用戶仍然可以對交易進行驗證。
但是,如果你從來不曾向任何人發(fā)送私鑰,那么如何使用私鑰來驗證交易呢?答案與私鑰和公鑰之間的數(shù)學(xué)關(guān)系有關(guān):數(shù)字簽名。
數(shù)字簽名
有許多種不同的生成和驗證數(shù)字簽名的技術(shù),支撐它們工作的數(shù)學(xué)原理遠(yuǎn)遠(yuǎn)超出了本文的范疇。對于那些不熟悉密碼學(xué)的人來說,這里所描述的過程最初聽起來可能令人難以置信。我很清楚地記得,當(dāng)我四年前剛開始研究比特幣的時候就有過這樣的感覺。
現(xiàn)在我將再次簡要提到,這些技術(shù)被用于許多常見的互聯(lián)網(wǎng)協(xié)議中,并且是信息科學(xué)的既有組成部分。
想象有Alice和Bob兩個人,他們已經(jīng)在私下交換了公鑰。Alice想給Bob發(fā)送一條消息,但Bob是一個非常多疑的人,除非他能夠以數(shù)學(xué)的方式進行確定性地證明,否則他不相信該消息確實來自Alice。為了便于證明,他們同意使用數(shù)字簽名。
為了生成簽名,Alice使用她計算機中的簽名生成算法,該算法將她的私鑰和完整的消息作為輸入,生成一個數(shù)字簽名。然后,她將這個消息/簽名組合發(fā)送給Bob——但重要的是,她不會發(fā)送她的私鑰。
當(dāng)Bob收到消息和簽名時,他可以調(diào)用一個與之互補的簽名驗證算法。該算法將消息和簽名作為輸入,以確定Alice用于生成簽名所使用公私鑰對中的公鑰。當(dāng)Bob看到他的算法輸出Alice的公鑰時,他就已經(jīng)在數(shù)學(xué)上證明了該簽名確實是用Alice的公私鑰對生成的,即使他不知道也無法計算Alice的公私鑰對中的私鑰。
更簡潔地說,這一數(shù)字簽名的過程允許Bob驗證該消息不是由某個第三方創(chuàng)建或修改,而是必須使用Alice的私鑰才能生成的,而不必(或不能)知道她的私鑰。他需要的只有消息/簽名組合和她的公鑰。
直覺上來看,這似乎難以置信,你可能會覺得好像在哪里產(chǎn)生了誤解。如果Alice的私鑰和公鑰密切相關(guān),并且Alice使用她的私鑰生成Bob收到的簽名,那他為什么只能派生出她的公鑰而得不到她的私鑰?要理解這一問題的答案要求比大多數(shù)人對數(shù)學(xué)更深入的理解,這遠(yuǎn)遠(yuǎn)超出了本書的范圍。
盡管如此,這項技術(shù)每天都在被賴以使用,并且在密碼學(xué)社區(qū)內(nèi)被認(rèn)為是堅如磐石的。當(dāng)你訪問某個地址以https開頭的網(wǎng)站時,“s”就表示該網(wǎng)站使用數(shù)字簽名認(rèn)證了它自己。你的計算機使用了簽名驗證算法,就像上面例子中的Bob一樣,驗證網(wǎng)站確實來自正確的公私鑰對。數(shù)字簽名可以確保你和網(wǎng)站之間的任何進一步交互都是經(jīng)過加密和認(rèn)證的。如果驗證失敗,瀏覽器則會警告你,并將該網(wǎng)站標(biāo)記為危險。
足夠大的整數(shù)
在此之前,我簡單地提到了私鑰和公鑰的功能就像用戶名和密碼一樣,但實際上它們只不過是具有特殊數(shù)學(xué)關(guān)系的大整數(shù)。鑒于此,我經(jīng)常被問到以下問題:
“能不能使用計算機猜測或者計算出一堆數(shù)字,并嘗試將它們作為私鑰使用?他們最終是否會碰到某個目標(biāo)公私鑰對的私鑰,從而獲得對該身份的控制權(quán)?”事實上,就比特幣而言,這將使攻擊者可能竊取一些公私鑰對所持有的比特幣。
這是一個很好的問題,但它并不會發(fā)生。如前所述,有幾個擁有價值數(shù)百萬美元BTC的比特幣地址,但它們好幾年一直都沒有被轉(zhuǎn)移——盡管盜取它們需要的只是正確的私鑰——也就是正確的大整數(shù)!如果你能猜到這些地址的私鑰,那么你就可以將其中的錢發(fā)送給任何人。與密碼不同,你可以在自己的機器上本地驗證私鑰,沒有服務(wù)器會限制你的嘗試次數(shù)或頻率。
那為什么還沒有人偷走這些錢呢?答案在于用作私鑰的數(shù)字近乎荒謬的大小。它們足夠大。
我們從一個簡單的思維實驗開始。想象一下,你的私鑰足夠大,大到世界上所有的計算機一起工作,他們需要24小時才能猜到。如果在你的私鑰上增加僅僅一位數(shù)字,計算機就需要十倍的計算量,也就是需要十天而不是一天。而增加六位數(shù)字會使這一時間達(dá)到27000年。
在任何情況下,生成私鑰所需創(chuàng)建隨機數(shù)的計算能力都是微不足道的。使用私鑰生成簽名以及使用公鑰驗證這些簽名在計算上也是簡單的。但猜測私鑰所需的工作量卻隨著每添加一個額外數(shù)字呈指數(shù)增長。為了使私鑰“免疫”于暴力破解,我們只需要添加足夠的數(shù)字——我們只需要使它們足夠大。
那多大是足夠大?比特幣中使用的私鑰是256比特的整數(shù),相當(dāng)于一個長度為76位的數(shù)字。這一數(shù)字的大小是令人難以置信的。接下來的闡釋大部分來自于Bruce Schneier的圖書《Applied Cryptography(應(yīng)用密碼學(xué))》,對足夠大整數(shù)進行直觀說明。
首先,需要了解到熱力學(xué)第二定律的一個具體結(jié)論是改變單個二進制位信息存在所需要的最小能量(將1變?yōu)?或反之)。這意味著無論所使用的硬件如何,任何計算過程都需要一些最小的能量來執(zhí)行。
現(xiàn)在假設(shè)你能夠利用太陽的全部能量輸出來驅(qū)動一臺專門設(shè)計的計算機,這臺計算機的工作是計算或猜測私鑰,以找到一個公私鑰對的私鑰(可以控制BTC)。
使用一點點數(shù)學(xué)和熱力學(xué),你會發(fā)現(xiàn)一臺具有太陽全年能量輸出計算能力的高效計算機可以計算出2178個值。如果我們將這個值除以可能的私鑰數(shù)量,即2256,我們發(fā)現(xiàn)這個擁有太陽全年能量輸出計算能力的假想計算機只能猜測或計算出可能私鑰總數(shù)的0.0000000000000000000003%。
此外,這還只是計數(shù),并不包括實際檢驗每個私鑰以驗證它是否與正確的公鑰對應(yīng)這一更復(fù)雜的任務(wù)。因此,這臺計算機在一年之內(nèi)可能錯過這0.0000000000000000000003%概率的正確私鑰,而它甚至都不會意識到。
這些數(shù)字與設(shè)備的技術(shù)無關(guān); 它們是根據(jù)20世紀(jì)30年代以來建立的熱力學(xué)定律所得出的可能達(dá)到的最大值。這些數(shù)字意味著對256位密鑰(比特幣使用的密鑰)的暴力攻擊將是不可行的,除非計算機是由物質(zhì)以外的東西構(gòu)建并占用空間以外的東西。
這就是足夠大整數(shù)的能力。無論黑客有多厲害,除非他能夠利用3×1023個太陽的能力計算一年,或者一個太陽的能力計算3×1023年,否則他的電腦甚至無法完成對所有私鑰的計數(shù)——更不用說測試或者以其他方式使用它們了。
想要更深入地了解比特幣和密碼學(xué),請閱讀Logan Brutsche的圖書《The Layman's Guide to Bitcoin》。
原文鏈接:https://cloud.tencent.com/developer/article/1051580
【本文是51CTO專欄作者“云加社區(qū)”的原創(chuàng)稿件,轉(zhuǎn)載請通過51CTO聯(lián)系原作者獲取授權(quán)】