密碼學是應用數學函數以確保資料安全性的科學。
許多風靡的影視作品都在向人們暗示:只要有足夠厲害的駭客,任何系統都可以被攻破。這種「好萊塢式駭客攻擊」並不是真實世界的場景——駭客必須發現系統暴露的漏洞,例如未上鎖的伺服器機房、易於猜測的密碼、未受保護的網路連接埠或內部安裝的「後門」 ,以進而實現未經授權的存取。
雖然我們的確永遠無法確保一個系統沒有任何漏洞——畢竟系統都是由不完美的人類所完成的,但是「任何系統都可以被攻破」這一觀點卻是錯誤的。自90年代初以來,我們利用密碼技術已經可以實現完全免受駭客攻擊。但這項技術在應用時有時會留下被駭客利用的空間。
密碼學本身並不會被駭客攻破以產生偽造的數位簽章(馬上會給予定義),就像數學不能被駭客攻擊而使得2+2=5一樣──雖然密碼學和數學都可能被錯誤地使用。如果一個使用密碼學的系統被攻破,那隻可能是因為設計者錯誤地應用了密碼學。這不是因為密碼學不起作用,也不是因為有人「破解」了密碼學——就像你的銀行錯誤地處理了你的帳戶時不是數學的錯誤、你的媽媽下載不熟悉的附件而感染計算機病毒時不是電子郵件的錯誤一樣。這是一個很重要的特點,因為比特幣是一個非常直接的密碼應用程式。
密碼學並不是一種未經考驗的新技術。比特幣所使用的所有密碼學技術自網路誕生以來一直都在使用著,是每天使用的許多常見網路協定的重要部分。電腦科學家認為密碼學是可靠且必要的,就像NASA(美國國家航空暨太空總署)認為太空科學是可靠且必要的一樣。
公私鑰對:密碼學的基石
公私鑰對是區塊鏈所使用密碼學的基石。公私鑰對包含兩個部分:私鑰和公鑰。這兩個密鑰其實只不過是具有特定數學關係的大整數,用來取代密碼和使用者名稱。
你會擁有一個公鑰,就像你的名字或使用者名稱一樣:在大多數情況下,你可以向任意請求者分享你的公鑰,而擁有它的人可以用它來引用或聯絡你。它與你的名聲(或比特幣中你的交易歷史)綁定,所以你可能會有多個公鑰(因此有多個公私鑰對)用於不同的目的。公鑰可用於引用或查看帳戶,但它本身並不能對該帳戶作任何操作。
私鑰應該像密碼一樣:不應向任何人分享,它用於驗證某些操作,例如發送BTC(比特幣)。
但是私鑰和密碼之間存在著重要的差異。要使用密碼,你必須將其發送給某個人或伺服器,以便其對密碼進行驗證。你需要相信密碼在發送後會被負責任地處理。相比之下,私鑰可用於證明自己的身分而無需將其發送給任何人。它曾經儲存或直接使用過的唯一場所就是在你的本地設備上。
這一點很重要,因為如果你可以在不向任何人發送你的秘密訊息的情況下對自己進行身份認證,則可以保證完全控制其安全性——你不易受其他系統的安全漏洞影響。這是使比特幣不可撼動的重要組成部分。比特幣本身並沒有儲存可能洩露給攻擊者的密碼或私鑰,但用戶仍然可以對交易進行驗證。
但是,如果你從來不曾向任何人發送私鑰,那麼如何使用私鑰來驗證交易呢?答案與私鑰和公鑰之間的數學關係有關:數位簽章。
數位簽章
有許多種不同的產生和驗證數位簽章的技術,支撐它們運作的數學原理遠遠超出了本文的範疇。對於那些不熟悉密碼學的人來說,這裡所描述的過程最初聽起來可能令人難以置信。我很清楚地記得,當我四年前剛開始研究比特幣的時候就有過這樣的感覺。
現在我將再次簡要提到,這些技術被用於許多常見的互聯網協議中,並且是資訊科學的既有組成部分。
想像有Alice和Bob兩個人,他們已經在私下交換公鑰了。 Alice想給Bob發送一條訊息,但Bob是一個非常多疑的人,除非他能夠以數學的方式進行確定性地證明,否則他不相信該訊息確實來自Alice。為了便於證明,他們同意使用數位簽章。
為了產生簽名,Alice使用她電腦中的簽名產生演算法,該演算法將她的私鑰和完整的訊息作為輸入,產生一個數位簽名。然後,她將這個訊息/簽名組合發送給Bob——但重要的是,她不會發送她的私鑰。
當Bob收到訊息和簽名時,他可以呼叫一個與之互補的簽名驗證演算法。該演算法將訊息和簽章作為輸入,以確定Alice用於產生簽章所使用公私鑰對中的公鑰。當Bob看到他的演算法輸出Alice的公鑰時,他就已經在數學上證明了該簽名確實是用Alice的公私鑰對生成的,即使他不知道也無法計算Alice的公私鑰對中的私鑰。
更簡潔地說,這個數位簽章的過程允許Bob驗證該訊息不是由某個第三方創建或修改,而是必須使用Alice的私鑰才能產生的,而不必(或不能)知道她的私鑰。他需要的只有訊息/簽名組合和她的公鑰。
直覺來看,這似乎難以置信,你可能會覺得好像在哪裡產生了誤解。如果Alice的私鑰和公鑰密切相關,而Alice使用她的私鑰來產生Bob收到的簽名,那他為什麼只能衍生出她的公鑰而不會得到她的私鑰?要理解這個問題的答案要求比大多數人對數學更深入的理解,這遠遠超出了本書的範圍。
儘管如此,這項技術每天都在被賴以使用,並且在密碼學社群內被認為是堅如磐石的。當你造訪某個地址以https開頭的網站時,「s」就表示該網站使用數位簽名認證了它自己。你的電腦使用了簽章驗證演算法,就像上面範例中的Bob一樣,驗證網站確實來自正確的公私鑰對。數位簽名可以確保你和網站之間的任何進一步互動都是經過加密和認證的。如果驗證失敗,瀏覽器則會警告你,並將網站標記為危險。
足夠大的整數
在此之前,我簡單地提到了私鑰和公鑰的功能就像使用者名稱和密碼一樣,但實際上它們只不過是具有特殊數學關係的大整數。有鑑於此,我經常被問到以下問題:
「能不能用電腦猜測或計算一堆數字,並嘗試將它們作為私鑰使用?他們最終是否會碰到某個目標公私鑰對的私鑰,從而獲得對該身分的控制權? 」事實上,就比特幣而言,這將使攻擊者可能竊取一些公私鑰對所持有的比特幣。
這是一個很好的問題,但它並不會發生。如前所述,有幾個擁有價值數百萬美元BTC的比特幣地址,但它們好幾年都沒有被轉移——儘管盜取它們需要的只是正確的私鑰——也就是正確的大整數!如果你能猜到這些地址的私鑰,那麼你就可以將其中的錢寄給任何人。與密碼不同,你可以在自己的機器上本地驗證私鑰,沒有伺服器會限制你的嘗試次數或頻率。
那為什麼還沒有人偷走這些錢呢?答案在於用作私鑰的數字近乎荒謬的大小。它們足夠大。
我們從一個簡單的思考實驗開始。想像一下,你的私鑰夠大,大到世界上所有的電腦一起工作,他們需要24小時才能猜到。如果在你的私鑰上增加僅僅一位數字,計算機就需要十倍的計算量,也就是需要十天而不是一天。而增加六位數字會使這段時間達到27000年。
在任何情況下,產生私鑰所需建立隨機數的運算能力都是微不足道的。使用私鑰產生簽章以及使用公鑰驗證這些簽章在計算上也是簡單的。但猜測私鑰所需的工作量卻隨著每增加一個額外數字呈指數級增長。為了使私鑰「免疫」於暴力破解,我們只需要添加足夠的數字——我們只需要使它們足夠大。
那多大是夠大?比特幣中使用的私鑰是256比特的整數,相當於一個長度為76位元的數字。這一數字的大小是令人難以置信的。接下來的闡釋大部分來自於Bruce Schneier的圖書《Applied Cryptography(應用密碼學)》,對足夠大整數進行直觀說明。
首先,需要了解熱力學第二定律的一個具體結論是改變單一二進位資訊存在所需的最小能量(將1變為0或反之)。這意味著無論所使用的硬體如何,任何計算過程都需要一些最小的能量來執行。
現在假設你能夠利用太陽的全部能量輸出來驅動一台專門設計的計算機,這台計算機的工作是計算或猜測私鑰,以找到一個公私鑰對的私鑰(可以控制BTC )。
使用一點點數學和熱力學,你會發現一台具有太陽全年能量輸出計算能力的高效能計算機可以計算出2178個值。如果我們將這個值除以可能的私鑰數量,即2256,我們發現這個擁有太陽全年能量輸出計算能力的假想計算機只能猜測或計算出可能私鑰總數的0.0000000000000000000003%。
此外,這還只是計數,並不包括實際檢驗每個私鑰以驗證它是否與正確的公鑰對應這一更複雜的任務。因此,這台電腦在一年之內可能錯過這0.0000000000000000000003%機率的正確私鑰,而它甚至不會意識到。
這些數字與設備的技術無關; 它們是根據20世紀30年代以來建立的熱力學定律所得出的可能達到的最大值。這些數字意味著對256位元金鑰(比特幣使用的金鑰)的暴力攻擊將是不可行的,除非電腦是由物質以外的東西建構並佔用空間以外的東西。
這就是足夠大整數的能力。無論駭客有多厲害,除非他能夠利用3×1023個太陽的能力計算一年,或者一個太陽的能力計算3×1023年,否則他的電腦甚至無法完成對所有私鑰的計數——更不用說測試或以其他方式使用它們了。