比特幣源碼研讀之公鑰篇

這是我的第六篇研讀記錄,每天擠一點(diǎn)時(shí)間邊學(xué)邊寫(xiě),歡迎大家拍磚。

公鑰

1、公鑰的生成

公鑰通過(guò)私鑰與橢圓曲線相乘而得,公式為

K=k*G

k:是私鑰

G:稱為生成點(diǎn)的常數(shù)點(diǎn)(坐標(biāo)點(diǎn))

K:所得的公鑰

上述公式并不是一個(gè)簡(jiǎn)單的乘法運(yùn)算,而是一個(gè)幾何運(yùn)算,涉及到一個(gè)橢圓曲線運(yùn)算

2、橢圓曲線

橢圓曲線源于橢圓弧長(zhǎng)的,橢圓積分的反函數(shù)。比特幣中的橢圓曲線是用美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)設(shè)立的secp256K1標(biāo)準(zhǔn)。公式:y2modp=(X3+7)modp

其坐標(biāo)范圍(0,1.158x10^77-1),與之前的私鑰空間范圍相同。

3、橢圓曲線坐標(biāo)

由于x、y限定范圍非常大,導(dǎo)致整個(gè)數(shù)值也非常大,又因?yàn)樗请x散的,所以要找到相同點(diǎn)非常難。在secp256k1的標(biāo)準(zhǔn)下它的坐標(biāo)值非常大,無(wú)法用我們所知的個(gè)十百千萬(wàn)來(lái)描述,它的源碼位于src/secp256k1,包含了私鑰與地址相關(guān)的函數(shù),主要功能是實(shí)現(xiàn)比特幣密鑰與地址的計(jì)算,包括:簽名、驗(yàn)證、密鑰的生成等

4、橢圓曲線幾何算法

K=k*G并不是一個(gè)簡(jiǎn)單的乘法運(yùn)算,而是一個(gè)幾何運(yùn)算。簡(jiǎn)單介紹一下兩種情況的坐標(biāo)值:

1)兩個(gè)不同點(diǎn)坐標(biāo)值:P+Q=R

P+Q表示為P和Q的連線,R表示連線與整個(gè)橢圓曲線的焦點(diǎn),然后對(duì)焦點(diǎn)進(jìn)行X取反得“-R”,得到一個(gè)坐標(biāo)值,即公鑰值。K=k*G,k*G表示k個(gè)G在橢圓曲線上的相加,G是常量,要想得到不同的公鑰,只有k(私鑰)不同才能保證公鑰的不同

2)兩個(gè)相同點(diǎn)坐標(biāo)值:P+P=2P

P+P表示為兩個(gè)點(diǎn)在同一位置,那如何計(jì)算呢?以P點(diǎn)作橢圓曲線的切線,對(duì)曲線的焦點(diǎn)進(jìn)行x取反,得到相應(yīng)的坐標(biāo)值,即公鑰值。

綜上所述,以G為起點(diǎn)做相加處理,以切線計(jì)算與橢圓曲線交點(diǎn)取反,再加上下一個(gè)G,循環(huán)往復(fù)計(jì)算形成一種無(wú)序的狀態(tài),從而得到需要的公鑰值(x.y)坐標(biāo)。

5、壓縮公鑰

當(dāng)我們得到相應(yīng)的坐標(biāo)值,我們就能得到我們需要的公鑰值。首先把x.y進(jìn)行組合,并在組合后的公鑰前加上04作為前綴,這樣就形成了“04xy”公鑰值(稱為未壓縮公鑰),由于未壓縮公鑰值占比內(nèi)存較大(512位),需要對(duì)其進(jìn)行壓縮、以減少存儲(chǔ)壓力。那怎么實(shí)現(xiàn)呢?

一方面由于y的坐標(biāo)值可以通過(guò)x推導(dǎo)出來(lái),所以y值的信息沒(méi)必要存儲(chǔ),可以節(jié)省一半的信息量。

另一方面y值有正負(fù)數(shù),所以當(dāng)y為正數(shù)時(shí),公鑰前加02,如:02x;反之在公鑰前加03,如:03x。

當(dāng)公鑰需要的儲(chǔ)存空間變小,這樣就有利于比特幣交易更加完善。

? ? ? ? ? ? ? 區(qū)塊鏈研習(xí)社源碼研讀班方建強(qiáng)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容