# 8 比特幣的公鑰算法

前面我們一起學(xué)習(xí)了《比特幣的私鑰是怎么產(chǎn)生的》,今天我們再來學(xué)另一個(gè)重要的概念——公鑰。比特幣的公鑰和私鑰是一對秘鑰對挎狸,你用私鑰簽名的交易(transaction),可以通過公開的公鑰進(jìn)行驗(yàn)證断楷,以此保證私鑰不被泄露出去锨匆。這種用一把秘鑰簽名,再用另一把秘鑰對其驗(yàn)證的方式冬筒,被稱作非對稱加密算法恐锣。在比特幣中,這種算法有一個(gè)獨(dú)特的名字——橢圓曲線算法账千,如下圖所示

橢圓曲線

橢圓曲線的定義非常簡單侥蒙,滿足下面公式的所有 (x,y) 坐標(biāo)的集合,就是我們所說的橢圓曲線

y^2 \mod{p} = (x^3+7)\mod{p}

上面公式中匀奏,\mod{} 是取余符號鞭衩,而 ?p 是一個(gè)很大的素?cái)?shù),到這一步娃善,公式中就只剩下自變量 ?x 和因變量 ?y 了论衍,你完全可以把它看成初中學(xué)過的二元多次函數(shù),不過聚磺,并不是所有實(shí)數(shù) ?x 都滿足這個(gè)曲線坯台,所以實(shí)際上橢圓曲線是一個(gè)散點(diǎn)圖,下圖是當(dāng) ?p 為17時(shí)瘫寝,滿足上述公式的圖形:

spec256k1 橢圓曲線

實(shí)際上蜒蕾,p 取不同的素?cái)?shù),橢圓曲線會呈現(xiàn)出完全不同的形態(tài)焕阿,p 越大咪啡,這個(gè)橢圓也就越大,可承載的數(shù)值范圍也就越大暮屡,沖突率會降低撤摸,乃至于更安全喳整,所以出于安全性考慮掉冶,比特幣中采用的是一個(gè)特定的橢圓曲線,我們叫它 spec256k1凌蔬,它是由 NIST(National Institute of Standards and Technology)這個(gè)組織確定的莺掠。

剛才說 p 是一個(gè)很大的素?cái)?shù)衫嵌,那么 spec256k1 所選的 p 有多大呢?我們可以看一下

p = 115792089237316195423570985008687907853269984665640564039457584007908834671663

這個(gè) p 可以確定一個(gè)橢圓彻秆,我們再在其中取一個(gè)點(diǎn) (x,y)

x = 55066263022277343669578718895168534326250603453777594175500187360389116729240
y = 32670510020758816978083085130507043184471273380659243275938904335757337482424

把該點(diǎn)中的 xy 帶入上面的公式中渐扮,看等式兩邊是否成立:

Python 2.7.10 (default, Jul 15 2017, 17:16:57)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> x=55066263022277343669578718895168534326250603453777594175500187360389116729240
>>> y=32670510020758816978083085130507043184471273380659243275938904335757337482424
>>> p=115792089237316195423570985008687907853269984665640564039457584007908834671663
>>> (x**3+7)%p - y**2%p
0L

上面是我用 Python 算出的結(jié)果论悴,可以看到時(shí)符合預(yù)期的掖棉。

橢圓曲線運(yùn)算

上面我們已經(jīng)認(rèn)識了橢圓曲線墓律,它看上去很有趣,但我覺得更有趣的是橢圓曲線的運(yùn)算幔亥,公鑰的算法就是運(yùn)用了這些基本運(yùn)算:

  1. 加法運(yùn)算
  2. 無限點(diǎn)(point at infinity)定義
  3. 乘法運(yùn)算

加法

在橢圓曲線上耻讽,任意兩個(gè)點(diǎn)的連線會和曲線上的第三個(gè)點(diǎn)相交,如果前兩個(gè)點(diǎn)重合帕棉,那么這條線為該點(diǎn)上的切線针肥,有了這個(gè)條件后,我們就可以定義橢圓曲線的加法操作了

橢圓曲線上香伴,任意兩點(diǎn) P1P2 相加慰枕,等于曲線上另外一個(gè)點(diǎn) P ,設(shè) P1P2 的連線(或切線)與曲線上相交的點(diǎn)為 P'即纲,則 PP' 關(guān)于 x 軸對稱具帮。

