以太坊中的secp256k
⑴ 以太坊怎麼根據地址獲取私鑰
安裝metamask metamask是可以安裝在瀏覽器上的擴展程序,可以在進行安裝。建議在安裝在虛擬機中
以太坊的私鑰生成是通過secp256k1橢圓曲線演算法生成的,secp256k1是一個橢圓曲線演算法,同比特幣。公鑰推導地址和比特幣相比,在私鑰生成公鑰這一步其實是一樣的,區別在公鑰推導地
以太坊錢包地址就是你的銀行卡號,倘若你把地址忘了,可以用私鑰、助記詞、keystore+密碼,導入錢包找回。首先注冊登錄bitz,找到資產下面的以太坊,點擊充值,這時候就能獲取充值地址了。然後把錢包里的以太坊直接充到這個地址就行了。
⑵ 【深度知識】區塊鏈之加密原理圖示(加密,簽名)
先放一張以太坊的架構圖:
在學習的過程中主要是採用單個模塊了學習了解的,包括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的整個的加密,認證,簽名模型如下:
⑶ 【以太坊易錯概念】nonce, 公私鑰和地址,BASE64/BASE58,
以太坊里的nonce有兩種意思,一個是proof of work nonce,一個是account nonce。
在智能合約里,nonce的值代表的是該合約創建的合約數量。只有當一個合約創建另一個合約的時候才會增加nonce的值。但是當一個合約調用另一個合約中的method時 nonce的值是不變的。
在以太坊中nonce的值可以這樣來獲取(其實也就是屬於一個賬戶的交易數量):
但是這個方法只能獲取交易once的值。目前是沒有內置方法來訪問contract中的nonce值的
通過橢圓曲線演算法生成鑰匙對(公鑰和私鑰),以太坊採用的是secp256k1曲線,
公鑰採用uncompressed模式,生成的私鑰為長度32位元組的16進制字串,公鑰為長度64的公鑰字串。公鑰04開頭。
把公鑰去掉04,剩下的進行keccak-256的哈希,得到長度64位元組的16進制字串,丟掉前面24個,拿後40個,再加上"0x",即為以太坊地址。
整個過程可以歸納為:
2)有些網關或系統只能使用ASCII字元。Base64就是用來將非ASCII字元的數據轉換成ASCII字元的一種方法,而且base64特別適合在http,mime協議下快速傳輸數據。Base64使用【字母azAZ數字09和+/】這64個字元編碼。原理是將3個位元組轉換成4個位元組(3 X 8) = 24 = (4 X 6)
當剩下的字元數量不足3個位元組時,則應使用0進行填充,相應的,輸出字元則使用'='佔位,因此編碼後輸出的文本末尾可能會出現1至2個'='。
1)Base58是用於Bitcoin中使用的一種獨特的編碼方式,主要用於產生Bitcoin的錢包地址。相比Base64,Base58不使用數字"0",字母大寫"O",字母大寫"I",和字母小寫"l",以及"+"和"/"符號。
Base58Check是一種常用在比特幣中的Base58編碼格式,增加了錯誤校驗碼來檢查數據在轉錄中出現的錯誤。 校驗碼長4個位元組,添加到需要編碼的數據之後。校驗碼是從需要編碼的數據的哈希值中得到的,所以可以用來檢測並避免轉錄和輸入中產生的錯誤。使用 Base58check編碼格式時,編碼軟體會計算原始數據的校驗碼並和結果數據中自帶的校驗碼進行對比。二者不匹配則表明有錯誤產生,那麼這個 Base58Check格式的數據就是無效的。例如,一個錯誤比特幣地址就不會被錢包認為是有效的地址,否則這種錯誤會造成資金的丟失。
為了使用Base58Check編碼格式對數據(數字)進行編碼,首先我們要對數據添加一個稱作「版本位元組」的前綴,這個前綴用來明確需要編碼的數 據的類型。例如,比特幣地址的前綴是0(十六進制是0x00),而對私鑰編碼時前綴是128(十六進制是0x80)。 表4-1會列出一些常見版本的前綴。
接下來,我們計算「雙哈希」校驗碼,意味著要對之前的結果(前綴和數據)運行兩次SHA256哈希演算法:
checksum = SHA256(SHA256(prefix+data))
在產生的長32個位元組的哈希值(兩次哈希運算)中,我們只取前4個位元組。這4個位元組就作為校驗碼。校驗碼會添加到數據之後。
結果由三部分組成:前綴、數據和校驗碼。這個結果採用之前描述的Base58字母表編碼。下圖描述了Base58Check編碼的過程。
相同:
1) 哈希演算法、Merkle樹、公鑰密碼演算法
https://blog.csdn.net/s_lisheng/article/details/77937202?from=singlemessage
2)全新的 SHA-3 加密標准 —— Keccak
https://blog.csdn.net/renq_654321/article/details/79797428
3)在線加密演算法
http://tools.jb51.net/password/hash_md5_sha
4)比特幣地址生成演算法詳解
https://www.cnblogs.com/zhaoweiwei/p/address.html
5)Base58Check編碼實現示例
https://blog.csdn.net/QQ604666459/article/details/82419527
6) 比特幣交易中的簽名與驗證
https://www.jianshu.com/p/a21b7d72532f
⑷ 密碼學系統
本文分為7個部分,第1部分介紹密碼學的基本概念,第2部分講解常見的對稱加密演算法,第3部分講解常見的非對稱加密演算法,第4部分講解 數字簽名, 第5部分講解PKI(Public Key Infrastructure),第6部分講解哈希函數加密,第7部分講解密碼學在區塊鏈里的應用, 最後一部分會講解隨機數。
比較常見的對稱加密演算法有: Digital Encryption Standard(DES), Triple-DES, IDEA, BLOWFISH。
對稱加密的挑戰:
非對稱加密的挑戰:
比較常見的非對稱加密演算法有: RSA, ElGamal, ECC。
菲斯特爾結構的塊加密演算法是著名的一個分組密碼加密的設計模型。
1990年後對DES進行徹底的密鑰搜索的速度開始引起DES用戶的不適。 然而,用戶並不想取代DES,因為它需要花費大量的時間和金錢來改變廣泛採用並嵌入到大型安全架構中的加密演算法。
務實的做法不是完全放棄DES,而是改變DES的使用方式。 這導致了三重DES(3DES)的修改方案。
三重DES
在使用3TDES之前,用戶首先生成並分配一個3TDES密鑰K,它由三個不同的DES密鑰K1,K2和K3組成。
詳細可以看 Triple-DES
高級加密標准(Advanced Encryption Standard,AES)是目前比較流行和廣泛採用的對稱加密演算法。 發現至少比三重DES快6倍。
AES的功能如下:
對稱密鑰對稱分組密碼
128位數據,128/192/256位密鑰
比Triple-DES更強更快
提供完整的規格和設計細節
詳細可以看 AES
這個密碼系統是最初的系統之一。 即使在今天,它仍然是最多被使用的密碼系統。 該系統由三位學者Ron Rivest,Adi Shamir和Len Adleman發明,因此被稱為RSA密碼系統。
下面給出生成RSA密鑰對的一個例子(為了便於理解,這里採用的素數p&q值很小,實際上這些值非常高)。
設兩個素數為p = 7且q = 13。因此,模數n = pq = 7×13 = 91。
選擇 e = 5,這是一個有效的選擇,因為沒有數字是公因子5和(p - 1)(q - 1)= 6×12 = 72,除了1。
這對數字(n,e) = (91, 5)形成公鑰,可以讓任何我們希望能夠向我們發送加密消息的人使用。
向擴展歐幾里德演算法輸入p = 7,q = 13和e = 5。 輸出將是d = 29。
因此,公鑰是(91, 5),私鑰是(91, 29)。
假設發送者希望發送一些文本消息給公鑰為(n,e)的人。然後發件人將明文表示為一系列小於n的數字。
為了加密第一個明文P,它是一個模n的數字。 加密過程是簡單的數學步驟:
C = Pe mod n
換句話說,密文C等於明文P乘以自己e次,然後減去模n。 這意味著C也是一個小於n的數字。
回到我們的密鑰生成例子,明文P = 10,我們得到密文C:
C = 105 mod 91
屬於ECC的一種變化。加密的核心理念與RSA相似,也是利用離散對數很難求解。
但與RSA不同的是 公鑰的組成部分,EIGamal的公鑰有三部分組成, 質模數 p, 生成元素 g, 以及 公共的 Y = gx(g的x次方) mod p。
詳細可以看 ElGamal Crytosystem
橢圓曲線密碼術(ECC)是用來描述一套密碼工具和協議的術語,其安全性基於特殊版本的離散對數問題。它不使用數字模p。ECC基於與稱為橢圓曲線的數學對象相關聯的數字集合。有這些數字的加法和計算倍數的規則,就像數字模p一樣。
ECC包含許多最初為模塊化數字設計的密碼方案的變體,如ElGamal加密和數字簽名演算法。
相信當應用於橢圓曲線上的點時,離散對數問題更加困難。這會提示從數字模p切換到橢圓曲線上的點。如果我們使用基於橢圓曲線的變體,也可以用較短的密鑰獲得等效的安全級別。
較短的密鑰有兩個好處:
易於管理
高效的計算
這些優點使基於橢圓曲線的加密方案變體對計算資源受到限制的應用程序非常有吸引力。
詳細可以看 Elliptic Curve Cryptography
^符號表示為多少次方
簽名 = 消息^D mod N (D和N 為簽名者的私鑰,計算消息的D次方並求mod N,所得余數即為簽名)
消息 = 簽名^E mod N (E和N 為簽名者的公鑰,計算簽名的E次方並求mod N)
舉個例子:
私鑰: D = 29; N = 323
公鑰: E = 5; N = 323
消息: 123
由於 N 的值為 323, 因此消息需要為 0 ~ 322 這個范圍內的整數. 假設需要對 123 這個消息進行簽名.
用私鑰(D,N) = (29,323) 對消息 123 進行簽名.
消息^D mod N = 123^29 mod 323 = 157
因此 (消息, 簽名) = (123, 157)
用公鑰(E,N) = (5,323)對消息進行驗證
簽名^E mod N = 157^5 mod 323 = 123
得到消息 123 與發送者發送過來的消息 123 是一致的,因此簽名驗證成功.
https://andrea.corbellini.name/2015/05/17/elliptic-curve-cryptography-a-gentle-introction/
加法逆: a在集合中, -a在集合中的定義為使 a + (-a) = 0, 這就是加法逆元運算
乘法逆: a在集合中,且不為0, a^-1 在集合中定位為使 a* a^-1 = 1, 這就是乘法逆元運算
在聊橢圓曲線前,我們先打一些基礎然後再討論一下對數問題.
在一個集合上定義一個二元運算,這就是數學中的群。一個集合 G 要成為一個群,必須滿足下面 4 個條件:
從平常的加法概念來看, 整數集 Z 是一個群(而且是阿貝爾群). 自然數集 N 不是一個群.
我們可以在橢圓曲線上定義一個群:
https://andrea.corbellini.name/ecc/interactive/reals-add.html
如下圖: 點 A 的自我相加過程就是做 乘法的過程 這個過程叫 Point Doubling
計算 nP 需要做 n次加法 如果 n 為 k 位二進制 時間復雜度為 O(2^k)
倍加演算法 比如 n = 151 二進制為 10010111
用倍加演算法 時間復雜度有了很大的改進 O(logN) or O(k)
Q = nP
這只是 p = 211, 像 Secp256k1 這條橢圓曲線的 p = 34671663 一個78位的數字 要怎麼求出 n?
一個通俗的比喻: 假設這些點是有個人 A 在一個很大的房間里玩彈珠的游戲 玩了兩年 兩年後 A 的朋友 B來了 B看到了最後的點 以及 A 告訴B 起點 但是B怎麼能知道 A 是彈了多少次才從起點彈到終點?
上面這兩張圖是 橢圓曲線 - Secp256K1: y^2 = x^3 + 7
第一張圖: 定義在 實數域
第二張圖: 定義在 有限域Zp
是用下面的參數(p,a,b,G,n,h)形成的:
p = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F = 2^256 - 2^32 - 997
a = 0
b = 7
G = [0x79BE667E_F9DCBBAC_55A06295_CE870B07_029BFCDB_2DCE28D9_59F2815B_16F81798,
0x483ADA77_26A3C465_5DA4FBFC_0E1108A8_FD17B448_A6855419_9C47D08F_FB10D4B8]
n = 0xFFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFE_BAAEDCE6_AF48A03B_BFD25E8C_D0364141
h = 1
如果橢圓曲線上一點P, 存在最小的正整數 n 使得數乘 nP=O∞, 則將 n 稱為 P 的階
計算可得 27P = -P = (3, 13) 所以 28P = 0∞ P的階為28
如何簽名?
Sig = F sig ( F keccak256 ( m ) , k )
如何計算 r
如何計算 s
s ≡ q^-1 (Keccak256(m) + r * k) (mod p)
如何驗證簽名?
P.S. 上述驗證簽名的過程中 沒有用到發送者的 私鑰
RSA 密鑰大小(bits) ECC 密鑰大小 (bits)
1024 160
2048 224
3072 256
7680 384
15360 521
有一個研究例子 同一台計算能力的計算機
為什麼 比特幣和以太坊要選擇 Secp256k1 這條橢圓曲線?
假如有人提供一條橢圓曲線比如 Secp256r1 如何驗證這條曲線的安全性?
因為公鑰是公開的,很容易被破壞或者篡改,因此需要建立和維持一種可信的基礎機制來管理公鑰。
PKI由5部分組成:
作為比喻,證書可以被視為發給該人的身份證。人們使用駕照,護照等身份證來證明自己的身份。數字證書在電子世界中具有相同的基本功能。
但有一點不同,數字證書不僅發給人,還可以發給電腦,軟體包或任何其他需要證明電子世界身份的東西。
數字證書基於ITU標准X.509,該標準定義了公鑰證書和認證驗證的標准證書格式。因此數字證書有時也被稱為X.509證書。
與用戶客戶端相關的公鑰與證書頒發機構(CA)一起存儲在數字證書中,以及其他相關信息,例如客戶信息,到期日期,使用情況,發行者等。
CA對此整個信息進行數字簽名並在證書中包含數字簽名。
任何需要對客戶的公共密鑰和相關信息進行保證的人,他都會使用CA的公鑰進行簽名驗證過程。成功的驗證可確保證書中給出的公鑰屬於在證書中給出詳細信息的人員。
下圖了展示了個人/實體獲取數字證書的過程:
如圖所示,CA接受來自客戶端的申請以證明其公鑰。 CA在適當驗證客戶身份後,向該客戶發出數字證書。
如上所述,CA向客戶頒發證書並協助其他用戶驗證證書。 CA負責正確識別要求頒發證書的客戶的身份,並確保證書中包含的信息是正確的並對其進行數字簽名。
CA的關鍵功能:
證書類別
有四種典型的證書類別:
第1類 - 通過提供電子郵件地址可輕松獲取這些證書。
第2類 - 這些證書要求提供額外的個人信息。
第3類 - 這些證書只有在對請求者的身份進行檢查後才能購買。
第4類 - 它們被需要高度信任的政府和金融機構使用。
CA可以使用第三方注冊機構(RA)對要求證書確認其身份的人或公司進行必要的檢查。 RA可能在客戶端看起來像一個CA,但它們實際上並不簽署發布的證書。
這是發布證書的管理系統,暫時或永久暫停,續訂或撤銷證書。 證書管理系統通常不會刪除證書,因為可能有必要在某個時間點證明其身份,這是出於法律原因。 CA和相關RA運行證書管理系統,以便能夠跟蹤他們的責任。
雖然客戶端的公鑰存儲在證書中,但關聯的私鑰可以存儲在密鑰所有者的計算機上。 這種方法一般不採用。 如果攻擊者能夠訪問計算機,他可以輕松訪問私鑰。 出於這個原因,私鑰存儲在通過密碼保護的安全可移動存儲令牌上。
不同的供應商經常使用不同的專有的存儲格式來存儲密鑰。 例如,Entrust使用專有的.epf格式,而Verisign,GlobalSign和Baltimore使用標準的.p12格式。
1.6 Hierarchy of CA:
由於擁有龐大的網路和全球通信的要求,所有用戶從唯一一個可信的CA獲得證書是不切實際的。其次,只有一個CA的可用性可能會導致大的阻礙,如果CA受到影響。
在這種情況下,層次認證模型很受關注,因為它允許在兩個通信方與相同CA沒有信任關系的環境中使用公鑰證書。
根CA位於CA層次結構的頂部,根CA的證書是自簽名證書。
直接隸屬於根CA(例如,CA1和CA2)的CA具有由根CA簽名的CA證書。
層次結構中下級CA(例如,CA5和CA6)下的CA具有由上級下級CA簽名的CA證書。
證書頒發機構(CA)層次體現在證書鏈中。證書鏈跟蹤從層次結構中的分支到層次結構根的證書路徑。
下圖顯示了具有從實體證書到兩個從屬CA證書(CA6和CA3)到根證書頒發機構CA證書的證書鏈的CA層次結構:
驗證證書鏈是確保特定證書鏈有效,正確簽署和可信的過程。 以下過程驗證證書鏈,從提供驗證的證書開始 -
一個正在驗證其真實性的客戶端提供他的證書,通常連同證書鏈一直到根CA.
驗證者獲取證書並使用發行者的公鑰進行驗證。 發行人的公鑰在發行人的證書中找到,該證書位於客戶證書旁邊的鏈中。
現在,如果已簽署發行人證書的較高的CA由驗證方信任,則驗證成功並在此停止。
否則,發行人證書的驗證方式與客戶在上述步驟中完成的相似。 此過程將繼續進行,直到在其中找到可信的CA,否則它將持續到根CA。
哈希函數非常有用,並且出現在幾乎所有信息安全應用程序中。
哈希函數是將數字輸入值轉換為另一個壓縮數值的 數學函數。 哈希函數的輸入具有任意長度,但輸出始終為固定長度。
哈希函數返回的值稱為消息摘要或簡單的散列值。 下面的圖片說明了哈希函數:
為了成為一個有效的加密工具,哈希函數具有以下屬性:
散列的核心是一個數學函數,該函數在兩個固定大小的數據塊上運行以創建散列碼。 這個哈希函數構成哈希演算法的一部分。
每個數據塊的大小因演算法而異。 通常塊大小從128位到512位。 下圖演示了哈希函數:
哈希演算法涉及上述哈希函數,如分組密碼。 每一輪都會輸入一個固定的大小,通常是最近消息塊和最後一輪輸出的組合。
這個過程重復進行多次,以散列整個消息。 哈希演算法的示意圖如下圖所示:
因為第一消息塊的散列值變成第二散列操作的輸入,其輸出改變第三操作的結果,等等。 這種效應被稱為散列的雪崩效應。雪崩效應對兩個即使是單個數據位也不相同的消息產生明顯不同的散列值。理解哈希函數和演算法之間的區別。 哈希函數通過對兩個固定長度的二進制數據塊進行操作來生成哈希碼。哈希演算法是一個使用哈希函數的過程,指定如何分解消息以及如何將先前消息塊的結果鏈接在一起。
後來在1995年,SHA-1被設計用於糾正SHA-0的所謂弱點。SHA-1是現有SHA哈希函數中使用最廣泛的。它被用於幾個廣泛使用的應用程序和協議,包括安全套接字層(SSL)安全。
2005年,發現了一種在實際時間框架內發現SHA-1沖突的方法,使SHA-1的長期可用性受到懷疑。
SHA-2系列具有四個更進一步的SHA變體,SHA-224,SHA-256,SHA-384和SHA-512,取決於其散列值中的位數。還沒有成功的攻擊報道過SHA-2哈希函數。
雖然SHA-2是一個強大的哈希函數。雖然有很大的不同,但其基本設計仍然遵循SHA-1的設計。因此,NIST要求提供新的競爭性散列函數設計。
2012年10月,NIST選擇Keccak演算法作為新的SHA-3標准。 Keccak提供了許多好處,例如高效的表現和良好的攻擊抵抗力。
該集包括RIPEND,RIPEMD-128和RIPEMD-160。此演算法還有256位和320位版本。
原始的RIPEMD(128位)基於MD4中使用的設計原則,並且發現提供可疑的安全性。 RIPEMD 128位版本是解決原始RIPEMD漏洞的快速修復替代品。
RIPEMD-160是一個改進版本,是使用最廣泛的版本。與RIPEMD-128和RIPEMD-160相比,256和320位版本分別減少了意外沖突的可能性,但沒有更高的安全等級。
Merkle Tree 默克爾樹
哈希演算法的一個重要應用是默克爾樹(Merkle tree),默克爾樹是一種數據結構,通常是一個二叉樹,也有可能是多叉樹,它以特定的方式逐層向上計算,直到頂部,最頂層叫做默克爾根(Merkle Root),默克爾樹最為常見和最簡單的是二叉默克爾樹。