區塊鏈數字簽名運用對稱加密
A. 什麼是數字簽名
數字簽名(又稱公鑰數字簽名、電子簽章)是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領域的技術實現,用於鑒別數字信息的方法。一套數字簽名通常定義兩種互補的運算,一個用於簽名,另一個用於驗證。
數字簽名,就是只有信息的發送者才能產生的別人無法偽造的一段數字串,這段數字串同時也是對信息的發送者發送信息真實性的一個有效證明。
數字簽名是非對稱密鑰加密技術與數字摘要技術的應用。
B. 【深度知識】區塊鏈之加密原理圖示(加密,簽名)
先放一張以太坊的架構圖:
在學習的過程中主要是採用單個模塊了學習了解的,包括P2P,密碼學,網路,協議等。直接開始總結:
秘鑰分配問題也就是秘鑰的傳輸問題,如果對稱秘鑰,那麼只能在線下進行秘鑰的交換。如果在線上傳輸秘鑰,那就有可能被攔截。所以採用非對稱加密,兩把鑰匙,一把私鑰自留,一把公鑰公開。公鑰可以在網上傳輸。不用線下交易。保證數據的安全性。
如上圖,A節點發送數據到B節點,此時採用公鑰加密。A節點從自己的公鑰中獲取到B節點的公鑰對明文數據加密,得到密文發送給B節點。而B節點採用自己的私鑰解密。
2、無法解決消息篡改。
如上圖,A節點採用B的公鑰進行加密,然後將密文傳輸給B節點。B節點拿A節點的公鑰將密文解密。
1、由於A的公鑰是公開的,一旦網上黑客攔截消息,密文形同虛設。說白了,這種加密方式,只要攔截消息,就都能解開。
2、同樣存在無法確定消息來源的問題,和消息篡改的問題。
如上圖,A節點在發送數據前,先用B的公鑰加密,得到密文1,再用A的私鑰對密文1加密得到密文2。而B節點得到密文後,先用A的公鑰解密,得到密文1,之後用B的私鑰解密得到明文。
1、當網路上攔截到數據密文2時, 由於A的公鑰是公開的,故可以用A的公鑰對密文2解密,就得到了密文1。所以這樣看起來是雙重加密,其實最後一層的私鑰簽名是無效的。一般來講,我們都希望簽名是簽在最原始的數據上。如果簽名放在後面,由於公鑰是公開的,簽名就缺乏安全性。
2、存在性能問題,非對稱加密本身效率就很低下,還進行了兩次加密過程。
如上圖,A節點先用A的私鑰加密,之後用B的公鑰加密。B節點收到消息後,先採用B的私鑰解密,然後再利用A的公鑰解密。
1、當密文數據2被黑客攔截後,由於密文2隻能採用B的私鑰解密,而B的私鑰只有B節點有,其他人無法機密。故安全性最高。
2、當B節點解密得到密文1後, 只能採用A的公鑰來解密。而只有經過A的私鑰加密的數據才能用A的公鑰解密成功,A的私鑰只有A節點有,所以可以確定數據是由A節點傳輸過來的。
經兩次非對稱加密,性能問題比較嚴重。
基於以上篡改數據的問題,我們引入了消息認證。經過消息認證後的加密流程如下:
當A節點發送消息前,先對明文數據做一次散列計算。得到一個摘要, 之後將照耀與原始數據同時發送給B節點。當B節點接收到消息後,對消息解密。解析出其中的散列摘要和原始數據,然後再對原始數據進行一次同樣的散列計算得到摘要1, 比較摘要與摘要1。如果相同則未被篡改,如果不同則表示已經被篡改。
在傳輸過程中,密文2隻要被篡改,最後導致的hash與hash1就會產生不同。
無法解決簽名問題,也就是雙方相互攻擊。A對於自己發送的消息始終不承認。比如A對B發送了一條錯誤消息,導致B有損失。但A抵賴不是自己發送的。
在(三)的過程中,沒有辦法解決交互雙方相互攻擊。什麼意思呢? 有可能是因為A發送的消息,對A節點不利,後來A就抵賴這消息不是它發送的。
為了解決這個問題,故引入了簽名。這里我們將(二)-4中的加密方式,與消息簽名合並設計在一起。
在上圖中,我們利用A節點的私鑰對其發送的摘要信息進行簽名,然後將簽名+原文,再利用B的公鑰進行加密。而B得到密文後,先用B的私鑰解密,然後 對摘要再用A的公鑰解密,只有比較兩次摘要的內容是否相同。這既避免了防篡改問題,有規避了雙方攻擊問題。因為A對信息進行了簽名,故是無法抵賴的。
為了解決非對稱加密數據時的性能問題,故往往採用混合加密。這里就需要引入對稱加密,如下圖:
在對數據加密時,我們採用了雙方共享的對稱秘鑰來加密。而對稱秘鑰盡量不要在網路上傳輸,以免丟失。這里的共享對稱秘鑰是根據自己的私鑰和對方的公鑰計算出的,然後適用對稱秘鑰對數據加密。而對方接收到數據時,也計算出對稱秘鑰然後對密文解密。
以上這種對稱秘鑰是不安全的,因為A的私鑰和B的公鑰一般短期內固定,所以共享對稱秘鑰也是固定不變的。為了增強安全性,最好的方式是每次交互都生成一個臨時的共享對稱秘鑰。那麼如何才能在每次交互過程中生成一個隨機的對稱秘鑰,且不需要傳輸呢?
那麼如何生成隨機的共享秘鑰進行加密呢?
對於發送方A節點,在每次發送時,都生成一個臨時非對稱秘鑰對,然後根據B節點的公鑰 和 臨時的非對稱私鑰 可以計算出一個對稱秘鑰(KA演算法-Key Agreement)。然後利用該對稱秘鑰對數據進行加密,針對共享秘鑰這里的流程如下:
對於B節點,當接收到傳輸過來的數據時,解析出其中A節點的隨機公鑰,之後利用A節點的隨機公鑰 與 B節點自身的私鑰 計算出對稱秘鑰(KA演算法)。之後利用對稱秘鑰機密數據。
對於以上加密方式,其實仍然存在很多問題,比如如何避免重放攻擊(在消息中加入 Nonce ),再比如彩虹表(參考 KDF機制解決 )之類的問題。由於時間及能力有限,故暫時忽略。
那麼究竟應該採用何種加密呢?
主要還是基於要傳輸的數據的安全等級來考量。不重要的數據其實做好認證和簽名就可以,但是很重要的數據就需要採用安全等級比較高的加密方案了。
密碼套件 是一個網路協議的概念。其中主要包括身份認證、加密、消息認證(MAC)、秘鑰交換的演算法組成。
在整個網路的傳輸過程中,根據密碼套件主要分如下幾大類演算法:
秘鑰交換演算法:比如ECDHE、RSA。主要用於客戶端和服務端握手時如何進行身份驗證。
消息認證演算法:比如SHA1、SHA2、SHA3。主要用於消息摘要。
批量加密演算法:比如AES, 主要用於加密信息流。
偽隨機數演算法:例如TLS 1.2的偽隨機函數使用MAC演算法的散列函數來創建一個 主密鑰 ——連接雙方共享的一個48位元組的私鑰。主密鑰在創建會話密鑰(例如創建MAC)時作為一個熵來源。
在網路中,一次消息的傳輸一般需要在如下4個階段分別進行加密,才能保證消息安全、可靠的傳輸。
握手/網路協商階段:
在雙方進行握手階段,需要進行鏈接的協商。主要的加密演算法包括RSA、DH、ECDH等
身份認證階段:
身份認證階段,需要確定發送的消息的來源來源。主要採用的加密方式包括RSA、DSA、ECDSA(ECC加密,DSA簽名)等。
消息加密階段:
消息加密指對發送的信息流進行加密。主要採用的加密方式包括DES、RC4、AES等。
消息身份認證階段/防篡改階段:
主要是保證消息在傳輸過程中確保沒有被篡改過。主要的加密方式包括MD5、SHA1、SHA2、SHA3等。
ECC :Elliptic Curves Cryptography,橢圓曲線密碼編碼學。是一種根據橢圓上點倍積生成 公鑰、私鑰的演算法。用於生成公私秘鑰。
ECDSA :用於數字簽名,是一種數字簽名演算法。一種有效的數字簽名使接收者有理由相信消息是由已知的發送者創建的,從而發送者不能否認已經發送了消息(身份驗證和不可否認),並且消息在運輸過程中沒有改變。ECDSA簽名演算法是ECC與DSA的結合,整個簽名過程與DSA類似,所不一樣的是簽名中採取的演算法為ECC,最後簽名出來的值也是分為r,s。 主要用於身份認證階段 。
ECDH :也是基於ECC演算法的霍夫曼樹秘鑰,通過ECDH,雙方可以在不共享任何秘密的前提下協商出一個共享秘密,並且是這種共享秘鑰是為當前的通信暫時性的隨機生成的,通信一旦中斷秘鑰就消失。 主要用於握手磋商階段。
ECIES: 是一種集成加密方案,也可稱為一種混合加密方案,它提供了對所選擇的明文和選擇的密碼文本攻擊的語義安全性。ECIES可以使用不同類型的函數:秘鑰協商函數(KA),秘鑰推導函數(KDF),對稱加密方案(ENC),哈希函數(HASH), H-MAC函數(MAC)。
ECC 是橢圓加密演算法,主要講述了按照公私鑰怎麼在橢圓上產生,並且不可逆。 ECDSA 則主要是採用ECC演算法怎麼來做簽名, ECDH 則是採用ECC演算法怎麼生成對稱秘鑰。以上三者都是對ECC加密演算法的應用。而現實場景中,我們往往會採用混合加密(對稱加密,非對稱加密結合使用,簽名技術等一起使用)。 ECIES 就是底層利用ECC演算法提供的一套集成(混合)加密方案。其中包括了非對稱加密,對稱加密和簽名的功能。
<meta charset="utf-8">
這個先訂條件是為了保證曲線不包含奇點。
所以,隨著曲線參數a和b的不斷變化,曲線也呈現出了不同的形狀。比如:
所有的非對稱加密的基本原理基本都是基於一個公式 K = k G。其中K代表公鑰,k代表私鑰,G代表某一個選取的基點。非對稱加密的演算法 就是要保證 該公式 不可進行逆運算( 也就是說G/K是無法計算的 )。 *
ECC是如何計算出公私鑰呢?這里我按照我自己的理解來描述。
我理解,ECC的核心思想就是:選擇曲線上的一個基點G,之後隨機在ECC曲線上取一個點k(作為私鑰),然後根據k G計算出我們的公鑰K。並且保證公鑰K也要在曲線上。*
那麼k G怎麼計算呢?如何計算k G才能保證最後的結果不可逆呢?這就是ECC演算法要解決的。
首先,我們先隨便選擇一條ECC曲線,a = -3, b = 7 得到如下曲線:
在這個曲線上,我隨機選取兩個點,這兩個點的乘法怎麼算呢?我們可以簡化下問題,乘法是都可以用加法表示的,比如2 2 = 2+2,3 5 = 5+5+5。 那麼我們只要能在曲線上計算出加法,理論上就能算乘法。所以,只要能在這個曲線上進行加法計算,理論上就可以來計算乘法,理論上也就可以計算k*G這種表達式的值。
曲線上兩點的加法又怎麼算呢?這里ECC為了保證不可逆性,在曲線上自定義了加法體系。
現實中,1+1=2,2+2=4,但在ECC演算法里,我們理解的這種加法體系是不可能。故需要自定義一套適用於該曲線的加法體系。
ECC定義,在圖形中隨機找一條直線,與ECC曲線相交於三個點(也有可能是兩個點),這三點分別是P、Q、R。
那麼P+Q+R = 0。其中0 不是坐標軸上的0點,而是ECC中的無窮遠點。也就是說定義了無窮遠點為0點。
同樣,我們就能得出 P+Q = -R。 由於R 與-R是關於X軸對稱的,所以我們就能在曲線上找到其坐標。
P+R+Q = 0, 故P+R = -Q , 如上圖。
以上就描述了ECC曲線的世界裡是如何進行加法運算的。
從上圖可看出,直線與曲線只有兩個交點,也就是說 直線是曲線的切線。此時P,R 重合了。
也就是P = R, 根據上述ECC的加法體系,P+R+Q = 0, 就可以得出 P+R+Q = 2P+Q = 2R+Q=0
於是乎得到 2 P = -Q (是不是與我們非對稱演算法的公式 K = k G 越來越近了)。
於是我們得出一個結論,可以算乘法,不過只有在切點的時候才能算乘法,而且只能算2的乘法。
假若 2 可以變成任意個數進行想乘,那麼就能代表在ECC曲線里可以進行乘法運算,那麼ECC演算法就能滿足非對稱加密演算法的要求了。
那麼我們是不是可以隨機任何一個數的乘法都可以算呢? 答案是肯定的。 也就是點倍積 計算方式。
選一個隨機數 k, 那麼k * P等於多少呢?
我們知道在計算機的世界裡,所有的都是二進制的,ECC既然能算2的乘法,那麼我們可以將隨機數k描 述成二進制然後計算。假若k = 151 = 10010111
由於2 P = -Q 所以 這樣就計算出了k P。 這就是點倍積演算法 。所以在ECC的曲線體系下是可以來計算乘法,那麼以為這非對稱加密的方式是可行的。
至於為什麼這樣計算 是不可逆的。這需要大量的推演,我也不了解。但是我覺得可以這樣理解:
我們的手錶上,一般都有時間刻度。現在如果把1990年01月01日0點0分0秒作為起始點,如果告訴你至起始點為止時間流逝了 整1年,那麼我們是可以計算出現在的時間的,也就是能在手錶上將時分秒指針應該指向00:00:00。但是反過來,我說現在手錶上的時分秒指針指向了00:00:00,你能告訴我至起始點算過了有幾年了么?
ECDSA簽名演算法和其他DSA、RSA基本相似,都是採用私鑰簽名,公鑰驗證。只不過演算法體系採用的是ECC的演算法。交互的雙方要採用同一套參數體系。簽名原理如下:
在曲線上選取一個無窮遠點為基點 G = (x,y)。隨機在曲線上取一點k 作為私鑰, K = k*G 計算出公鑰。
簽名過程:
生成隨機數R, 計算出RG.
根據隨機數R,消息M的HASH值H,以及私鑰k, 計算出簽名S = (H+kx)/R.
將消息M,RG,S發送給接收方。
簽名驗證過程:
接收到消息M, RG,S
根據消息計算出HASH值H
根據發送方的公鑰K,計算 HG/S + xK/S, 將計算的結果與 RG比較。如果相等則驗證成功。
公式推論:
HG/S + xK/S = HG/S + x(kG)/S = (H+xk)/GS = RG
在介紹原理前,說明一下ECC是滿足結合律和交換律的,也就是說A+B+C = A+C+B = (A+C)+B。
這里舉一個WIKI上的例子說明如何生成共享秘鑰,也可以參考 Alice And Bob 的例子。
Alice 與Bob 要進行通信,雙方前提都是基於 同一參數體系的ECC生成的 公鑰和私鑰。所以有ECC有共同的基點G。
生成秘鑰階段:
Alice 採用公鑰演算法 KA = ka * G ,生成了公鑰KA和私鑰ka, 並公開公鑰KA。
Bob 採用公鑰演算法 KB = kb * G ,生成了公鑰KB和私鑰 kb, 並公開公鑰KB。
計算ECDH階段:
Alice 利用計算公式 Q = ka * KB 計算出一個秘鑰Q。
Bob 利用計算公式 Q' = kb * KA 計算出一個秘鑰Q'。
共享秘鑰驗證:
Q = ka KB = ka * kb * G = ka * G * kb = KA * kb = kb * KA = Q'
故 雙方分別計算出的共享秘鑰不需要進行公開就可採用Q進行加密。我們將Q稱為共享秘鑰。
在以太坊中,採用的ECIEC的加密套件中的其他內容:
1、其中HASH演算法採用的是最安全的SHA3演算法 Keccak 。
2、簽名演算法採用的是 ECDSA
3、認證方式採用的是 H-MAC
4、ECC的參數體系採用了secp256k1, 其他參數體系 參考這里
H-MAC 全程叫做 Hash-based Message Authentication Code. 其模型如下:
在 以太坊 的 UDP通信時(RPC通信加密方式不同),則採用了以上的實現方式,並擴展化了。
首先,以太坊的UDP通信的結構如下:
其中,sig是 經過 私鑰加密的簽名信息。mac是可以理解為整個消息的摘要, ptype是消息的事件類型,data則是經過RLP編碼後的傳輸數據。
其UDP的整個的加密,認證,簽名模型如下:
C. 什麼是數字簽名
數字簽名是用於驗證數字和數據真實性和完整性的加密機制。我們可以將其視為傳統手寫簽名方式的數字化版本,並且相比於簽字具有更高的復雜性和安全性。
簡而言之,我們可以將數字簽名理解為附加到消息或文檔中的代碼。在生成數字簽名之後,其可以作為證明消息從發送方到接收方的傳輸過程中沒有被篡改的證據。
雖然使用密碼學保護通信機密性的概念可以追溯到古代,但隨著公鑰密碼學(PKC)的發展,數字簽名方案在20世紀70年代才成為現實。因此,要了解數字簽名的工作原理,我們首先需要了解散列函數和公鑰加密的基礎知識。
哈希是數字簽名中的核心要素之一。哈希值的運算過程是指將任意長度的數據轉換為固定長度。這是通過稱為散列函數的特殊運算實現的。經過散列函數運算而生成的值稱為哈希值或消息摘要。
當哈希值與加密演算法相結合,即使用加密散列函數的方法來生成散列值(摘要),該值可作為唯一的數字指紋。這意味著對於輸入數據(消息)的任何更改都會導致有完全不同的輸出值(散列值)。這就是加密散列函數被廣泛用於驗證數字和數據真實性的原因。
公鑰加密或PKC是指使用一對密鑰的加密系統:公鑰和私鑰。這兩個密鑰在數學上是相關的,可用於數據加密和數字簽名。
作為一種加密工具,PKC相比於對稱加密具有更高的安全性。對稱加密系統依賴於相同的密鑰進行加密和解密信息,但PKC則使用公鑰進行數據加密,並使用相應的私鑰進行數據解密。
除此之外,PKC還可以應用於生成數字簽名。本質上,該過程發送方使用自己的私鑰對消息(數據)的哈希值進行加密。接下來,消息的接收者可以使用簽名者提供的公鑰來檢查該數字簽名是否有效。
在某些情況下,數字簽名本身可能包括了加密的過程,但並非總是這樣。例如,比特幣區塊鏈使用PKC和數字簽名,而並不像大多數人所認為的,這個過程中並沒有進行加密。從技術上講,比特幣又部署了所謂的橢圓曲線數字簽名演算法(ECDSA)來驗證交易。
在加密貨幣的背景下,數字簽名系統通常包含三個基本流程:散列、簽名和驗證。
第一步是對消息或數據進行散列。通過散列演算法對數據進行運算,生成哈希值(即消息摘要)來完成的。如上所述,消息的長度可能會有很大差異,但是當消息被散列後,它們的哈希值都具有相同的長度。這是散列函數的最基本屬性。
但是,僅僅將消息進行散列並不是生成數字簽名的必要條件,因為也可以使用私鑰對沒有進行過散列的消息進行加密。但對於加密貨幣,消息是需要經過散列函數處理的,因為處理固定長度的哈希值有助於加密貨幣的程序運行。
對信息進行散列處理後,消息的發件人需要對其消息進行簽名。這里就用到了公鑰密碼學。有幾種類型的數字簽名演算法,每種演算法都有自己獨特的運行機制。本質上,都是使用私鑰對經過散列的消息(哈希值)進行簽名,然後消息的接收者可以使用相應的公鑰(由簽名者提供)來檢查其有效性。
換句話說,如果在生成簽名時不使用私鑰,則消息的接收者將不能使用相應的公鑰來驗證其有效性。公鑰和私鑰都是由消息的發送者生成的,但僅將公鑰共享給接收者。
需要注意的是,數字簽名與每條消息的內容相關聯。因此,與手寫簽名所不同,每條消息的數字簽名都是不同的。
讓我們舉一個例子說明下整個過程,包括從開始直到最後一步的驗證。我們假設Alice向Bob發送一條消息、並將該消息進行散列得到哈希值,然後將哈希值與她的私鑰結合起來生成數字簽名。數字簽名將作為該消息的唯一數字指紋。
當Bob收到消息時,他可以使用Alice提供的公鑰來檢查數字簽名的有效性。這樣,Bob可以確定簽名是由Alice創建的,因為只有她擁有與該公鑰所對應的私鑰(至少這與我們所假設的一致)。
因此,Alice需要保管好私鑰至關重要。如果另一個人拿到了Alice的私鑰,他們就同樣可以創建數字簽名並偽裝成Alice。在比特幣的背景下,這意味著有人可以使用Alice的私鑰,並可在未經她知曉的情況下轉移或使用她的比特幣。
數字簽名通常用於實現以下三方面目標:數據完整性、身份驗證和不可否認性。
數字簽名可以應用於各種數字文檔和證書。因此,他們有幾個應用程序。一些最常見的案例包括:
數字簽名方案面臨的主要挑戰主要局限於以下三方面因素:
簡而言之,數字簽名可以理解為是一種特定類型的電子簽名,特指使用電子化的方式簽署文檔和消息。因此,所有數字簽名都可認為是電子簽名,但反之並非如此。
它們之間的主要區別在於身份驗證方式。數字簽名需要部署加密系統,例如散列函數、公鑰加密和加密技術。
散列函數和公鑰加密是數字簽名系統的核心,現已在各種案例中使用。如果實施得當,數字簽名可以提高安全性,確保完整性,便於對各類數據進行身份驗證。
在區塊鏈領域,數字簽名用於簽署和授權加密貨幣交易。它們對比特幣尤為重要,因為數字簽名能夠確保代幣只能由擁有相應私鑰的人使用。
雖然我們多年來一直使用電子和數字簽名,但仍有很大的發展空間。如今大部分的公文仍然還是基於紙質材料,但隨著更多的系統遷移到數字化中,我們還會看到更多的數字簽名方案。
D. 區塊鏈使用安全如何來保證呢
區塊鏈本身解決的就是陌生人之間大規模協作問題,即陌生人在不需要彼此信任的情況下就可以相互協作。那麼如何保證陌生人之間的信任來實現彼此的共識機制呢?中心化的系統利用的是可信的第三方背書,比如銀行,銀行在老百姓看來是可靠的值得信任的機構,老百姓可以信賴銀行,由銀行解決現實中的糾紛問題。但是,去中心化的區塊鏈是如何保證信任的呢?
實際上,區塊鏈是利用現代密碼學的基礎原理來確保其安全機制的。密碼學和安全領域所涉及的知識體系十分繁雜,我這里只介紹與區塊鏈相關的密碼學基礎知識,包括Hash演算法、加密演算法、信息摘要和數字簽名、零知識證明、量子密碼學等。您可以通過這節課來了解運用密碼學技術下的區塊鏈如何保證其機密性、完整性、認證性和不可抵賴性。
基礎課程第七課 區塊鏈安全基礎知識
一、哈希演算法(Hash演算法)
哈希函數(Hash),又稱為散列函數。哈希函數:Hash(原始信息) = 摘要信息,哈希函數能將任意長度的二進制明文串映射為較短的(一般是固定長度的)二進制串(Hash值)。
一個好的哈希演算法具備以下4個特點:
1、 一一對應:同樣的明文輸入和哈希演算法,總能得到相同的摘要信息輸出。
2、 輸入敏感:明文輸入哪怕發生任何最微小的變化,新產生的摘要信息都會發生較大變化,與原來的輸出差異巨大。
3、 易於驗證:明文輸入和哈希演算法都是公開的,任何人都可以自行計算,輸出的哈希值是否正確。
4、 不可逆:如果只有輸出的哈希值,由哈希演算法是絕對無法反推出明文的。
5、 沖突避免:很難找到兩段內容不同的明文,而它們的Hash值一致(發生碰撞)。
舉例說明:
Hash(張三借給李四10萬,借期6個月) = 123456789012
賬本上記錄了123456789012這樣一條記錄。
可以看出哈希函數有4個作用:
簡化信息
很好理解,哈希後的信息變短了。
標識信息
可以使用123456789012來標識原始信息,摘要信息也稱為原始信息的id。
隱匿信息
賬本是123456789012這樣一條記錄,原始信息被隱匿。
驗證信息
假如李四在還款時欺騙說,張三隻借給李四5萬,雙方可以用哈希取值後與之前記錄的哈希值123456789012來驗證原始信息
Hash(張三借給李四5萬,借期6個月)=987654321098
987654321098與123456789012完全不同,則證明李四說謊了,則成功的保證了信息的不可篡改性。
常見的Hash演算法包括MD4、MD5、SHA系列演算法,現在主流領域使用的基本都是SHA系列演算法。SHA(Secure Hash Algorithm)並非一個演算法,而是一組hash演算法。最初是SHA-1系列,現在主流應用的是SHA-224、SHA-256、SHA-384、SHA-512演算法(通稱SHA-2),最近也提出了SHA-3相關演算法,如以太坊所使用的KECCAK-256就是屬於這種演算法。
MD5是一個非常經典的Hash演算法,不過可惜的是它和SHA-1演算法都已經被破解,被業內認為其安全性不足以應用於商業場景,一般推薦至少是SHA2-256或者更安全的演算法。
哈希演算法在區塊鏈中得到廣泛使用,例如區塊中,後一個區塊均會包含前一個區塊的哈希值,並且以後一個區塊的內容+前一個區塊的哈希值共同計算後一個區塊的哈希值,保證了鏈的連續性和不可篡改性。
二、加解密演算法
加解密演算法是密碼學的核心技術,從設計理念上可以分為兩大基礎類型:對稱加密演算法與非對稱加密演算法。根據加解密過程中所使用的密鑰是否相同來加以區分,兩種模式適用於不同的需求,恰好形成互補關系,有時也可以組合使用,形成混合加密機制。
對稱加密演算法(symmetric cryptography,又稱公共密鑰加密,common-key cryptography),加解密的密鑰都是相同的,其優勢是計算效率高,加密強度高;其缺點是需要提前共享密鑰,容易泄露丟失密鑰。常見的演算法有DES、3DES、AES等。
非對稱加密演算法(asymmetric cryptography,又稱公鑰加密,public-key cryptography),與加解密的密鑰是不同的,其優勢是無需提前共享密鑰;其缺點在於計算效率低,只能加密篇幅較短的內容。常見的演算法有RSA、SM2、ElGamal和橢圓曲線系列演算法等。 對稱加密演算法,適用於大量數據的加解密過程;不能用於簽名場景:並且往往需要提前分發好密鑰。非對稱加密演算法一般適用於簽名場景或密鑰協商,但是不適於大量數據的加解密。
三、信息摘要和數字簽名
顧名思義,信息摘要是對信息內容進行Hash運算,獲取唯一的摘要值來替代原始完整的信息內容。信息摘要是Hash演算法最重要的一個用途。利用Hash函數的抗碰撞性特點,信息摘要可以解決內容未被篡改過的問題。
數字簽名與在紙質合同上簽名確認合同內容和證明身份類似,數字簽名基於非對稱加密,既可以用於證明某數字內容的完整性,同時又可以確認來源(或不可抵賴)。
我們對數字簽名有兩個特性要求,使其與我們對手寫簽名的預期一致。第一,只有你自己可以製作本人的簽名,但是任何看到它的人都可以驗證其有效性;第二,我們希望簽名只與某一特定文件有關,而不支持其他文件。這些都可以通過我們上面的非對稱加密演算法來實現數字簽名。
在實踐中,我們一般都是對信息的哈希值進行簽名,而不是對信息本身進行簽名,這是由非對稱加密演算法的效率所決定的。相對應於區塊鏈中,則是對哈希指針進行簽名,如果用這種方式,前面的是整個結構,而非僅僅哈希指針本身。
四 、零知識證明(Zero Knowledge proof)
零知識證明是指證明者在不向驗證者提供任何額外信息的前提下,使驗證者相信某個論斷是正確的。
零知識證明一般滿足三個條件:
1、 完整性(Complteness):真實的證明可以讓驗證者成功驗證;
2、 可靠性(Soundness):虛假的證明無法讓驗證者通過驗證;
3、 零知識(Zero-Knowledge):如果得到證明,無法從證明過程中獲知證明信息之外的任何信息。
五、量子密碼學(Quantum cryptography)
隨著量子計算和量子通信的研究受到越來越多的關注,未來量子密碼學將對密碼學信息安全產生巨大沖擊。
量子計算的核心原理就是利用量子比特可以同時處於多個相干疊加態,理論上可以通過少量量子比特來表達大量信息,同時進行處理,大大提高計算速度。
這樣的話,目前的大量加密演算法,從理論上來說都是不可靠的,是可被破解的,那麼使得加密演算法不得不升級換代,否則就會被量子計算所攻破。
眾所周知,量子計算現在還僅停留在理論階段,距離大規模商用還有較遠的距離。不過新一代的加密演算法,都要考慮到這種情況存在的可能性。
E. 區塊鏈中的對稱加密是什麼非對稱加密又是什麼
對稱加密演算法是指在加密和解密時使用的是同一個秘鑰。與對稱加密演算法不同,非對稱加密演算法需要公鑰和私鑰。公鑰和私鑰是一對,如果用公鑰對數據進行加密,只有用對應的私鑰才能解密。
非對稱加密與對稱加密相比,其安全性更好。對稱加密的通信雙方使用相同的秘鑰,如果一方的秘鑰遭泄露,那麼整個通信就會被破解。
而非對稱加密使用一對秘鑰,一個用來加密,一個用來解密,而且公鑰是公開的,秘鑰是自己保存的,在通訊前不需要先同步秘鑰,避免了在同步私鑰過程中被黑客盜取信息的風險。
F. 區塊鏈技術中的哈希演算法是什麼
1.1. 簡介
計算機行業從業者對哈希這個詞應該非常熟悉,哈希能夠實現數據從一個維度向另一個維度的映射,通常使用哈希函數實現這種映射。通常業界使用y = hash(x)的方式進行表示,該哈希函數實現對x進行運算計算出一個哈希值y。
區塊鏈中哈希函數特性:
函數參數為string類型;
固定大小輸出;
計算高效;
collision-free 即沖突概率小:x != y => hash(x) != hash(y)
隱藏原始信息:例如區塊鏈中各個節點之間對交易的驗證只需要驗證交易的信息熵,而不需要對原始信息進行比對,節點間不需要傳輸交易的原始數據只傳輸交易的哈希即可,常見演算法有SHA系列和MD5等演算法
1.2. 哈希的用法
哈希在區塊鏈中用處廣泛,其一我們稱之為哈希指針(Hash Pointer)
哈希指針是指該變數的值是通過實際數據計算出來的且指向實際的數據所在位置,即其既可以表示實際數據內容又可以表示實際數據的存儲位置。下圖為Hash Pointer的示意圖

