導航:首頁 > 以太坊區 > 如何計算以太坊的公鑰

如何計算以太坊的公鑰

發布時間:2024-08-01 19:43:26

⑴ 2048個助記詞,能不能破解一下算完讓我崩潰

 文:財神下山  /  ID:caishen-wdd

這是財神下山的第(6)篇

使用過數字錢包的人,應該都會遇到助記詞,用一句話來解釋助記詞就是: 它是私鑰的明文顯示。

意如其名,幫助你記憶私鑰的單詞。因為,一串長長的字元總沒有幾個單詞好記憶。

在寫完《比特幣里的私鑰,公鑰,地址是如何產生的?》文章後,其實財神還是有點迷惑的,就是當時在寫助記詞的時候,只是順帶一句話,並不知道它的真實產生過程。

好在,最近又看了精通以太坊這本書的介紹。

回顧一下私鑰空間,比特幣,以太坊的私人密鑰空間的大小(2^256)是一個難以置信的大數目。十進制大約是10^77。可見宇宙估計含有10^80原子。

要從這么大的空間里找到一個私鑰,它剛好是V神的錢包,這概率……比大海撈針,而且是不能藉助任何工具,還難。

後來,財神了解到,所有的助記詞字典,其實只有2048個單詞。

通過下面這個連接就可以訪問:

https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt

今天,學一學助記詞是怎麼計算出來的。

教學開始!

1. 先從熵開始,熵的長度是32的整數倍,分別為 128, 160, 192, 224, 256,也就是我們私鑰的長度。

2. 熵的長度再加上校驗和的長度。為熵的長度/32 位, 所以校驗和長度可為 4,5,6,7,8 位;

3. 一共有2048個助記詞,用二進製表示的話需要11位。 2的11次方等於2048。所以,上面助記詞的個數分別是12,15,18,21,24。

例如: 128位的熵,加上 4位校驗和,等於132位長度的二進制,每11個切割成一組,那需要12組。

(128+4)/11 =12, 也即128長度的熵需要12個助記詞

(256+8)/11 =24, 也即256長度的熵需要24個助記詞

畫張流程圖就是

每個單詞有唯一一個碼,好了,上面就是助記詞生成的整個過程。

12個助記詞安全嗎?

我們的錢包只有12-24個單詞,從表面看上去,假如全球用戶的所有帳戶加起來有10億個錢包,那我從2048個字典里隨機挑出12個單詞,這個好像有機會瞎貓碰到死耗子一樣,再不行,我拿計算機一直嘗試12個單詞的隨機組合,然後看看是不是一個錢包的私鑰……

哈哈……哈哈……

直到財神求值了一下……不算不知道,一算嚇我一跳。

下面分別是2個單詞 到 24個單詞的隨機組合個數,到第4個單詞時已經17萬億了,再往上就不知道怎麼讀了。

  4194304

  8589934592

  17592186044416

  36028797018963968

  73786976294838206464

  151115727451828646838272

  309485009821345068724781056

 

 

 

  (已經40位數了,除以10億,還有31位)

繼續13個單詞

 

 

 

 

 

 

 

 

 

 104

 1204992

 1187823616

真相竟然那麼殘酷,啥也不要想了,還是好好研究搬磚吧。

參考資料: 《精通以太坊》,初學者,如有疏略,還請指教。

如果這篇文章對你有幫助,

就分享給朋友吧!

⑵ 什麼是公鑰、私鑰、密碼、助記詞、Keystore

公鑰、私鑰、密碼、助記詞、Keystore是在使用數字貨幣錢包時,必須要弄清的概念:如果不搞清楚,很可能會造成數字資產的嚴重損失。

1.公鑰:

相當於所屬錢包的地址,可理解成銀行賬戶。

公鑰的地址可理解成銀行卡號,是由公鑰通過計算得來,就像銀行先給你開戶,後給你銀行卡卡號。

錢包地址的主要用途是收款,也可以作為轉賬的憑證,就像別人匯款給你時你需要告訴他銀行卡卡號一樣。

常見的錢包地址樣式:

比特幣:普通地址:1開頭、隔離見證地址:3開頭

以太坊地址:0x開頭:(包括基於以太坊平台代幣)瑞波幣地址:r開頭。

萊特幣地址:L開頭。

2.私鑰:

非常重要,相當於銀行卡號+銀行卡密碼。

創建錢包後,輸入密碼即可導出私鑰。私鑰是由字母數字組成的字元串,一個錢包地址只有一個私鑰且不能修改。私鑰要離線保存,不要進行網路傳輸,可用紙張記錄並保存。

