本文是學習區塊鏈技術中關於密碼學這一部分的相關知識點學習總結整理。
公式表示形式:
典型的散列函數都有非常大的定義域,比如SHA-2最高接受( 長度的字節字符串。同時散列函數一定有着有限的值域,比如固定長度的比特串(例如:256,512)。在某些情況下,散列函數可以設計成具有相同大小的定義域和值域間的單射。
下圖形象的說明了哈希函數:
哈希算法就是以哈希函數爲基礎構造的,常用於實現數據完整性和實體認證。一個優秀的 hash 算法,將能實現:
哈希函數的抗碰撞性是指尋找兩個能夠產生碰撞的消息在計算上是不可行的。但找到兩個碰撞的消息在計算上不可行,並不意味着不存在兩個碰撞的消息。哈希函數是把大空間上的消息壓縮到小空間上,碰撞肯定存在。只是計算上是不可行的。例如,如果哈希值的長度固定爲256位,顯然如果順序取 這 個輸入值,計算它們的哈希值,肯定能夠找到兩個輸入值,使得它們的哈希值相同。
原像不可逆,指的是知道輸入值,很容易通過哈希函數計算出哈希值;但知道哈希值,沒有辦法計算出原來的輸入值。
難題友好性指的是沒有便捷的方法去產生一滿足特殊要求的哈希值。
一個哈希函數 稱爲難題友好的,如果對於每個 位的輸出 ,若 是從一個具有較高不可預測性(高小熵)分佈中選取的,不可能以小於 的時間找到一個 ,使 。
爲了引申出工作量證明POW的原理,考慮一個由哈希函數構成的解謎問題:已知哈希函數 ,一個高小熵分佈的值 以及目標範圍 ,尋找 ,使得 。
這個問題等價於需要找到一個輸入值,使得輸出值落在目標範圍 內,而 往往是所有的輸出值的一個子集。實際上,如果一個哈希函數 的輸出位 位,那麼輸出值可以是任何一個 ~ 範圍內的值。預定義的目標範圍 的大小決定了這個問題的求解難度。如果 包含所有 比特的串,那麼問題就簡單了,但如果 只包含一個元素,那麼這個求解是最難的,相當於給定一個哈希值,找出其中一個原像,原像不可逆的性質說明了這個難度。事實上,由於 具有高小熵分佈,這確保了除了隨機嘗試 值以完成搜尋那個很大的空間外,沒有其他有效的途徑了。
哈希函數的難題友好性構成了基於工作量證明的共識算法的基礎。通過哈希運算得出的符合特定要求的哈希值,可以作爲共識算法中的工作量證明。這裏比特幣的安全保證依賴於哈希函數的安全性,如果哈希函數被攻破,可以想象POW共識算法就失效了,不用算力達到 就可以攻擊了。
小熵(min-entropy)是信息理論中衡量某個結果的可預測性的一個指標。高小熵值的是變量呈均勻分佈(隨機分佈)。如果我們從對分佈的值進行隨機抽樣,不會經常抽到一個固定的值。例如,如果在一個128位的數中隨機選一個固定的數 ,那麼選到該數的機率是 。
SHA256屬於SHA(Secure Hash Algorithm,安全哈希算法)家族一員,是SHA-2算法簇中的一類,對於小於 位的消息,產生一個256位的消息摘要。
SHA-256其計算過程分爲兩個階段:消息的預處理和主循環。在消息的預處理階段,主要完成消息的填充和擴展填充,將所有輸入的原始消息轉換爲 個512比特的消息塊,之後對每個消息塊利用SHA256壓縮函數進行處理。下面講述的是如何計算Hash值,目前還沒有完全理解,列在這裏是爲了有個宏觀的概念,大致知道是什麼回事,以後需要的時候再深入學習理解。
step1: 附加填充比特。對報文進行填充使報文長度 ,填充比特數範圍是1到512,填充比特串的最高位爲1,其餘位爲0。(448=512-64,爲了下面的64位)
step2 : 附加長度值。將用64-bit表示初始報文(填充前)的位長度附加在step1的結果後(低字節位優先)。
step3: 初始化緩存。使用一個256bit的緩存來存放該哈希函數的中間值及最終結果。
緩存表示爲:A=0x6A09E667 , B=0xBB67AE85 , C=0x3C6EF372 , D=0xA54FF53A,
E=0x510E527F , F=0x9B05688C , G=0x1F83D9AB , H=0x5BE0CD19
step4: 處理512bit(16個字)報文分組序列。該算法使用了六種基本邏輯函數,由64步迭代運算組成。每步都以256-bit緩存值ABCDEFGH爲輸入,然後更新緩存內容。每步使用一個32-bit 常數值Kt 和一個32-bit Wt。Kt是常數值,在僞代碼中有它的常數值定義。Wt是分組之後的報文,512 bit=32bit*16,也就是Wt t=1,2..16由該組報文產生。Wt t=17,18,..,64由前面的Wt按遞推公式計算出來。Wt遞推公式在下面的僞代碼有。
step5 :所有的512-bit分組處理完畢後,對於SHA-256算法最後一個分組產生的輸出便是256-bit的報文摘要。
這裏面公式太多,就直接截圖了。
可參考https://en.wikipedia.org/wiki/SHA-2。
RIPEMD (RACE Integrity Primitives Evaluation Message Digest,RACE原始完整性校驗訊息摘要)是一種加密哈希函數。RIPEMD-160是以原始版RIPEMD所改進的160位元版本,而且是RIPEMD系列中最常見的版本。更多請參考:https://homes.esat.kuleuven.be/~bosselae/ripemd160.html
在比特幣中,應用了兩個密碼學哈希函數,一個是SHA256,另一個是RIPEMD160,用於比特幣地址的生成。下圖爲比特幣地址(賬戶)的生成流程:
哈希指針是一種數據結構,哈希指針指示某些信息存儲在何處,我們將這個指針與這些信息的密碼學哈希值存儲在一起。哈希指針不僅是一種檢索信息的方法,同時它也是一種檢查信息是否被修改過的方法。
上面的圖表示了一個哈希指針,哈希指針是一個指向存儲地點的指針,加上一個針對存儲時信息的哈希值。
區塊鏈就可以看作一類使用哈希指針的鏈表。這個鏈表鏈接一系列的區塊,每個區塊包含數據以及指向表中前一個區塊的指針。區塊鏈中,前一個區塊指針由哈希指針所替換,因此每個區塊不僅僅告訴前一個區塊的位置,也提供一個哈希值去驗證這個區塊所包含的數據是否發生改變。
Merkle哈希樹是一類基於哈希值的二叉樹或多叉樹,其葉子節點上的值通常爲數據塊的哈希值,而非葉子節點上的值,是將該節點的所有子節點的組合結果的哈希值。
Merkle樹一般用來進行完整性驗證處理。在處理完整性驗證的應用場景中,Merkle樹會大大減少數據的傳輸量及計算的複雜度。
成員證明。如果想要證明一個確切的數據塊是Merkle樹中的一員。通常,只需要樹根及這個區塊和通向樹根沿途的中間哈希值,就可以暫時忽略樹的其他部分,這些就已經足以讓我們驗證到樹根。
區塊鏈中的Merkle樹是二叉樹,如果在樹上有 個節點,那麼就只有 個塊需要被展示。因爲每一個步驟都只需要計算下一級塊的哈希,所以這大概只需要 次去證明它。所以即使這個Merkle 樹包含了非常多的塊,我們依舊可以在一個較短的時間內證明一個成員塊。
公鑰密碼體制的兩個重要原則:
公鑰密碼算法中的密鑰分爲公鑰和私鑰,用戶或系統產生一對密鑰,將其中的一個公開,就是公鑰,另一個自己保留,就是私鑰。一般情況下,通信時,發送方利用公鑰對信息進行加密,接收方利用私鑰對信息進行解密完成通信。當然,也可用私鑰加密,公鑰解密。因爲加密與解密用的是兩個不同的密鑰,所以這種算法也叫作非對稱加密算法。
公鑰密碼系統的安全性都是基於難題的可計算問題。如:大數分解問題;計算有限域的離散對數問題;平方剩餘問題;橢圓曲線的對數問題等。基於這些問題,就有了各種公鑰密碼體制。後面要講的橢圓曲線密碼算法是其中之一。
橢圓曲線密碼算法(Elliptic Curve Cryptography,ECC)是基於橢圓曲線數學的一種公鑰密碼算法,其安全性依賴於橢圓曲線離散對數問題的困難性。
下面這3篇文章詳細講述了橢圓曲線密碼算法的數學原理,不過是英文版的,但是講述的非常詳細,需要掌握的相關數學概念也講述的很清楚。
http://andrea.corbellini.name/2015/05/17/elliptic-curve-cryptography-a-gentle-introduction/
http://andrea.corbellini.name/2015/05/23/elliptic-curve-cryptography-finite-fields-and-discrete-logarithms/
http://andrea.corbellini.name/2015/05/30/elliptic-curve-cryptography-ecdh-and-ecdsa/
下面這2篇是上面文章的翻譯:
http://blog.csdn.net/mrpre/article/details/72850598
http://blog.csdn.net/mrpre/article/details/72850644
這裏理論不是很完善,具體的可深入學習Douglas R. Stinson的《密碼學原理與實踐》。
設 是一個大於3的素數,在有限域 上的橢圓曲線 由一個基於同餘式 的解集 和一個無窮遠點的特定點 組成,這裏 是滿足 的常數。
下圖是顯示了其中一種實際的橢圓曲線:
對橢圓曲線上的點,我們可以定義一種形式的加法:如果橢圓曲線上的三個點位於同一直線上,那麼它們的和爲 (無窮遠點)。
根據上面的定義導出橢圓曲線上的加法運算法則如下:
當
時:
當
時:
下面的動畫解釋了爲什麼是切線:
隨着兩個點越來越接近,過這兩點的直線最終變成了曲線的切線
上面用幾何的形式解釋了橢圓曲線上的加法法則,下面是數學表達式。設
與
爲橢圓曲線上的兩個點,加減法運算如下:
1)
2)
3)
4) 若
,則
5) 若
,則
,其中
,
,
給定橢圓曲線上的點 和點 ,尋找數 ,使得 ,其中 稱爲 的基於 的離散對數。
在等式 中,已知 和點 ,求點 比較容易,反之已知點 和點 ,求 卻是相當苦難的,這個問題稱爲橢圓曲線上點羣的離散對數問題。橢圓曲線密碼體制正是利用這個困難問題設計的。在實際應用中, 作爲私鑰,而 作爲公鑰。
用這種形式表示時,計算 似乎需要 次加法運算。如果 有 個二進制位,那麼算法的時間複雜度將爲 ,這真不是很好。存在一些更快的算法。其中一種是「加倍(double)與相加(add)」算法。計算的原理可以用一個例子來更好地解釋。取 。它的二進制表示形式爲 。這一二進制表示形式可以轉換爲一系列 的冪之和。
(取
的 每個二進制位上的數字,並用它乘以一個
的冪.)
用這種方法,我們可以將
這樣寫:
「加倍(double)與相加(add)」算法需要這樣做:
• 取
.
• 加倍,得到
.
•
與
相加(爲了得到
).
• 加倍
,得到
.
• 與前一結果相加 (得到
相加(爲了得到
).
• 加倍
,得到
.
• 與前一結果相加 (得到