理解以太坊的橢圓曲線簽名

原理

以太坊數(shù)字簽名和比特幣的關(guān)系

以太坊數(shù)字簽名,幾乎完全沿用了比特幣的數(shù)字簽名算法ECDSA-secp256k1。只有哈希的生成方式不一樣嫁乘,這個之后會說疆柔。ECDSA-secp256k1是一種非對稱加密算法。

什么是ECDSA

以太坊數(shù)字簽名算法使用的是橢圓曲線數(shù)字簽名算法刁俭,英文簡稱ECDSA。其中EC是“橢圓曲線”的簡稱,DSA是“數(shù)字簽名算法”的簡稱宛渐。

什么是secp256k1

橢圓曲線算法簡單的說就是用X和Y坐標(biāo)畫一個曲線。這個曲線怎么畫眯搭,需要很多個參數(shù)來確定窥翩。以太坊使用了一套叫secp256k1的參數(shù)確定了橢圓的形狀。所以鳞仙,以太坊的簽名算法全稱就是是ECDSA-secp256k1寇蚊。

什么是非對稱加密

什么是對稱加密,什么是非對稱加密呢棍好?簡單的說仗岸,只有一個密鑰的,就是對稱加密借笙,加密解密用它扒怖。有兩個密鑰的,就是非對稱加密业稼,加密用一個密鑰盗痒,解密用另外一個。相對于對稱加密算法而言低散,非對稱加密優(yōu)點(diǎn)是不需要在網(wǎng)絡(luò)上暴露加密的密鑰俯邓,從機(jī)制上來說更安全;缺點(diǎn)是加密效率比對稱加密低很多谦纱。所以非對稱加密一般只用于諸如數(shù)字簽名這類數(shù)據(jù)量較小的加密運(yùn)算看成。

常見的非對稱加密算法除了橢圓加密算法之外,還有著名的RSA跨嘉。橢圓加密相比RSA的區(qū)別是:

  • 橢圓加密的密鑰更短
  • 橢圓加密計算更快而安全性相當(dāng)
  • RSA的私鑰和公鑰是何以互換加解密的川慌,但橢圓加密只能私鑰加密公鑰解密吃嘿。

私鑰

以太坊的私鑰是一個32字節(jié)的數(shù),取值范圍從1~0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140梦重。這個數(shù)可以由偽隨機(jī)算法(PRNG)產(chǎn)生兑燥。其實0也是一個合法的私鑰,只不過這是一個特殊私鑰琴拧,以太坊的創(chuàng)世區(qū)塊就是這個私鑰生成的降瞳。

公鑰

以太坊的非壓縮公鑰是一個65字節(jié)的數(shù),這個是繼承至比特幣的蚓胸。但以太坊只使用了其中64個字節(jié)挣饥,有一個字節(jié)這64個字節(jié)中,32字節(jié)表示橢圓曲線的X坐標(biāo)沛膳,32字節(jié)表示橢圓曲線的Y坐標(biāo)扔枫。這個XY坐標(biāo)是私鑰通過ECDSA-secp256k1推導(dǎo)出來的。所以說锹安,橢圓曲線算法的公鑰是通過私鑰計算出來的短荐。而反過來,用公鑰推導(dǎo)私鑰叹哭,以現(xiàn)有計算機(jī)的計算幾乎是不可能的忍宋,這也是以太坊和比特幣存在的基礎(chǔ)。如果哪天計算機(jī)技術(shù)出現(xiàn)大飛躍风罩,比如量子計算機(jī)普及糠排,現(xiàn)有鏈上所有賬戶的私鑰都會曝光。當(dāng)然超升,區(qū)塊鏈技術(shù)本身也會一定會持續(xù)演進(jìn)的乳讥。

哈希

哈希,也可以形象的叫做“摘要”廓俭。就是無論消息有多大,都可以生成一個固定長度的“摘要”唉工,這個“摘要”可以用來校驗消息是否被篡改研乒。只要消息被修改了一個字節(jié),“摘要”的校驗就會失敗淋硝。

比特幣的哈希算法使用的是SHA2-256雹熬。相對于SHA1,SHA2只是擴(kuò)展了哈希的字節(jié)數(shù)而已谣膳。目前SHA1已經(jīng)被攻破竿报,SHA2被攻破只是時間問題。

以太坊的哈希算法采用的是全新的SHA3-256继谚。和SHA1烈菌,SHA2不一樣,SHA3并不是單純擴(kuò)展字節(jié)數(shù),而是采用了新的Keccak算法芽世。同樣字節(jié)寬度的SHA3比SHA2更安全挚赊。

地址

以太坊的地址是公鑰經(jīng)過一系列哈希和變換,在經(jīng)由Base58編碼生成的字符串济瓢。過程不述荠割。Base58編碼和Base64差不多,都是使用“”可讀符號“來表示二進(jìn)制數(shù)據(jù)旺矾,Base58相對Base64移除了一些容易產(chǎn)生視覺混淆的字母和數(shù)字蔑鹦。

簽名

簽名其實就是用私鑰對消息的哈希進(jìn)行加密。當(dāng)一個以太坊節(jié)點(diǎn)向另一個節(jié)點(diǎn)發(fā)送消息時箕宙,會用自己的私鑰將消息的哈希做簽名嚎朽,然后吧簽名和消息本身發(fā)送給對方。