主要用途,導入錢包。有了私鑰就可以在同系列的任何一款錢包上,輸入私鑰並設置一個新的密碼就可以把之前的A錢包的資產導入B錢包。比如手機丟了,只要你有私鑰就可以恢復。

3.密碼 :

相當於銀行卡密碼。

在創建數字貨幣錢包時,需要設置一個密碼,一般要求不少於8個字元。

主要用途:①轉賬時需要輸入密碼,可理解成你用銀行卡給別人轉賬需要輸入密碼;②用Keystore導入錢包時,必須輸入這個密碼。

密碼可以進行修改或重置。輸入原密碼後,就可以直接修改新的密碼了;但如果原密碼忘記,可以用私鑰或是助記詞導入錢包,同時設置新的密碼。數字貨幣錢包中,一個錢包在不同手機上可以用不同的密碼,彼此相互獨立,互不影響。

4.助記詞

等於私鑰=銀行卡號+銀行卡密碼

由於私鑰由64位字元串組成,不便於記錄,非常容易抄錯,於是就出現了助記詞,方便用戶記憶和記錄。由12個單片語成,每個單詞之間有一個空格,助記詞和私鑰具有同樣的功能:只要輸入助記詞並設置一個新的密碼,就可以導入錢包。

一個錢包只有一套助記詞且不能修改。助記詞只能備份一次,備份後,在錢包中便不會再顯示。因此,在備份時一定要抄寫下來,防止抄寫錯誤,盡量多次檢驗。

5.Keystore:

Keystore+密碼=私鑰=銀行卡號+銀行卡密碼、Keystore ≠ 銀行卡號

Keystore相當於加密過後的私鑰,在導入錢包時,只要輸入Keystore 和密碼,就能進入錢包了。這一點和用私鑰或助記詞導入錢包不一樣,後兩者不需要知道原密碼,而是直接重置密碼。

keystore進行交易轉賬等錢包操作,必須知道該keystore的密碼。keystore的密碼是無法更改的,一個keystore對應一個密碼。但是可以通過該錢包的助記詞,重新生成一個keystore。這個keystore可以用新的密碼生成,重新生成新的keystore之後,最好將舊的keystore刪除。

總結:

一個數字貨幣錢包創建完成後,公鑰和私鑰是成對出現的。公鑰,私鑰都是由字母,數字組成的較長的字元串。

keystore和助記詞可以理解為私鑰的另一種表現形式。助記詞作為錢包私鑰的友好格式,非常方便備份和導入。

地址可以通過私鑰、助記詞、keystore+密碼,導入錢包找回。密碼可以通過私鑰、助記詞,導入錢包重置密碼。如果私鑰、助記詞、Keystore+密碼,有一個信息泄漏,別人就可以擁有你錢包的控制權,錢包內的幣就會被別人轉移走。

私鑰通過加密生成公鑰,公鑰轉換一下格式生成地址。私鑰可以推導出公鑰,公鑰可以推導出地址,但無法通過輸出地址、公鑰推導出私鑰。

在生活中,銀行開戶是「開設銀行賬戶—銀行卡號—設置銀行卡密碼—開戶成功

在幣圈裡,是先設置「密碼」(私鑰),再得到「銀行賬戶」(公鑰),最後給地址。對於錢包安全管理,主要注意防盜和防丟。防止私鑰泄露及丟失。

注意事項:

1.關於各種騙局誘導交出私鑰、助記詞的行為,都要謹慎操作;

2.重視私鑰、助記詞、Keystore+密碼的備份和保存!多重備份,多次備份,多重驗證,防止抄寫錯誤。

3.私鑰不好備份的情況下,可選用備份助記詞,具體根據錢包的備份要求。

4.不要進行聯網備份,或通過微信、qq、郵箱等任何第三方工具進行傳輸發送你的私鑰、助記詞、keystore。不要截圖。

5.備份內容放到安全、妥善的地方,並告訴家人(以防突發事故發生)

數字貨幣錢包的作用是安全存儲資產,這是最重要的!從投資紀律來講,本金安全是一切的基礎。對於理財類的錢包,聲稱賺取收益高回報等,應該叫「數字資產理財」更恰當。你的資產他們可以隨意動用拿去投資。你對資產沒有完全的掌控權,如果投資順利,本息安全,如果投資失敗,血本無歸。所以,請慎重使用這類錢包,應該注重的是資產的安全和私密性。

⑶ 【以太坊易錯概念】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

⑷ 以太坊怎麼根據地址獲取私鑰

