比特幣世界的數碼簽署

之前在何謂區塊鏈"文中提過,每一個區塊都儲住1000條交易,每條交易都類似 "Peter pays Mary $1"。

如果世界沒有壞人,以上這條交易應該是Peter 發送出去。可惜世界沒如果,壞人肯定存在,可能Mary知道Peter手上有很多bitcoin,所以冒認Peter發送這條交易。所以需要一個方法去証明發送交易的人有權動用資金來源,例如簽名。

現實生活中的簽署很簡單,拿起筆簽個名,完成!

網上世界的簽署可能你也見過不少,例如你很少需要擔心,發送電郵給你的到底是不是他本人。

因為電郵/論壇其實是一個中心化的系統,所謂簽署其實是連結到你的帳戶,由你的密碼驗証身份。 Peter發送email之前,要先提供peter@gmail.com的密碼給Google,Google 檢查過地址跟密碼是否匹配。

Ok! Peter可以發送email啦!

但是在bitcoin的去中心化的世界裏,沒有Google伺服器之類的中心點,礦工並不知道你的bitcoin wallet密碼。

因為礦工都有可能是壞人,所以bitcoin 網絡需要密碼以外的方法來認証你動用資金的權力。這個方法叫做數碼簽署(digital signature)

數碼簽署(digital signature)簡介

數碼簽署有兩條key: 密鑰(private key) / 公鑰(public key)

顧名思義,private key 是只有你才知道,public key是所有人都可以知道。
private key 的功能是簽署
public key

的功能是讓其他人驗証你的簽署

例如,Peter 的用Peter's private key造出來的簽署,只有用Peter's public key才能通過驗証。
用Mary's private key造出來的簽署,用Peter's public key是通過不了驗証。
反過來說用peter's private key造出來的簽署,用Mary's public key是通過不了驗証。

private key,public key,簽署都是一串很長很長的數字
手持private key的人,很容易可以計算出對應的public key
手持public key的人,是沒可能逆向計算出對應的private key

數碼簽署還有個特別之處,Peter每一次用private key簽署文件,每一次的簽署都不一樣:
"Peter Pays Mary $1",用Peter's private key簽署出來可能是12135234634
"Peter Pays Paul $1",用Peter's private key簽署出來可能是56743454572434567

礦工要驗証Peter的簽名時,礦工需要3個輸入: 文件、Peter's public key、Peter的簽署。

驗証的方法是公開的,驗証的結果只有兩個,True/False

例如
文件: "Peter Pays Mary $1"、Peter's public key、簽署:"12135234634"
將以上3項輸入到驗証函數,會得出true

文件: "Peter Pays Mary $1"、Peter's public key、簽署:"56743454572434567"
將以上3項輸入到驗証函數,會得出false,雖然56743454572434567都是Peter的簽署,但是這個簽署跟文件不匹配

除了以上特點,一個成功的digital signature scheme還要避免黑客冒簽。

例如
"Peter pays John $1",Peter 簽名1
"Peter pays Danny $1",Peter 簽名2
"Peter pays Andy $1",Peter 簽名3
.....
...
..
"Peter pays Mr. n $1",Peter 簽名n
這裏有n個文件,n個Peter簽名,還有公開的Peter's public key
黑客拿著上面幾樣東西,能否在沒有peter's private key的情況下,猜出"Peter pays 黑客 $1"的正確簽署?
如果黑客猜得出,這個signature scheme就忘了它吧…

曾經Sony就是因為用了一個有問題的signature scheme,讓黑客破解了PS3光碟上的簽署
以至廣大玩家可以在PS3上執行盜版光碟,Sony把黑客告上法庭
此舉令Anonymous非常不滿,激發他們大規模黑掉PlayStation Network
老一輩的現家應該對於2011年PSN當掉還有很深的印象吧…


———–

RSA是其中一種很著名的digital signature scheme

這個signature scheme很難破解,但其實背後用到的數學也不是很深澳
主要是用上兩個超級大的質數,就像前文提過,91 的兩個因數是7和13
如果我把7和13換成另外兩個超級大的質數,給你他們的積
要破解的話你就要找出背後的兩個質數,一般家用電腦花上幾百年也找不出..

大家每天上網都有使用RSA來驗証網站的真偽
各大網絡保安公司經常呼籲大家瀏覽網站時,要用https,不要用http
https 多出來的s是secure的意思
https secure在於瀏覽器會驗証網頁的簽名,也就是憑証(certificate)

你登入銀行網站時,怎麼知道將要收到你密碼的伺服器,真的是你以為的那所銀行的伺服器,而不是被黑客偷龍轉鳳的另一台?

如果你登入的是https網站,瀏器會先要求伺服器提供証書,而且這個証書必須是一些可信可靠的大公司簽發的。

瀏覽器本身已經存了幾十個可靠的証書簽發公司,如果伺服器提供的証書不是那些公司簽發出來的,就會警告你,你現在瀏覽的網站可能並不可靠。

在這例子裏
private key存在可靠的證書簽發公司
public key存在你瀏覽器裏
文件是"這裏是匯豐銀行網站"
簽署就是證書。

任何一個東西不匹配的話瀏覽器都會發出警告
幾年前大陸用戶用chrome登上很多網站都收到警告
因為chrome不再信任大陸其中一個證書簽發公司CNNIC,原因是CNNIC亂發證書
就算是不可信的網站也得到CNNIC證書,那麼https 就失去它的意義了。


———–

然後數碼簽署在bitcoin的世界裏怎樣應用呢?

每一個錢包軟體(e.g. Electrum)內都存了一條private key,和一條對應的public key

public key其實就是你錢包地址,如果你想讓人存錢給你,就讓對方知道你的public key
如果你要動用錢包裏的資金,就要用你的private key去簽發一條交易
然後將交易信息和你的public key發佈到全世界的礦工

所以千萬要保護好你的private key,一旦你的private key洩露了,其他人就可以冒認你的簽署,把你wallet裏的錢全都轉出去!

幾乎每一年都有cryptocurrency exchange因為沒保護好自己的private key。 讓黑客偷到手了,客戶存在exchange裏的資金也跟著比偷走了...比如很多人用的Bitfinex,GateCoin都發生過類似的意外。

bitcoin用的digital signature scheme 叫做elliptic-curve digital signature algorithm
elliptic curve 是y^2=x^3+ax+b,看上去跟中學學的 quadratic curve差不多吧
實際上bitcoin用的那一條curve 是y^2=x^3+7,看下圖:

bitcoin digital signature

就是這條跟奶頭差不多樣子的曲線保護了你在bitcoin blockchain上發出的交易,不可能被其他人冒簽
這個奶頭上的數學很複雜,所以…跟SHA256一樣,我建議各位先到Wiki 看看 https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm
沒被嚇到還有興趣了解多一點才找我吧..


延伸閱讀