過程如圖:


image.png

校驗簽名

節(jié)點(diǎn)收到對方發(fā)來的消息和簽名后扒吁,會先做一個“recover”的動作火鼻,用消息和簽名推導(dǎo)出對方的公鑰。再通過公鑰雕崩,簽名魁索,消息的哈希值計算出一個叫“r”的值,這個r是簽名的一部分盼铁,校驗簽名就是拿計算出來的r和簽名中攜帶的r經(jīng)行對比粗蔚,如果一致就校驗通過。

過程如圖:


image.png

代碼實現(xiàn)

以太坊項目geth有兩套ECDSA-secp256p1的實現(xiàn)饶火。一套是純go的鹏控,一套是基于C庫的。底層算法都不是以太坊開發(fā)人員寫的肤寝,采用的是開源世界的拿來主義当辐。

go實現(xiàn)

接口源碼在crypto/signature_nocgo.go。這個文件只是一個wrapper鲤看,真實的實現(xiàn)調(diào)用了一個第三方的比特幣的go項目缘揪,源碼在vendor//github.com/bitcsuite/bitcd。

C實現(xiàn)

接口源碼在crypto/signature_cgo.go义桂。這也是一個wrapper找筝,再往下調(diào)用的是crypto/secp256k1/。這個還是wrapper慷吊,再往下是比特幣C語言項目的libsecp256k1庫袖裕。

API及其功能

signature_nocgo.go和signature_cgo.go的接口是一樣的,具體如下:

//通過消息的哈希和簽名恢復(fù)公鑰
func Ecrecover(hash, sig []byte) ([]byte, error) {}

//通過哈希和私鑰計算ECDSA簽名
func Sign(hash []byte, prv *ecdsa.PrivateKey) {}

//通過公鑰溉瓶,哈希校驗簽名
func VerifySignature(pubkey, hash, signature []byte) bool {}

//將33字節(jié)的公鑰解壓成65字節(jié)公鑰
func DecompressPubkey(pubkey []byte) (*ecdsa.PublicKey, error) {}

//將65字節(jié)非壓縮公鑰壓縮稱33字節(jié)壓縮公鑰
func CompressPubkey(pubkey *ecdsa.PublicKey) {}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末急鳄,一起剝皮案震驚了整個濱河市谤民,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌攒岛,老刑警劉巖赖临,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異灾锯,居然都是意外死亡兢榨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門顺饮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吵聪,“玉大人,你說我怎么就攤上這事兼雄∫魇牛” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵赦肋,是天一觀的道長块攒。 經(jīng)常有香客問我,道長佃乘,這世上最難降的妖魔是什么囱井? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮趣避,結(jié)果婚禮上庞呕,老公的妹妹穿的比我還像新娘。我一直安慰自己程帕,他們只是感情好住练,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著愁拭,像睡著了一般讲逛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岭埠,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天妆绞,我揣著相機(jī)與錄音,去河邊找鬼枫攀。 笑死,一個胖子當(dāng)著我的面吹牛株茶,可吹牛的內(nèi)容都是我干的来涨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼启盛,長吁一口氣:“原來是場噩夢啊……” “哼蹦掐!你這毒婦竟也來了技羔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤卧抗,失蹤者是張志新(化名)和其女友劉穎藤滥,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體社裆,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拙绊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了泳秀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片标沪。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嗜傅,靈堂內(nèi)的尸體忽然破棺而出金句,到底是詐尸還是另有隱情,我是刑警寧澤吕嘀,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布违寞,位于F島的核電站,受9級特大地震影響偶房,放射性物質(zhì)發(fā)生泄漏趁曼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一蝴悉、第九天 我趴在偏房一處隱蔽的房頂上張望彰阴。 院中可真熱鬧,春花似錦拍冠、人聲如沸尿这。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽射众。三九已至,卻和暖如春晃财,著一層夾襖步出監(jiān)牢的瞬間叨橱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工断盛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留罗洗,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓钢猛,卻偏偏與公主長得像伙菜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子命迈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 以太坊(Ethereum ):下一代智能合約和去中心化應(yīng)用平臺 翻譯:巨蟹 贩绕、少平 譯者注:中文讀者可以到以太坊愛...
    車圣閱讀 3,755評論 1 7
  • 以太坊白皮書地址:https://github.com/ethereum/wiki/wiki/White-Pape...
    rectinajh閱讀 17,823評論 0 46
  • 【中文版】以太坊白皮書 翻譯:少平火的、 Seven當(dāng)中本聰在 2009 年 1 月啟動比特幣區(qū)塊鏈時,他同時向世界引...
    __Seven__閱讀 4,209評論 0 10
  • 放學(xué)了淑倾,明天是周未馏鹤,我很開心,可是令人生氣的是——作業(yè)多的很呀娇哆! 周五回來湃累,我沒有寫作業(yè),我寫了今天...
    請你吃辣條520閱讀 187評論 0 2
  • 歐洲殖民地持續(xù)了數(shù)個世紀(jì)迂尝。那些移民冒著生命危險脱茉,換取自由和財產(chǎn)。許多人因此死去垄开,而那些成功的人琴许,則創(chuàng)立了新的家園。...
    kafkaliu閱讀 202評論 0 0