安裝metamask metamask是可以安裝在瀏覽器上的擴展程序,可以在進行安裝。建議在安裝在虛擬機中
以太坊的私鑰生成是通過secp256k1橢圓曲線演算法生成的,secp256k1是一個橢圓曲線演算法,同比特幣。公鑰推導地址和比特幣相比,在私鑰生成公鑰這一步其實是一樣的,區別在公鑰推導地
以太坊錢包地址就是你的銀行卡號,倘若你把地址忘了,可以用私鑰、助記詞、keystore+密碼,導入錢包找回。首先注冊登錄bitz,找到資產下面的以太坊,點擊充值,這時候就能獲取充值地址了。然後把錢包里的以太坊直接充到這個地址就行了。

⑸ 浠ュお鍧婂備綍淇濇姢鐢ㄦ埛闅愮


浠ュお鍧婏細鍦ㄥ尯鍧楅摼鏃朵唬淇濇姢鐢ㄦ埛闅愮佺殑鍧氬疄澹佸瀿錛
闅忕潃鍖哄潡閾炬妧鏈鐨勫彂灞曚笌搴旂敤錛屼漢浠瀵逛簬鍖哄潡閾炬椂浠g殑闅愮佷繚鎶ら棶棰樿秺鏉ヨ秺鍏蟲敞銆備互澶鍧婁綔涓虹洰鍓嶆渶鍏堣繘鐨勬櫤鑳藉悎綰﹀鉤鍙幫紝鍏朵繚鎶ょ敤鎴烽殣縐佺殑鑳藉姏緇濆逛笉瀹瑰皬瑙戙
棣栧厛錛屼互澶鍧婇噰鐢ㄤ簡鍏閽ュ瘑鐮佸︽潵淇濇姢鐢ㄦ埛鐨勯殣縐併傛瘡涓浠ュお鍧婄敤鎴烽兘鏈夎嚜宸辯殑鍏閽ュ拰縐侀掗錛屽湪浜ゆ槗鏃訛紝鐢ㄦ埛鍙浠ョ敤縐侀掗瀵逛氦鏄撲俊鎮榪涜岀懼悕錛屽啀鐢ㄥ叕閽ヨ繘琛岄獙璇併傝繖縐嶆満鍒朵繚璇佷簡浜ゆ槗鐨勫彲闈犳у拰瀹夊叏鎬э紝騫朵笖闃叉浜嗗叾浠栫敤鎴峰逛簬鐢ㄦ埛浜ゆ槗淇℃伅鐨勭ユ帰鍜岀℃敼銆
鍏舵★紝浠ュお鍧婂鉤鍙拌繕閲囩敤浜哯ero-Knowledge璇佹槑鍗忚銆傝繖縐嶅崗璁浣垮緱鐢ㄦ埛鍙浠ュ湪涓嶆硠闇茶嚜宸遍殣縐佺殑鎯呭喌涓嬭繘琛屼氦鏄撳拰楠岃瘉錛屼繚鎶や簡鐢ㄦ埛鐨勯殣縐佸拰涓浜轟俊鎮銆俍ero-Knowledge璇佹槑鍗忚鐨勮繍鐢ㄤ嬌寰椾氦鏄撲俊鎮瀵逛簬騫沖彴浠ュ栫殑浜虹兢鏄涓嶅彲瑙佺殑錛屼粠鑰屾瀬澶у湴鎻愬崌浜嗕互澶鍧婂鉤鍙扮殑闅愮佷繚鎶よ兘鍔涖
鏈鍚庯紝浠ュお鍧婇氳繃寤虹珛鏅鴻兘鍚堢害鏉ヤ繚闅滅敤鎴烽殣縐併傛櫤鑳藉悎綰︽槸涓縐嶉毦浠ヤ慨鏀廣佽嚜鍔ㄦ墽琛岀殑鍚堢害錛屽彲浠ュ畬鍏ㄩ伩鍏嶄氦鏄撳弻鏂逛箣澶栫殑浜哄共鎵頒氦鏄撱備互澶鍧婂鉤鍙頒笂鐨勬櫤鑳藉悎綰︿笉浠呬繚璇佷簡浜ゆ槗淇℃伅鐨勫彲闈犳у拰瀹夊叏鎬э紝鍚屾椂涔熶嬌寰楃敤鎴風殑淇℃伅寰楀埌浜嗗畬緹庣殑淇濋殰銆
鎬諱箣錛屼互澶鍧婂鉤鍙頒負浜嗕繚鎶ょ敤鎴風殑闅愮侊紝鋙嶅叆浜嗗氱嶅畨鍏ㄤ繚闅滄妧鏈錛屽寘鎷鍏閽ュ瘑鐮佸︺乑ero-Knowledge璇佹槑鍗忚銆佷互鍙婃櫤鑳藉悎綰︾瓑錛屽緩絝嬩簡瀹屽囩殑瀹夊叏榪愯惀浣撶郴錛屾槸褰撳墠鏈鍏鋒湁闅愮佷繚鎶よ兘鍔涚殑鏅鴻兘鍚堢害騫沖彴涔嬩竴銆傛湭鏉ワ紝闅忕潃浠ュお鍧婃妧鏈鐨勪笉鏂鍙戝睍錛屽畠鐨勯殣縐佷繚鎶よ兘鍔涗篃灝嗗緱鍒拌繘涓姝ュ畬鍠勶紝璁╃敤鎴峰湪瀹夊叏銆佸彲闈犲湴浣跨敤騫沖彴鐨勫悓鏃朵韓鍙楀埌楂樿川閲忋佸畬緹庣殑縐佸瘑浣撻獙銆

