­

科普—為什麼要用ECDSA加簽及其數學上的驗簽證明

  在上文介紹了ECDSA演算法流程及模組劃分,為了幫助一些小白弄懂啥是ECDSA,特此開一篇科普博文。

一、首先為啥要進行數字簽名?

  假設Alice要將一份合約m傳輸給Bob,合約上附有Alice的電子紙質簽名。這份合約關乎著Boss Bob跟打工人Alice談好的打工加錢。Alice合約上表明我要月薪10個w不溜,而Alice有個黑客仇敵johor要搞Alice,

於是在合約m傳輸的過程中截獲合約,並進行篡改,把10個w不溜改為1k。Boss Bob一看,好傢夥,咋回事?請了一個免費的勞動力。

                       

 

 

   為啥會造成這樣的局面?首先是合約在通過網路傳輸的過程中,容易遭受到第三方的截獲;其次,Alice沒有對這份合約做任何防護就簽上了自己的電子紙質簽名或著說蓋上公章,不過這也沒辦法,Alice和Bob分居兩地,

只能這樣操作。

  那麼數字簽名就是要防止這種情況的發生,Alice通過自己的私鑰對合約m進行加密,然後把公鑰公開,這樣可以使用公鑰對合約m進行驗簽,查看合約是否被篡改,如果驗簽失敗,那就說明合約被篡改了。也就是說,

數字簽名不保護合約m的隱私性,只保護合約m自身的安全性,其最大的目的就是防篡改。

                                        

二、ECDSA是如何保護消息m的?

  首先先看我之前講的ECDSA演算法流程:

      

   一大堆東西,不看也罷。反正作為FPGAer,一定要有模組化的思想。就看Alice最後要輸出什麼東西就行了。

  Alice對合約m簽名完,要給出(D,r,s,m,Q),其中D為橢圓曲線參數組,當然隨機數種子不用給,不過給了也沒事,反正第三方也不知道我用的啥方法產生隨機數的(●’◡’●)

(r,s)為消息m的簽名,m也合約,Q為公鑰且Q=kG。k為私鑰,也是Alice在區間0-n之間隨便選的一個數,G為橢圓曲線基點。

  看完Alice的輸出,再來看看Bob拿到這些資訊做了啥。。。

  也是一大堆演算法,還是看最後一步吧。Bob那邊要計算到v = r才算驗簽成功,即合約m沒有被篡改。

  即要證明v = r,在簽名那裡知道r = dG的x坐標,而驗簽那裡v=X的x坐標,也就是要證明X = dG即可,

  而X=u1G+u2Q=u1G + u2kG=(u1+u2k)G。

  帶入u1與 u2得:X =(ew+rwk)G=(e+rk) *wG。

  而w = s-1 mod n ,帶入得:X = (e+rk)* s-1G。

  在簽名部分,s=d-1(e+kr)mod n  帶入之後,X = dG了。

  也就是一頓操作之後,只要v = r,就證明了X = dG,而消息m對於簽名(r,s)及哈希值e特別敏感,只要有一點變動,這三種都隨隨之變動,那驗簽自然就失敗了。

這樣干說太抽象了,舉個簡單例子。Alice對合約m簽名完,要給出(D,r,s,m,Q),johor對消息m篡改為m1,那麼Bob得到得資訊組為(D,r,s,m1,Q),當然其他參數也可以篡改,但是更容易被識破。

Bob拿著m1進行驗簽,首先生成的哈希值e1就對不上了簽名生成的哈希值e,當然Bob得到的資訊組沒有提供哈希值,Bob在這一步還不知道消息被篡改。

驗簽第二步和第三步,計算w,u1,u2 ,這一步(r,s)沒有被篡改,生成的w和u2沒有問題,而因為消息被篡改,哈希值變為e1了,所以u1也跟著變了。

驗簽第四步,計算X,由於u1變了,那X自然也變了,也就會導致驗簽失敗。