比特幣背後的密碼學原理(連載一)

買賣虛擬貨幣

目錄:

           序言

一.      密碼學理論

二.      比特幣實戰

三.      區塊鏈

四.      挖礦原理

五.      總結


序言


貨幣由於其天然屬性決定了其與安全不可分割的聯絡,從最早的金庫、保險櫃、鏢局到後來的 ATM 機、運鈔車;從存摺到銀行卡,從口令卡到優盾,安全技術的進步一步步推動著金融防護領域的更新。

傳統的貨幣的安全需求,密碼學是安全手段,是從“可用”到“安心用”的升級。而對比特幣來說,密碼學本身就是比特幣體系的一部分,沒有密碼學支撐的比特幣體系會完全崩塌,徹底“不可用”。本質上來說,比特幣和密碼學是融為一體的,比特幣是自帶安全屬性的數字貨幣。因此,對比特幣使用者來說,瞭解比特幣背後的密碼學理論,有助於更好的理解比特幣;同時,透過密碼學理論的分享,也可以順便感受一下人類智慧的偉大。畢竟,在我眼裡,密碼學理論是大量聰慧的頭腦審慎思考的結果,精緻而又巧妙之處比比皆是。



一、密碼學理論


比特幣本身並沒有創造新的密碼學成果,但比特幣利用現有密碼學成果構建了一個令人驚奇的全新的數字貨幣世界:去中心化、區塊鏈、可程式設計貨幣等成果即使拋開比特幣本身而言也是值得讚賞的洞見。

首先,現代密碼學理論的共識遵循“柯克霍夫原則”:

柯克霍夫原則由奧古斯特·柯克霍夫在19世紀提出:密碼系統應該就算被所有人知道系統的運作步驟,仍然是安全的。

這個是什麼意思呢,拿鑰匙和鎖的例子來說,研製和生產鎖具(包括鑰匙)的工藝是完全公開的,鎖具被攻破只有兩種可能:一是證明工藝有漏洞,不需要拿到原裝鑰匙也能開啟。二是窮盡各種鑰匙可能,在可接受的時間裡能夠從概率意義上試出來(暴力破解)。


演算法是公開的,唯一需要保護的是金鑰,這是我們下文討論的基礎。


1.非對稱加密

先看對稱加密很好理解也符合直覺:

對稱加密:對同一份敏感資料,加密解密金鑰是相同的。

非對稱加密呢:

非對稱加密演算法需要兩個金鑰:公開金鑰(public key)和私有金鑰(private key)。公開金鑰與私有金鑰是一對,如果用公開金鑰對資料進行加密,只有用對應的私有金鑰才能解密;如果用私有金鑰對資料進行加密,那麼只有用對應的公開金鑰才能解密。因為加密和解密使用的是兩個不同的金鑰,所以這種演算法叫作非對稱加密演算法。 非對稱加密演算法實現機密資訊交換的基本過程是:甲方生成一對金鑰並將其中的一把作為公用金鑰向其它方公開;得到該公用金鑰的乙方使用該金鑰對機密資訊進行加密後再傳送給甲方;甲方再用自己儲存的另一把專用金鑰對加密後的資訊進行解密。


非對稱加密演算法需要兩個金鑰:公開金鑰(public key)和私有金鑰(private key)。公開金鑰與私有金鑰是一對,如果用公開金鑰對資料進行加密,只有用對應的私有金鑰才能解密;如果用私有金鑰對資料進行加密,那麼只有用對應的公開金鑰才能解密。因為加密和解密使用的是兩個不同的金鑰,所以這種演算法叫作非對稱加密演算法。 非對稱加密演算法實現機密資訊交換的基本過程是:甲方生成一對金鑰並將其中的一把作為公用金鑰向其它方公開;得到該公用金鑰的乙方使用該金鑰對機密資訊進行加密後再傳送給甲方;甲方再用自己儲存的另一把專用金鑰對加密後的資訊進行解密。


我們用一幅圖來說明:


在上文的非對稱加密部分,金鑰A就是公開金鑰(簡稱公鑰),金鑰B就是私有金鑰(簡稱私鑰)。道理都懂,問題有意思在什麼地方呢?非對稱加密方式下金鑰A和金鑰B是怎麼找到的以及怎麼實現的?我們舉例說明:

假設我們現在已經找到了(具體怎麼找的後面會講)公鑰(3233,17)和私鑰(3233, 2753)。

注意,公鑰和私鑰不一定只有一個數字,是可以有多個的,具體幾個數字依賴於非對稱加密演算法。

假設現在明文待加密資訊是數字65,我們首先給出加密公式:

解釋一下,c代表加密後數字,(n,e)對應我們的公鑰對,m代表明文,≡的意思是同模運算,比如60≡4(mod 7),60對4取模後等於4。好了我們開始計算密文:

