08.14 進入 區塊鏈,必須知道這些冷門區塊鏈知識

進入 區塊鏈,必須知道這些冷門區塊鏈知識

提到密碼,我們“加密”的初衷大多是為了安全。無論社交網絡的個人隱私,還是財產持有,凡是人們重視的,少有願意完全公開透明地暴露於公眾之下的。

涉及到金融領域,談及貨幣,更是讓人無法輕視。貨幣的天然屬性決定了其與安全的密切關聯,從金庫、保險櫃、鏢局到ATM和運鈔車、存摺、銀行卡、口令、優盾,無不在證實它的重要性。

進入 區塊鏈,必須知道這些冷門區塊鏈知識

比特幣與密碼學一體同胞

密碼學對比特幣而言,不僅僅是一種外在的安全手段,而是生長於比特幣體系的一部分,可以很負責任的說,沒有密碼學的支撐,比特幣體系會完全崩塌,因為比特幣是自帶安全屬性的數字貨幣。也是為什麼想了解比特幣必須瞭解密碼學。

比特幣利用現有密碼學成果構建了一個全新的數字貨幣世界:去中心化、區塊鏈、可編程貨幣。

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

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

算法是公開的,唯一需要保護的是密鑰。舉個例子:研製和生產鎖與鑰的方法和工序透明化,鎖可能因為製作漏洞,鑰匙沒保護好,被複製出多把能夠與之匹配的鑰匙或暴力解決。

進入 區塊鏈,必須知道這些冷門區塊鏈知識

對稱加密與不對稱加密

對稱加密:對同一份敏感數據,加密解密密鑰是相同的。

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

公鑰和私鑰不一定只有一個數字,是可以有多個,具體幾個數字依賴於非對稱加密算法,詳見下例。

假設現在明文待加密信息是數字65,首先給出加密公式:c代表加密後數字,(n,e)對應我們的公鑰對,m代表明文,≡的意思是同模運算,比如60≡4(mod 7),60對4取模後等於4.計算密文2790,解密公式:d對應私鑰的2753,其餘字母和加密過程相同,解密運算為:明文數據65.

綜上,滿足非對稱加密的密鑰對是存在的,同時我們也做了加解密嘗試。

非對稱算法通過公私鈅分別加解密方式給信息交換帶來了巨大的變化

  • 在不安全的環境中傳遞敏感信息成為可能。從上文可以知道,公鑰是完全公開任意傳播的,通過公鑰是無法推算出私鑰的,私鑰是不公開不發送不傳播的,僅僅消息接收方知道就可以,其他任何人都不需要知道
  • 多方通信所需密鑰數量急劇減少,密鑰維護工作變得異常簡化。比如N個互不信任且互有通信需求的人,如果使用對稱加密算法,則需要 N!/2 個密鑰,如果使用非對稱加密僅需要 N 個即可
  • 基於非對稱加密發展起來的數字簽名技術從數學意義上解決了自證身份問題,使得信息接收者可以確認消息發送方身份信息且不可更改
  • 密碼學問題對數學問題的依賴空前提高。看似無用的甚至古老的數學難題比如數論、離散對數等在此均能用上。

散列算法

我們使用各種雲盤、虛擬存儲空間應用的時候一定都有類似的體會,上傳一個明明很大的文件,可是速度卻非常快,而有時上傳一個小得多的文件卻似乎進度條要走很久。實際上,雲盤類產品對相同文件只會保留一份真實的存儲,多個使用相同文件的用戶只需“索引”到該存儲位置即可。

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

本質上,散列算法的目的不是為了“加密”而是為了抽取“數據特徵”,你也可以把給定數據的散列值理解為該數據的“指紋信息”,一個可靠的散列算法F需要滿足:對於給定的數據M,很容易算出哈希值X=F(M)/哈希值是固定的;根據X無法算出M/算法不可逆;很難找到M和N令F(M)=F(N)/找到成立的等式相當於碰撞,這樣的碰撞會使算法本身存在的意義消失,因為每個人身上的DNA不同。

還有,關於二次散列,比特幣的工作量證明和密鑰編碼過程中多次使用了二次哈希,如 SHA256或RIPEMD160(SHA256(K)),這種方式帶來的好處是增加了工作量或者在不清楚協議的情況下增加破解難度,從安全性角度並沒有顯著增加。對於特定的待散列數據和特定的散列算法,可以知道散列值是一定的,這種情況下如果用散列保護敏感數據,那就很容易使用字典攻擊反向推算。

數字簽名

有了非對稱加密和散列算法的準備,下一步就是數字簽名了。數字簽名是數字世界裡用於身份辨識的一種解決方案。附加在數據單元上的一些數據,或是對數據單元所作的密碼變換。這種數據或變換允許數據單元的接收者用以確認數據單元的來源和數據單元的完整性並保護數據,防止被人(例如接收者)進行偽造。它是對電子形式的消息進行簽名的一種方法,一個簽名消息能在一個通信網絡中傳輸。基於公鑰密碼體制和私鑰密碼體制都可以獲得數字簽名,主要是基於公鑰密碼體制的數字簽名。

如何驗證簽名呢?接收方首先使用簽名者的公鑰對簽名值解密即可得到摘要值,然後使用約定的算法對待簽名數據進行散列運算後和解密得到的摘要值進行比較即可驗證。這裡有一個圖形化的數字簽名過程有助於理解數字簽名的整個過程。

可讀性編碼

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

比如二進制的 1111 對應十進制的 15 這就是一次編碼。是用十進制對二進制進行編碼,拿到一個編碼後的數據,如何知道該數據是使用了哪種形式的編碼呢?這個是通過前綴來實現的,如比特幣地址的前綴是 0(十六進制是0x00),而對私鑰編碼時前綴是 128(十六進制是0x80)。


分享到:


相關文章: