BTC中的簽名演算法ECDSA

weixin_34148340發表於2019-02-03

數字簽名

如果要了解ECDSA演算法必須先要知道數字簽名是什麼?有什麼用?然後再去討論應該怎樣構造數字簽名。
這篇文章我會以這樣的思路去敘述?如果對數字簽名已經瞭解足夠多的讀者可以跳過前面部分直接看後面部分的具體演算法。

什麼是數字簽名?

百度百科是這樣給出的定義:

  • 數字簽名(又稱公鑰數字簽名、電子簽章)是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領域的技術實現,用於鑑別數字資訊的方法。一套數字簽名通常定義兩種互補的運算,一個用於簽名,另一個用於驗證。
  • 數字簽名,就是隻有資訊的傳送者才能產生的別人無法偽造的一段數字串,這段數字串同時也是對資訊的傳送者傳送資訊真實性的一個有效證明。
    數字簽名
    確實給出的定義比較術語性很強,我猜大部分才接觸的同學都很迷茫吧!不用擔心我下面用"口水話"給大家解讀一下。
    我們比如在很多場合都會要求籤名(這裡指的簽名是傳統簽名),也就是用個簽字筆在某個百萬合同上簽字。然後這個合同就生效了。我們反問為什麼生效了呢?因為上面有你的簽名呀,怎麼說這個名是我籤的呢?因為這是你的字跡呀!可能又有人會問著為什麼不是別人模仿的簽名,簽名可以偽造是不假。但是確實需要成本,或者偽造的難度很大。(在這裡我們是放到一個理想的環境中,也就是簽名是不能做假的,進而說,如果這麼好造假,那為什麼到現在為止還是在沿用這種簽名的方式呢?)。既然我們在合同上簽字了,說明我們自己認可了這個合同,別人看到這個合同也是知道是我在上面簽字的(因為上面是我們自己的名字,所以別人當然認識了(排除他是個草書大師))。

    數字簽名的功能

  • 接收方能夠核實傳送方對報文的簽名;
    也即是說別人收到了這個合同的人,認識你的字跡,知道這個簽名是你寫的
  • 傳送方事後不能抵賴對報文的簽名:
    你違約後別人拿著當初的合同來找你賠款你是不能抵賴的,因為你的簽名就寫在這上面
  • 保證資料的完整性,防止截獲者在檔案中加入其它資訊;
    當專案做完後,你們雙方都是可以驗證這份合同中途沒有被篡改過,還是當初的那份合同
    上述三個功能也就對應了數字簽名在比特幣中的作用:
  • 簽名證明私鑰的所有者,即資金所有者,已經授權支出這些資金。
  • 授權證明是不可否認的(不可否認性)。
  • 簽名證明交易(或交易的具體部分)在簽字之後不能被任何人修改。

    ECDSA數學實現

    首先我們要對一個合同(不是傳統意義上的紙質合同,是pdf的一個數字合同)進行數字簽名,我們用M來表示這個合同。
    在ECDSA中首先,生成一個隨機的金鑰對,也就是一個私鑰和其對應的公鑰,私鑰私鑰不知道的同學可以參考我前面的文章《BTC中的密碼學
    這個隨機的金鑰對是怎麼生成的呢?首先是計算機生成一個隨機數(偽隨機,其實目前的計算機都不能生成一個數學意義上真正的隨機數,都是生成的一個偽隨機數,只不過這個隨機數的週期是特別大的,記住是特別大,大得你超乎想象,所以就算別人要破解這個隨機數,也是要付出特別大的代價的),價格這個隨機數是k,這個k便是隨機私鑰了,然後計算出公鑰P=k*G。
    接下來我們再生成簽名,簽名包含兩部分,為R,另外一個為S
13859457-dfbe3a74d2bd4870.png

符號解釋

  • 大寫的P值的是前面生成的隨機公鑰,P其實是一個座標點(為什麼是這樣參考橢圓曲線演算法,也可以看看前面我給出的文章)
  • Hash(M)是用雜湊函式計算一個合同的雜湊值,也可以加做計算合同的數字指紋
  • dA是你自己的私鑰,這是保密的,不能給別人洩露的,洩漏了別人就可以偽造了
  • p是我們在橢圓曲線中,選定有限域的時候選定好的一個大整數
  • R是臨時隨機金鑰對中公鑰P的x座標
    提醒
    其中的k的-1次方並不是我們高中所學的就是等於1/k,這裡的-1次方是值得是k的逆元。如果要真正理解逆元的概念推薦去學一下離散數學。這裡就不過多的解釋了。

這樣我們就生成了這個合同的數字簽名

13859457-8e62df24994557b6.jpg


我們可以把這個數字簽名加上合同M發給別人了,然後別人就可以用你的公鑰和合同還有簽名就可以驗證這個合同了,具體的驗證如下:

13859457-b3ddbf85c8976fec.jpg

這樣把別人發來的合同和簽名,在加上簽名著的公鑰(公鑰匙公開的,這裡不討論怎麼獲取到簽名者對應的公鑰),把這些東西向上面計算出一個P'出來,然後得到一個P'的x座標x',然後對比R和x'是否相等,那麼驗證簽名成功,那就說明這合同是某某人發出來的,並且沒有被篡改。

下面我給大家證明下這個為什麼成立(數學要求比較強,可忽略)

13859457-3d04badb8812d105.png

符號解釋

  • PA是簽名者的公鑰,是dA對應的公鑰
  • 其他的符號和上面一樣

其中內容部分參考於,《精通比特幣第二版》
推薦國外一大佬文章:Understanding How ECDSA Protects Your Data.

相關文章