G. 對稱加密、非對稱加密、摘要、數字簽名、數字證書
作為一個開發人員,或多或少都聽說過對稱加密、非對稱加密、摘要、數字簽名、數字證書這幾個概念,它們是用來保證在互聯網通信過程中數據傳輸安全的。有人可能會有疑惑,我給傳輸數據加個密不就安全了,為什麼還要搞這么多花樣出來?本文主要通過一個案例來講解這幾個概念的實際作用。
在此之前,我先簡單介紹一下這幾個概念。
對稱加密是指用來加密和解密的是同一個秘鑰。其特點是加密速度快,但是秘鑰容易被黑客截獲,所以安全性不高。常見的有AES、DES演算法。
非對稱加密是指用來加密和解密的是不同的秘鑰,它們是成對出現的,稱為公鑰和私鑰,知道其中一個秘鑰是無法推導出另外一個秘鑰的。用公鑰加密的內容需要用私鑰才能解密,用私鑰加密的內容需要用公鑰才能解密。非對稱加密的特點是安全性高,缺點是加密速度慢。常見的有RSA演算法。
所謂的摘要就是一段信息或者一個文件通過某個哈希演算法(也叫摘要演算法)而得到的一串字元。摘要演算法的特點就是不同的文件計算出的摘要是不同的(也有可能相同,但是可能性非常非常低),比如一個1G的視頻文件,哪怕只是改動其中一個位元組,最後計算得到的摘要也是完全不同的,所以摘要演算法通常是用來判斷文件是否被篡改過。其還有一個特點就是通過摘要是無法推導出源文件的信息的。常用的摘要演算法有MD5、SHA等。
數字簽名就是一個文件的摘要加密後的信息。數字簽名是和源文件一起發送給接收方的,接收方收到後對文件用摘要演算法算出一個摘要,然後和數字簽名中的摘要進行比對,兩者不一致的話說明文件被篡改了。
數字證書是一個經證書授權中心生成的文件,數字證書里一般會包含公鑰、公鑰擁有者名稱、CA的數字簽名、有效期、授權中心名稱、證書序列號等信息。其中CA的數字簽名是驗證證書是否被篡改的關鍵,它其實就是對證書裡面除了CA的數字簽名以外的內容進行摘要演算法得到一個摘要,然後CA機構用他自己的私鑰對這個摘要進行加密就生成了CA的數字簽名,CA機構會公開它的公鑰,驗證證書時就是用這個公鑰解密CA的數字簽名,然後用來驗證證書是否被篡改。
場景:
張三要找人裝修一個房子,原則是誰的出價便宜就給誰裝修,所以對於報價文件就是屬於機密文件。下面我們來看下不同的方式傳輸報價文件都會有什麼風險。
現在李四想接這個裝修的活,他做了一份報價文件(文件名: lisi.txt ,文件內容: 報價50萬 )。然後李四用一個對稱秘鑰 123 對這個文件進行加密。最後李四將這個秘鑰和加密的文件發給張三,張三收到後用這個秘鑰解密,知道了李四的報價是50萬。
同時王五也想接這個裝修的活,他本來是想報價55萬的,但是又擔心報價太高而丟掉這個活。恰巧王五是個黑客高手,於是他截獲了李四發給張三的秘鑰和加密文件,知道了李四報價是50萬。最後王五將自己的報價改成了49萬發給張三,結果王五接下了這個裝修活。
結論:
用對稱加密的話,一旦秘鑰被黑客截獲,加密就形同虛設,所以安全性比較低。
首先張三會生成一對秘鑰,私鑰是 zhangsan1 ,公鑰是 zhangsan2 ,私鑰張三自己保存,將公鑰公布出去。
李四將報價文件 list.txt 用張三公布的公鑰 zhangsan2 進行加密後傳給張三,然後張三用私鑰 zhangsan1 進行解密得到李四的報價是50萬。
這個時候即使王五截獲到了李四發給張三的報價文件,由於王五沒有張三的私鑰,所以他是無法解密文件的,也就無法知道李四的報價。最後王五因為報價55萬而丟掉了這個裝修的機會。
所以用非對稱加密是可以保證數據傳輸安全的。不過這里說一句題外話,既然非對稱加密安全性高,那為什麼不淘汰掉對稱加密呢?其實關鍵就在於加密速度,非對稱加密計算量很大,所以加密速度是很慢的,如果發送消息非常頻繁,使用非對稱加密的話就會對性能造成很大影響。所以在實際開發過程中通常是對稱加密和非對稱加密結合使用的。也就是對稱加密的秘鑰是用非對稱加密後發送的,這樣能保證對稱加密的秘鑰不被黑客截獲,然後在發送業務數據時就用對稱加密。這樣既保證了安全性也保證了加密速度。
結論:
非對稱加密可以防止黑客截獲加密後的內容,安全性高。
前面都說了非對稱加密是安全的,那為什麼還要數字簽名呢?
設想一下,王五截獲了李四的報價文件,王五雖然無法知道李四的實際報價,但是他完全可以偽造一份李四的報價(文件名: lisi.txt ,文件內容: 報價60萬 ),然後將這份偽造文件用張三公布的公鑰 zhangsan2 進行加密後替換原來的報價文件。張三收到後解密發現報價是60萬,於是張三就以為李四報的價是60萬,最後決定將裝修的活給報價55萬的王五來做。
發生這個問題的關鍵就在於張三無法知道報價文件是否被篡改過。要解決這個問題就需要用到數字簽名。
首先李四需要自己生成一對非對稱加密的秘鑰,私鑰 lisi1 自己保存,公鑰 lisi2 發給張三。然後李四對自己的報價文件通過摘要演算法得到一個摘要(假設摘要是 aaa ),再用自己的私鑰 lisi1 加密這個摘要就得到了報價文件的數字簽名,最後將加密的報價文件和數字簽名一起發給張三,張三收到後先用李四發過來的公鑰 lisi2 解密數字簽名得到摘要 aaa ,然後用自己的私鑰 zhangsan1 解密加密的文件得到報價源文件,然後對報價源文件進行摘要演算法,看計算得到的結果是不是 aaa ,如果不是 aaa 的話就說明報價文件被篡改了。
在這種情況下,如果王五截獲了李四發給張三的文件。王五是無法解密報價文件的。如果王五偽造一份報價文件的話,等張三收到後就會發現報價文件和數字簽名不匹配。那王五能不能偽造報價文件的同時也偽造簽名呢?因為王五沒有李四的私鑰,所以沒法對偽造的報價文件的摘要進行加密,所以也就沒法偽造簽名。
結論:
非對稱加密雖然能確保加密文件內容不被竊取,但不能保證文件不被篡改。數字簽名就是用來驗證文件是否被篡改過。
既然非對稱加密可以保證文件內容的安全性,數字簽名又可以保證文件不被篡改,那還要數字證書有什麼用呢?
我們再來設想一下,王五自己也生成了一對用於非對稱加密的秘鑰,私鑰是 wangwu1 ,公鑰是 wangwu2 。前面李四將自己的公鑰 lisi2 發給張三的過程中被王五給截獲了,王五用自己的公鑰 wangwu2 替換了李四的公鑰 lisi2 ,所以張三最後收到的公鑰實際上是王五的,但張三對這並不知情。後面李四發的數字簽名和加密的報價文件都被王五截獲,並且王五偽造了一份報價文件,同時用自己的私鑰加密報價文件的摘要生成偽造的簽名並發給張三,張三收到後進行驗證發現數字簽名和報價文件是匹配的,就以為這份報價文件是真實的。
出現這個問題的關鍵就在於張三沒法確認收到的公鑰到底是不是李四發的,這個時候數字證書就起到作用了。李四到權威的數字證書機構申請數字證書,證書裡麵包含了公鑰( lisi2 )和公鑰的擁有者( 李四 )等相關信息,然後李四將證書發給張三,張三通過證書裡面的信息就可以知道公鑰到底是不是李四的了。
那證書在發送過程中有沒有可能被王五截獲並篡改呢?要知道證書裡面還包含CA的數字簽名,這個簽名是證書機構用他們自己的私鑰對證書的摘要進行加密的,而公鑰是公開的。所以即便王五截獲並篡改了證書內容,他也無法偽造證書機構的簽名,張三在收到證書後通過驗證簽名也會發現證書被篡改了。所以到這一步才能保證數據傳輸的真正安全。
H. 怎麼解讀區塊鏈的數字簽名
在區塊鏈的分布式網路里,節點之間進行通訊並達成信任,需要依賴數字簽名技術,它主要實現了身份確認以及信息真實性、完整性驗證。
數字簽名
數字簽名(又稱公鑰數字簽名、電子簽章)是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領域的技術實現,用於鑒別數字信息的方法。一套數字簽名通常定義兩種互補的運算,一個用於簽名,另一個用於驗證。就是只有信息的發送者才能產生的別人無法偽造的一段數字串,這段數字串同時也是對信息的發送者發送信息真實性的一個有效證明。簡單證明 「我就是我」。
I. 數字簽名是非對稱加密技術的一種體現,對嗎
數字簽名:發送者使用其私鑰加密,然後接收者使用發送者的公鑰解密驗證。
非對稱加密對數據加密:使用接收者的公鑰對數據加密,然後接收者收到後使用其私鑰解密。
數字簽名是非對稱加密技術的一種應用吧
可以這么理解。