密文是2790,如何解密呢,解密公式:

d對應私鑰的2753,其餘字母和加密過程相同,於是解密運算為:

我們得到了原來的明文資料65,這個例子可以看到加密和解密資料是不同的。

以上我們舉例使用的演算法是大名鼎鼎的地球主流非對稱加密演算法 RSA ,有關 RSA的介紹參考阮一峰老師的文章。實際上我上面用到的數字也出自該文,實在是時間有限無法深入講解 RSA 的細節大家可以自行學習。比特幣體系實際使用的非對稱演算法是橢圓曲線加密(ECC),可以到這裡詳細瞭解。

從上面的例子我們知道滿足非對稱加密的金鑰對是存在的,同時我們也做了加解密嘗試。實際上,非對稱加密演算法的核心依賴於特定的數學難題,比如上文的RSA依賴於大數分解難題,如果該難題被破解了,演算法本身也就被攻破了。另外,我讀研的時候還做了 RSA 矩陣擴充套件,將其演算法基礎從素數擴充套件到矩陣,有興趣的可以繼續交流。

非對稱演算法透過公私鈅分別加解密方式給資訊交換帶來了巨大的變化,具體表現在:

1)在不安全的環境中傳遞敏感資訊成為可能。從上文可以知道,公鑰是完全公開任意傳播的,透過公鑰是無法(或極其困難)推算出私鑰的,私鑰是不公開不傳送不傳播的,僅僅訊息接收方知道就可以,其他任何人都不需要知道。

2)多方通訊所需金鑰數量急劇減少,金鑰維護工作變得異常簡化。比如N個互不信任且互有通訊需求的人,如果使用對稱加密演算法,則需要 N!/2 個金鑰,如果使用非對稱加密僅需要 N 個即可(每個人只需要維護自己的公私鈅對,無論和多少人通訊)。

3)基於非對稱加密發展起來的數字簽名技術(見下文詳述)從數學意義上解決了自證身份問題,使得資訊接收者可以確認訊息傳送方身份資訊且不可更改。

4)密碼學問題對數學問題的依賴空前提高。之前看似無用的甚至古老的數學難題比如數論、離散對數等在此大放異彩,頗有些笑來老師在《把時間當做朋友》裡面表達的"技不壓身"的現實對映。


2.雜湊(雜湊)演算法


我們使用各種雲盤、虛擬儲存空間應用的時候一定都有類似的體會,上傳一個明明很大的檔案,可是速度卻非常快,而有時上傳一個小得多的檔案卻似乎進度條要走很久。這種現象的可能的一個秘密就是接下來要講的雜湊演算法(也叫資料摘要或者雜湊演算法,雜湊是 HASH 的音譯)。

實際上,雲盤類產品對相同檔案只會保留一份真實的儲存,多個使用相同檔案的使用者只需“索引”到該儲存位置即可。判斷兩個檔案是否相同用到的就是雜湊演算法:

雜湊演算法將任意長度的二進位制值對映為較短的固定長度的二進位制值,這個小的二進位制值稱為雜湊值。雜湊值是一段資料唯一且極其緊湊的數值表示形式。如果雜湊一段明文而且哪怕只更改該段落的一個字母,隨後的雜湊值都將產生不同的值。要找到雜湊為同一個值的兩個不同的輸入,在計算上是不可能的,所以資料的雜湊值可以檢驗資料的完整性。一般用於快速查詢和加密演算法。

本質上,雜湊演算法的目的不是為了“加密”而是為了抽取“資料特徵”,你也可以把給定資料的雜湊值理解為該資料的“指紋資訊”,一個可靠的雜湊演算法F需要滿足:

1. 對於給定的資料M,很容易算出雜湊值X=F(M);

2. 根據X無法算出M;

3. 很難找到M和N令F(M)=F(N)。


我來解釋一下:

對於第一點,通常雜湊值的長度是固定的(為什麼固定,一個很重要的原因是便於構造通訊包結構,雜湊的應用場景通常是不可靠的網路傳輸而非本地儲存),比如比特幣使用的 SHA256 摘要演算法對任意長度的輸入給出的是 256bit 的輸出。

對於第二點,雜湊演算法是不可逆的,甚至是以丟失部分原始資訊作為代價,因此我個人認為雜湊加密演算法的提法是有問題的,加密意味著可以解密,單純的擾亂稱為加密並不合適。也許所謂的雜湊加密是和雜湊校驗對應的,也就說兩種應用的場景不同,雜湊加密的核心是擾亂,雜湊校驗的核心是校驗。

對於第三點,這是雜湊函式真正的挑戰。假設找到了一對(M,N)使得等式成立就成為該演算法找到了一次碰撞,對雜湊演算法健壯性的分析就是分析其抗強碰撞能力。可以理解的是,碰撞的出現將使得雜湊演算法本身存在的意義消失了,因為發現了不同的人擁有相同的指紋。

