KCoin項目的非白皮書
832
2022-05-29
今天我們聊一聊區(qū)塊鏈的核心技術(shù)密碼學,區(qū)塊鏈技術(shù)離不開密碼學,可以說密碼學是區(qū)塊鏈系統(tǒng)的基石之一,我們先來了解一下。
這是以太坊黃皮書關(guān)于錢包(私鑰、公鑰、地址)的描述,僅僅 2 行文字。主要講解私鑰通過 ECDSA(橢圓曲線簽名算法)推導出公鑰,繼而經(jīng)過 Keccak 單向散列函數(shù)推導出地址。分解為 3 個步驟:
1. 創(chuàng)建隨機私鑰 (64 位 16 進制字符 / 256 比特 / 32 字節(jié))
2. 從私鑰推導出公鑰 (128 位 16 進制字符 / 512 比特 / 64 字節(jié))
3. 從公鑰推導出地址 (40 位 16 進制字符 / 160 比特 / 20 字節(jié))
這是從ethereumjs/keythereum中剝離出來的 JavaScript 代碼,關(guān)于黃皮書上的公式的具體實現(xiàn),僅僅 6 行代碼。
這是一件很奇妙的事情,2 行文字,6 行代碼承載著億萬級別的資產(chǎn),但往往越簡單,越奧妙。以上的 6 行代碼,就已經(jīng)囊括密碼學中大多數(shù)技術(shù),比如隨機數(shù)生成器、非對稱加密,單向散列函數(shù)等。
什么是隨機數(shù)生成器?
隨機數(shù)用于生成私鑰,若隨機數(shù)可以被預測或重現(xiàn),則私鑰就會立刻形同虛設。所以保證隨機數(shù)擁有下列三項特征,至關(guān)重要:
1.隨機性:不存在統(tǒng)計學偏差,完全雜亂的數(shù)列
2.不可預測性:不能從過去的數(shù)列推測下一個出現(xiàn)的數(shù)
3.不可重現(xiàn)性:除非將數(shù)列保存下來,否則不能重現(xiàn)相同的數(shù)列
軟件本身是無法生成具有不可重現(xiàn)性的隨機數(shù),因為運行軟件的計算機本身僅具備有限的內(nèi)部狀態(tài)。所以通過確定性的代碼,在周期足夠長的情況下,必然會出現(xiàn)相同的隨機數(shù)。因此要生成具備不可重現(xiàn)性的隨機數(shù),需要從不確定的物理現(xiàn)象中獲取信息,比如周圍溫度、環(huán)境噪音、鼠標移動,鍵盤輸入間隔等。
在 Linux 內(nèi)核中維護了一個熵(shāng)池用來收集來自設備驅(qū)動程序和其它來源的環(huán)境噪音。熵(entropy)是描述系統(tǒng)混亂無序程度的物理量,一個系統(tǒng)的熵越大則說明該系統(tǒng)的有序性越差,即不確定性越大。
所以在選擇生成私鑰的隨機數(shù)方法時,需要選擇滿足密碼學強度的隨機數(shù)方法,比如 Node 中的 crypto.randomBytes。當你調(diào)用 crypto.randomBytes(32) 方法時,它會等待熵池搜集足夠的信息后,返回 64 位的隨機數(shù),即私鑰。
const?privateKey?=?crypto.randomBytes(32)privateKey.toString('hex'):?ea4692a11d962b249f8f0439d642a9013a1a08807649311d3672886d72d1fe51
什么是非對稱加密?
在非對稱加密中,將密鑰分為加密密鑰和解密密鑰,也就是我們常說的公鑰和私鑰。公鑰和私鑰一一對應,由公鑰加密的密文,必須使用公鑰配對的私鑰才可以解密。
當我們調(diào)用 secp256k1.publicKeyCreate?獲得公鑰時,實際使用的是非對稱加密中的橢圓曲線算法。通過該算法可以從私鑰推導出公鑰,這是一個不可逆的過程:K = k * G。給出常數(shù)點 G 時,使用已知私鑰 k 求公鑰 K 的問題并不困難,但反過來,已知公鑰 K 求私鑰 k,則非常困難。這就是橢圓曲線算法上的離散對數(shù)問題,也是為什么你可以分享地址(或公鑰)給別人,但不能暴露自己的私鑰。
const?publicKey?=?secp256k1.publicKeyCreate(privateKey,?false).slice(1)?publicKey.toString('hex'):??1e3f1532e3285b02...45d91a36a8d78cb6bef8
為了形象的表現(xiàn)橢圓曲線算法如何將私鑰推導出公鑰,我們將使用簡單的整數(shù)作為私鑰 k,找到公鑰 K = k * G,也就是 G 相加 k 次(數(shù)學原理一致)。在橢圓曲線中, 點的相加等同于從該點畫切線找到與曲線相交的另?點, 然后映射到 x 軸。下圖展示了從曲線上獲得 G、2G、4G、8G 的幾何操作。
什么是哈希算法?
密碼學技術(shù),也稱散列函數(shù),原理是把任意長度的輸入通過哈希算法,變換成固定長度的由字母和數(shù)字組成的輸出,如:錢包的地址、交易地址都是通過哈希算法運算出來的。
作為加密算法的一種,散列函數(shù)是一種單向密碼體制,對于給定的哈希值,無法推倒輸入的原始數(shù)據(jù),具有不可逆性,這也是哈希算法安全性的重要基礎。
目前,哈希算法主要有兩類:MD系列和SHA系列。MD(Message Digest,消息摘要)系列包含MD4、MD5、HAVAL等,SHA(Secure Hash Algorithm,安全散列算法)系列包含SHA1、SHA256等。其中MD5是密碼學專家R.L.Rivest設計,SHA是美國算法制定機構(gòu)設計。
當我們調(diào)用 createKeccakHash("keccak256")?方法時,Keccak 使用海綿函數(shù),對公鑰與初始的內(nèi)部狀態(tài)做 XOR 運算得到 32 字節(jié)散列值,取其后 20 字節(jié),轉(zhuǎn)成 40 位的 16 進制字符,即為地址。
const?address?=?createKeccakHash("keccak256").update(publicKey).digest().slice(-20)?address.toString("hex"):?7a48ac1bf3943b2ca7a4ca4999cbcbb0e999950c
什么是區(qū)塊鏈哈希?
在區(qū)塊鏈系統(tǒng)中,構(gòu)建交易數(shù)據(jù)對應的Merkle樹,計算得到Merkle樹根節(jié)點的區(qū)塊鏈哈希值,區(qū)塊鏈的哈希值能夠唯一而精準地標識一個區(qū)塊,區(qū)塊鏈中任意節(jié)點通過簡單的哈希計算都接獲得這個區(qū)塊的哈希值,計算出的哈希值沒有變化也就意味著區(qū)塊鏈中的信息沒有被篡改。
Merkle樹在數(shù)字貨幣、零知識證明、文件完整性校驗等領(lǐng)域有廣泛的應用,如:比特幣以太坊系統(tǒng)利用Merkle proofs來存儲每個區(qū)塊的交易,Git也是通過Merkle樹來進行完整性校驗。比特幣簡化支付驗證SPV(Simplified Payment Verification)也是使用此方式進行驗證支付。
Merkle樹是Ralph Merkle于1979提出,是一種哈希二叉樹,在計算機科學中,二叉樹是每個節(jié)點最多有兩個子樹的樹結(jié)構(gòu),每個節(jié)點代表一條結(jié)構(gòu)化數(shù)據(jù)。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。二叉樹常被用于實現(xiàn)數(shù)據(jù)快速查詢,是散列列表和散列鏈的泛化。
在線體驗哈希算法:http://www.kjson.com/encrypt/hash/?fm=map
數(shù)據(jù)加密服務 區(qū)塊鏈
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。