⑹ 一步一步教你使用以太坊錢包

下面開始介紹myetherwallet

記住,這個錢包只支持如下幾種

ETH、ETC、和符合ERC20協議的token,

其他 不支持的幣不要轉進來(轉進來會丟失)

瀏覽器打開網站:

https://www.myetherwallet.com

在頁面右上角選擇你喜歡的語言,如下圖所示

第一步 創建錢包

輸入密碼(至少9位)

下載keystore文件(這里保存你的公鑰和私鑰)

保存你的私鑰

初次解鎖錢包(建議一定要多試下第二步,不要立馬就轉幣進去,否則有可能你沒記住密碼或者keystore沒放好,多試幾次可以讓你更加熟悉)

一般初次點擊解鎖之後,頁面可能不刷新,直接滑鼠往下滾下來就看到你的錢包信息了

第二步 查看錢包信息

當你完成了第一步,錢包就已經建好了。

這一步只是教你平時怎麼打開錢包看看裡面的余額之類的

你的ETH的余額和交易歷史

你的所有代幣token的余額和交易歷史

第三步 接收和發送ETH及其他token代幣

接收ETH和其他的代幣token(這個錢包所支持的,點擊show all tokens看所有支持的代幣)

都用同一個地址即可,不需要任何額外的標記或操作

點擊左上角 發送以太幣/發送代幣,選擇keystoreFile,

上傳keystore文件,填寫密碼,解鎖賬號

3.發送給別人ETH或代幣的時候,你就要輸入對方對應的ETH地址或代幣地址,不要填錯,

比如你要發送到你的交易平台,如果發送EOS,這里就要放你交易平台的EOS的充值地址,

而不是放ETH充值地址,當然你還需要在下面這個下拉菜單這里選擇一下相應的代幣類型,

比如EOS

⑺ 2.在以太坊中,為了得到唯一的公鑰,對私鑰應用哪種演算法

在以太坊中,為了得到唯一的公鑰,對私鑰應用演算法:
1、生成一個隨機的私鑰(32位元組)。
2、通過私鑰生成公鑰(64位元組)。
3、通過公鑰得到地址(20位元組)。

⑻ 【深度知識】區塊鏈之加密原理圖示(加密,簽名)

先放一張以太坊的架構圖:

在學習的過程中主要是採用單個模塊了學習了解的,包括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的整個的加密,認證,簽名模型如下:

閱讀全文

與如何計算以太坊的公鑰相關的資料

熱點內容
空中比特幣新系統 瀏覽:173
比特幣交易是用什麼貨幣 瀏覽:146
以太坊中國央行 瀏覽:963
比特幣與央行數字貨幣的區別 瀏覽:710
學虛擬貨幣的感想 瀏覽:688
英國數字貨幣項目 瀏覽:588
與比特幣對沖 瀏覽:193
啟迪區塊鏈成都市錦江區 瀏覽:20
購買的比特幣放哪裡 瀏覽:368
美聯儲主席對比特幣 瀏覽:890
一般顯卡的算力是多少錢一個 瀏覽:609
玩btc國家排行榜 瀏覽:125
中國承認以太坊么 瀏覽:918
中國比特幣硬分叉 瀏覽:793
中國挖比特幣公司 瀏覽:267
期貨交易所可以買比特幣嗎 瀏覽:641
那些股票屬區塊鏈 瀏覽:989
螞蟻s7算力板修理手冊 瀏覽:902
dcr最好的礦池 瀏覽:355
比特幣999指數 瀏覽:450