如何給小學生講清楚ECC橢圓曲線加密

對於RSA這套公私鑰加密的思路,我覺得我挺明白的,運用的嫺熟自如。程序員

固然如今RSA用的很少,而是基於ECC曲線來作簽名驗籤,最大名鼎鼎的莫過於比特幣。算法

但是前兩天和別人講代碼,被問了ECC爲何能夠用來作驗籤,發現本身講不清楚。區塊鏈

因此作了點功課,來把這個問題講清楚。編碼

首先咱們跳過ECC曲線是個啥這個話題,這部分我以爲對理解這個邏輯,幫助並不大,黑盒掉就行了。加密

由於咱們是程序員,有類型這樣的表述神器,很是清晰,你一點都不用懼怕。字符串

只說原理,非僞代碼,好比關於曲線階數不說不影響理解原理,我就不說了。hash

ECC曲線加密核心原理

下面咱們講的,都在同一條曲線上,這條曲線上的點支持一種乘法運算it

設 Q 爲曲線上一點比特幣

若點R = Q * Q,也能夠記爲 R=2.Q原理

若點R =Q*Q*Q,能夠記爲 R =3.Q

若點R =Q*Q*……*Q ,一共n個Q,則能夠記爲R=n.Q

而後原理來了

給定n 和 Q 求 R 很容易,給定R 和 Q,則很是難求出n

就這一條原理,而後其餘的都是證實出來的。

公鑰和私鑰

先複習一下原理

設Q爲曲線上一點,k爲一個整數

令點K = k.Q,若給定 k 和 Q,很容易求出 K

若給定 K 和 Q ,很難求出k

我換個說法給你看

設G爲曲線上一點,k爲私鑰

令公鑰K=k.G, 若給定私鑰和G,很容易求出公鑰

若給定公鑰和G,很難求出私鑰

是否是有點意思了,從這裏咱們也能夠看出,ECC的私鑰就是一個整數,一個很大很大的整數,Int64 別提了,經常使用的ECC算法,私鑰是一個256bit的整數

而ECC的公鑰是一個點,雖然日常看到他們不是字符串就是bytearray,可是私鑰是整數,公鑰是一個點(二維座標)

ECC曲線有不少應用,最經常使用的是加密解密和簽名驗證

加密原理

加密步驟,先設 K=k.G,(公鑰=約定點G階乘私鑰)。

1. 欲傳遞的數據m,先把他編碼爲一個座標點M(怎麼編碼是你的事,好比一個字符串,你把他先bytes,而後變成大整數,當座標的x座標,純屬舉例)

2. 整個隨機整數r

3. 計算點 C1 = M+r.K看到這裏確定有點暈,這裏出現了點的加法,還有r.K,r.K 就是 r 個 K相乘,K是公鑰。就是 點C1 等於 r個公鑰相乘加上座標點M

4. 計算點C2 = r.G G是曲線上面約定好的一點,就是k=k.G(公鑰=約定點G階乘私鑰)那個G,r是前面的隨機整數

加密完成,能夠看出加密須要公鑰,加密將座標點M 加密爲 C1 C2 兩個座標點

加密者只需發送C1 C2 給對方

解密步驟

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. 據上面推導的結論 M=C1-k.C2,則解密者根據收到的C1,C2,用本身的私鑰,能夠計算出加密座標點M

簽名驗證原理

簽名步驟,先設 K=k.G,(公鑰=約定點G階乘私鑰),設欲簽名數據爲m,簽名用私鑰

1. 對欲簽名數據進行處理 e=hash(m),e是一個巨大整數,Hash 算法不用解釋了吧,m是必選,ECSDA實現中還把一個座標放進去一塊兒算hash,爲了便於理解原理,我就不代入那些了,只說e

2. 整個隨機整數r

3. 計算s=r-e*k,這個式子純粹是整數運算,結果s固然也是整數 ,s=隨機數減去 hash*私鑰,就這個意思。

簽名完成

一般說簽名(signdata)就是指s和r兩個整數。

簽名者發送 s、r、公鑰K,欲簽名數據m,則任何人能夠驗籤。

驗籤步驟,驗籤用公鑰

1. 對欲簽名數據進行處理 e=hash(m)

2. 計算點V1=r.G(就是算公鑰那個點G 階乘隨機數 r)

3. 計算點V2=s.G+e.K ( 點G階乘簽名數據s 加上 公鑰階乘 )

4. 若V1=V2 則驗籤成功,接下來證實

5. 若數據都是對的,則s =r-e*k成立

6. 此時設s=r-e*k,V2=s.G+e.K 將s展開 得 V2=(r-e*k).G+e.K

7. V2 =r.G-e.k.G+e.K

8. 由於K=k.G,代入上式,可得V2 = r.G – e.(k.G)+e.K = r.G -e.K+e.K

9. 上式抵消e.K以後得V2=r.G,可知假設s=r-e*k時,V2=r.G =V1

10. 反之,當V1=V2時,s=r-e*k成立,數據正確

沒有什麼太深得東西,只是把這個原理表述出來,加深本身的理解,對得起區塊鏈從業者這個身份

最後,2018結束,你們新年快樂

相關文章
相關標籤/搜索