比特幣使用的雜湊演算法是 SHA256 ,他是安全雜湊演算法 SHA(Secure Hash Algorithm)系列演算法的一種(另外還有SHA-1、SHA-224、SHA-384 和 SHA-512 等變體),SHA 是美國國家安全域性 (NSA) 設計,美國國家標準與技術研究院(NIST) 釋出的,主要適用於數字簽名標準(DigitalSignature Standard DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm DSA)。可以到這裡詳細瞭解。


最後,我要解釋一下二次雜湊問題,看過比特幣協議的讀者可能注意到工作量證明和金鑰編碼過程中多次使用了二次雜湊,如 SHA256(SHA256(k))或者RIPEMD160(SHA256(K)),這種方式帶來的好處是增加了工作量或者在不清楚協議的情況下增加破解難度,從安全性角度並沒有顯著增加(如果是暴力窮舉破解的話,需要增加一倍破解時間)。真正的二次雜湊是基於加鹽的雜湊,什麼意思呢?對於特定的待雜湊資料和特定的雜湊演算法,可以知道雜湊值是一定的,這種情況下如果用雜湊保護敏感資料(理論上是不合適的,但是國內外存在大量的使用雜湊來保護使用者密碼的情況),那就很容易使用字典攻擊反向推算,比如我計算123456的SHA256值就可以反推了,解決辦法就是先做一次雜湊,再加一次隨機資料以後再做一次雜湊,隨機資料就是所謂的鹽。

3.數字簽名

有了非對稱加密和雜湊演算法的準備,我們現在可以進一步認識數字簽名了。顧名思義,數字簽名就是在數字世界裡用於身份辨識的一種解決方案。不需要騎縫章,騎縫簽名,也不需要筆跡專家,數字簽名即具有不可抵賴性。

簡單地說,所謂數字簽名就是附加在資料單元上的一些資料,或是對資料單元所作的密碼變換。這種資料或變換允許資料單元的接收者用以確認資料單元的來源和資料單元的完整性並保護資料,防止被人(例如接收者)進行偽造。它是對電子形式的訊息進行簽名的一種方法,一個簽名訊息能在一個通訊網路中傳輸。基於公鑰密碼體制和私鑰密碼體制都可以獲得數字簽名,主要是基於公鑰密碼體制的數字簽名。

上述解釋稍顯學術,我們換種說法表述:所謂數字簽名就是簽名人用自己的私鑰對待簽名資料的摘要進行加密得到的值就是簽名值。簽名者傳送資料簽名時需要把待簽名資料和簽名值一起傳送給對方。

注意,簽名物件並非待簽名資料而是待簽名資料的摘要,為什麼呢?因為非對稱加密的速度通常都比較慢,直接對原始資料私鑰加密是很慢的而且也沒有必要。

如何驗證簽名呢?接收方首先使用簽名者的公鑰對簽名值解密即可得到摘要值,然後使用約定的演算法對待簽名資料進行雜湊運算後和解密得到的摘要值進行比較即可驗證。

這裡有一個圖形化的數字簽名過程有助於理解數字簽名的整個過程。

從以上數字簽名的整個過程描述來看,數字簽名的核心在於簽名,在於證明這份資料是簽名者發出的、不可抵賴的。待簽名資料本身的保密不是數字簽名方案要考慮的問題。


4.可讀性編碼

嚴格來講,編碼部分不是密碼學理論的核心內容,不過為了便於下文能說清楚,我就把可讀性編碼放到這裡簡單說說。

可讀性編碼很好理解,就是不改變資訊內容僅改變內容的表現形式,部分編碼方式還加入了容錯校驗功能,通常是為了保證更好的通訊傳輸。

比如二進位制的 1111 對應十進位制的 15 這就是一次編碼。是用十進位制對二進位制進行編碼,現在有個問題,我拿到一個編碼後的資料,如何知道該資料是使用了哪種形式的編碼呢?這個是透過字首來實現的,例如,比特幣地址的字首是 0(十六進位制是0x00),而對私鑰編碼時字首是 128(十六進位制是0x80)。

作者簡介:

 怒馬,數字貨幣愛好者,正經大學畢業,愛技術,持續好奇心擁有者。




點選瞭解更多


區塊鏈快速入門


邏輯投資

認知風向標


電腦挖礦Lemochain


投資十問(上)投資十問(下)




中原區塊鏈社羣自成立以來,作為區塊鏈領域的佈道者,一直致力於普及區塊鏈知識,每週二邀請業界大咖在社羣分享前沿資訊。


同時我們開有場外交易群,一直為社羣小夥伴兒提供免費擔保業務,支援無限額的 BTC、以太坊,EOS 原力 等數字貨幣的買賣交易。


免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;