接下來我們舉個(gè)例子,假設(shè)橢圓曲線上有一個(gè)點(diǎn) P(a,b)低斋,ab 分別是點(diǎn) Px 坐標(biāo)和 y 坐標(biāo)蜂厅,則 P1=P+P 在橢圓曲線上的點(diǎn)如下圖所示:

P的切線和曲線相交于P1'(c,d),則P1'關(guān)于x軸的映射就是我們要求的P1(c,-d)

無限點(diǎn)(point at infinity)

無限點(diǎn)(point at infinity)的概念存在的原因是:可能存在兩點(diǎn)的連線正好和 x 軸垂直的情況膊畴,這時(shí)就不會有與曲線相交的另外一個(gè)點(diǎn)了掘猿,這種情況下,規(guī)定該點(diǎn)為無限點(diǎn)唇跨。

同時(shí)稠通,無限點(diǎn)和任意一個(gè)點(diǎn) P 相加,仍然是 P买猖。例如:假設(shè) P1 是無限點(diǎn)改橘,那么

\begin{align} P = P1 + P \end{align}

從這個(gè)角度來看,無限點(diǎn)又具備了 0 的特性政勃。

乘法

如果加法和無限點(diǎn)的概念刷新了你的認(rèn)知唧龄,那么乘法就親切很多,它和我們所熟知的代數(shù)中的乘法并無差異:乘法就是加法的展開式奸远,假設(shè) P 點(diǎn)是橢圓曲線上的一個(gè)點(diǎn)既棺,那么

k \times P = \underbrace{P+P+ \cdots + P}_{k}

產(chǎn)生一個(gè)私鑰

有了以上的基礎(chǔ),我們才可以來計(jì)算公鑰懒叛,產(chǎn)生公鑰的算法其實(shí)就是橢圓曲線上的乘法運(yùn)算:

K =k\times G

上面公式中丸冕,G 是橢圓曲線上的一個(gè)點(diǎn),且這個(gè)點(diǎn)在比特幣中是固定不變的薛窥;k 是我們的私鑰胖烛,上一篇中我們已經(jīng)知道了私鑰是一個(gè)很大的隨機(jī)數(shù)眼姐;而結(jié)果 K 就是我們產(chǎn)生的公鑰,根據(jù)上面的知識佩番,可以知道公鑰是 k 個(gè) G 相加的結(jié)果众旗,這個(gè)結(jié)果仍然是橢圓上的一個(gè)點(diǎn) (x,y)

上圖是一個(gè)公鑰產(chǎn)生的示意圖,如果你能看懂趟畏,恭喜你贡歧,你已經(jīng)掌握了公鑰的生成算法。

相關(guān)文章:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猎莲,一起剝皮案震驚了整個(gè)濱河市绍弟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌著洼,老刑警劉巖樟遣,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異郭脂,居然都是意外死亡年碘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門展鸡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屿衅,“玉大人,你說我怎么就攤上這事莹弊〉泳茫” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵忍弛,是天一觀的道長响迂。 經(jīng)常有香客問我,道長细疚,這世上最難降的妖魔是什么蔗彤? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮疯兼,結(jié)果婚禮上然遏,老公的妹妹穿的比我還像新娘。我一直安慰自己吧彪,他們只是感情好待侵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著姨裸,像睡著了一般秧倾。 火紅的嫁衣襯著肌膚如雪怨酝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天那先,我揣著相機(jī)與錄音农猬,去河邊找鬼。 笑死胃榕,一個(gè)胖子當(dāng)著我的面吹牛盛险,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播勋又,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼换帜!你這毒婦竟也來了楔壤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤惯驼,失蹤者是張志新(化名)和其女友劉穎蹲嚣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祟牲,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡隙畜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了说贝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片议惰。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖乡恕,靈堂內(nèi)的尸體忽然破棺而出言询,到底是詐尸還是另有隱情,我是刑警寧澤傲宜,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布运杭,位于F島的核電站,受9級特大地震影響函卒,放射性物質(zhì)發(fā)生泄漏辆憔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一报嵌、第九天 我趴在偏房一處隱蔽的房頂上張望虱咧。 院中可真熱鬧,春花似錦沪蓬、人聲如沸彤钟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逸雹。三九已至营搅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間梆砸,已是汗流浹背转质。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留帖世,地道東北人休蟹。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像日矫,于是被迫代替她去往敵國和親赂弓。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354