區(qū)塊鏈ECC曲線加密核心原理解析
對(duì)于RSA這套公私鑰加密的思路,我以為我挺明白的,運(yùn)用的嫻熟自如。
當(dāng)然現(xiàn)在RSA用的不多,而是基于ECC曲線來(lái)做簽名驗(yàn)簽,最大名鼎鼎的莫過(guò)于比特幣。
可是前兩天和別人講代碼,被問(wèn)了ECC為什么可以用來(lái)做驗(yàn)簽,發(fā)現(xiàn)自己講不清楚。
所以做了點(diǎn)功課,來(lái)把這個(gè)問(wèn)題講清楚。
首先我們跳過(guò)ECC曲線是個(gè)啥這個(gè)話題。
這部分我覺(jué)得對(duì)理解這個(gè)邏輯,幫助并不大,黑盒掉就好了。
因?yàn)槲覀兪浅绦騿T,有類型這樣的表述神器,非常清晰,你一點(diǎn)都不用害怕。
只說(shuō)原理,非偽代碼,比如關(guān)于曲線階數(shù)不說(shuō)不影響理解原理,我就不說(shuō)了。
ECC曲線加密核心原理
下面我們講的,都在同一條曲線上,這條曲線上的點(diǎn)支持一種乘法運(yùn)算
設(shè) Q 為曲線上一點(diǎn)
若點(diǎn)R = Q * Q,也可以記為 R=2.Q
若點(diǎn)R =Q*Q*Q,可以記為 R =3.Q
若點(diǎn)R =Q*Q*……*Q ,一共n個(gè)Q,則可以記為R=n.Q
然后原理來(lái)了
給定n 和 Q 求 R 很容易,給定R 和 Q,則非常難求出n
就這一條原理,然后其他的都是證明出來(lái)的。
公鑰和私鑰
先復(fù)習(xí)一下原理
設(shè)Q為曲線上一點(diǎn),k為一個(gè)整數(shù)
令點(diǎn)K = k.Q,若給定 k 和 Q,很容易求出 K
若給定 K 和 Q ,很難求出k
我換個(gè)說(shuō)法給你看
設(shè)G為曲線上一點(diǎn),k為私鑰
令公鑰K=k.G, 若給定私鑰和G,很容易求出公鑰
若給定公鑰和G,很難求出私鑰
是不是有點(diǎn)意思了,從這里我們也可以看出,ECC的私鑰就是一個(gè)整數(shù),一個(gè)很大很大的整數(shù),Int64 別提了,常用的ECC算法,私鑰是一個(gè)256bit的整數(shù)
而ECC的公鑰是一個(gè)點(diǎn),雖然平??吹剿麄儾皇亲址褪莃ytearray,但是私鑰是整數(shù),公鑰是一個(gè)點(diǎn)(二維坐標(biāo))
ECC曲線有很多應(yīng)用,最常用的是加密解密和簽名驗(yàn)證
加密原理
加密步驟
先設(shè) K=k.G,(公鑰=約定點(diǎn)G階乘私鑰)。
1. 欲傳遞的數(shù)據(jù)m,先把他編碼為一個(gè)坐標(biāo)點(diǎn)M(怎么編碼是你的事,比如一個(gè)字符串,你把他先bytes,然后變成大整數(shù),當(dāng)坐標(biāo)的x坐標(biāo),純屬舉例)
2. 整個(gè)隨機(jī)整數(shù)r
3. 計(jì)算點(diǎn) C1 = M+r.K看到這里肯定有點(diǎn)暈,這里出現(xiàn)了點(diǎn)的加法,還有r.K,r.K 就是 r 個(gè) K相乘,K是公鑰。就是 點(diǎn)C1 等于 r個(gè)公鑰相乘加上坐標(biāo)點(diǎn)M
4. 計(jì)算點(diǎn)C2 = r.G G是曲線上面約定好的一點(diǎn),就是k=k.G(公鑰=約定點(diǎn)G階乘私鑰)那個(gè)G,r是前面的隨機(jī)整數(shù)
加密完成,可以看出加密需要公鑰,加密將坐標(biāo)點(diǎn)M 加密為 C1 C2 兩個(gè)坐標(biāo)點(diǎn)
加密者只需發(fā)送C1 C2 給對(duì)方
解密步驟
1. 由C1=M+r.K 可知 M =C1-r.K
2. 由K=k.G(公鑰=私鑰)將K代入上式可得 M=C1-r.k.G
3. 由C2=r.G 帶入上式,可得 M=C1-k.(r.G)=C1-k.C2
4. 據(jù)上面推導(dǎo)的結(jié)論 M=C1-k.C2,則解密者根據(jù)收到的C1,C2,用自己的私鑰,可以計(jì)算出加密坐標(biāo)點(diǎn)M
簽名驗(yàn)證原理
簽名步驟
先設(shè) K=k.G,(公鑰=約定點(diǎn)G階乘私鑰),設(shè)欲簽名數(shù)據(jù)為m,簽名用私鑰
1. 對(duì)欲簽名數(shù)據(jù)進(jìn)行處理 e=hash(m),e是一個(gè)巨大整數(shù),Hash 算法不用解釋了吧,m是必選,ECSDA實(shí)現(xiàn)中還把一個(gè)坐標(biāo)放進(jìn)去一起算hash,為了便于理解原理,我就不代入那些了,只說(shuō)e
2. 整個(gè)隨機(jī)整數(shù)r
3. 計(jì)算s=r-e*k,這個(gè)式子純粹是整數(shù)運(yùn)算,結(jié)果s當(dāng)然也是整數(shù) ,s=隨機(jī)數(shù)減去 hash*私鑰,就這個(gè)意思。
簽名完成
通常說(shuō)簽名(signdata)就是指s和r兩個(gè)整數(shù)。
簽名者發(fā)送 s、r、公鑰K,欲簽名數(shù)據(jù)m,則任何人可以驗(yàn)簽。
驗(yàn)簽步驟,驗(yàn)簽用公鑰
1. 對(duì)欲簽名數(shù)據(jù)進(jìn)行處理 e=hash(m)
2. 計(jì)算點(diǎn)V1=r.G(就是算公鑰那個(gè)點(diǎn)G 階乘隨機(jī)數(shù) r)
3. 計(jì)算點(diǎn)V2=s.G+e.K ( 點(diǎn)G階乘簽名數(shù)據(jù)s 加上 公鑰階乘 )
4. 若V1=V2 則驗(yàn)簽成功,接下來(lái)證明
5. 若數(shù)據(jù)都是對(duì)的,則s =r-e*k成立
6. 此時(shí)設(shè)s=r-e*k,V2=s.G+e.K 將s展開(kāi) 得 V2=(r-e*k).G+e.K
7. V2 =r.G-e.k.G+e.K
8. 因?yàn)镵=k.G,代入上式,可得V2 = r.G – e.(k.G)+e.K = r.G -e.K+e.K
9. 上式抵消e.K之后得V2=r.G,可知假設(shè)s=r-e*k時(shí),V2=r.G =V1
10. 反之,當(dāng)V1=V2時(shí),s=r-e*k成立,數(shù)據(jù)正確
沒(méi)有什么太深得東西,只是把這個(gè)原理表述出來(lái),加深自己的理解,對(duì)得起區(qū)塊鏈從業(yè)者這個(gè)身份。