Public-Key

如何知道是否基於 ECDSA 算法創建了公鑰?

  • November 6, 2022

假設在一個網路中,使用者的身份是他們的公鑰,它是基於 ECDSA 算法生成的。也就是說,要創建有效身份,使用者必須生成 ECDSA 公鑰,然後將其發送給網路管理員進行驗證。然後,網路管理員需要知道使用者是否正確遵循了所有 ECDSA 密鑰生成步驟,以確保使用者的公鑰是有效的 ECDSA 公鑰。

問題是管理員是否能夠進行此確認?怎麼做?

我在這裡提出我的解決方案,儘管我不確定該方法是否可行。

假設使用者生成了一個假公鑰,聲稱它是根據 ECDSA 算法生成的。他必須將密鑰發送給網路管理員進行驗證。

然後驗證密鑰的委員會向使用者發送文本並要求他登錄。收到簽名文本後,使用使用者的公鑰驗證簽名。如果簽名驗證結果為真,則說明該公鑰是正確的公鑰,否則使用者的公鑰將被拒絕為無效公鑰,該公鑰不是基於ECDSA算法生成的。

要創建有效身份,使用者必須生成 ECDSA 公鑰,然後將其發送給網路管理員進行驗證

這是未指定的,缺少:

有了這個,就有一個定義明確的過程來驗證公鑰是否有效。首先檢查它是否符合指定的格式,並根據需要剝離它以執行Validation of Elliptic Curve Public Key,以及在此Elliptic Curve Public Key Validation Primitive(請注意,根據公鑰格式,可能需要先執行點解壓縮,如Octet-String-to-Elliptic-Curve-Point Conversion)。

更新:比特幣中的一種通用公鑰格式(0.6 之後)是隱式指定曲線 secp256k1 的原始壓縮公鑰格式。對此的有效性檢查歸結為:

  • 檢查公鑰是否正好是 33 個字節。
  • 檢查它的第一個字節是 02 h還是 03 h(這個字節編碼了 $ y $ 協調,無需進一步檢查)。
  • 將剩餘的 32 個字節轉換為整數 $ x $ 每個big-endian二進制約定,這意味著 $ 0\le x<2^{256} $ .
  • 檢查 $ x<p $ , 在哪裡 $ p $ 是素數 $ 2^{256}-2^{32}-977 $ .
  • 計算 $ s\gets(x^3+7)\bmod p, $
  • 檢查 $ s^{(p-1)/2}\bmod p,=,1 $ . 根據歐拉準則,這驗證存在整數解 $ y $ 到曲線方程 $ y^2\equiv x^3+7\pmod p, $ . 在帶有輔因子的曲線上 $ h=1 $ ,包括secp256k1,這證明存在匹配的私鑰。

注意:有時我們需要公鑰定義的曲線點的笛卡爾座標。自從 $ p\equiv 3\pmod 4 $ 對於 secp256k1,可以與上述最後一步的略微修改版本一起有效地完成:

  • 計算 $ y\gets s^{(p+1)/4}\bmod p, $ .
  • 檢查 $ y^2\bmod p,=,s $ ,這就完成了檢查。
  • 如果低位 $ y $ 與公鑰第一個字節的低位不匹配,則改 $ y $ 至 $ p-y, $ . 現在 $ (x,y) $ 是所需的笛卡爾座標,兩者 $ x $ 和 $ y $ 在 $ [1,p) $ .

上面講述瞭如何檢查公鑰是否有效,但不知道使用者(或任何人)是否知道相應的私鑰。這最好在驗證公鑰(在上述意義上)之後完成,然後通過問題中的質詢/響應方法完成。

檢查使用者是否知道相應的私鑰有一個好處:如果“給使用者的文本”對於每個密鑰驗證都是唯一的,並且不能與密鑰將簽名的其他消息混淆,那麼這會阻止使用者註冊另一個人預先存在的公鑰(私鑰是秘密的)。

引用自:https://crypto.stackexchange.com/questions/102588