ECDSA 公鑰恢復問題
我嘗試從給定的消息中恢復公鑰 $ m $ 和對 $ (r, s) $ 使用滿足標準RFC7091的曲線。我正在使用 secp256k1 實現之一的算法,但似乎不是任何隨機的 $ k $ , 那是 $ 0<k<N $ 給我一雙 $ (r, s) $ 我可以恢復一個有效的公鑰。我確實檢查了這個問題How does recover the pubkey from ECDSA signature works並嘗試使用帶有此參數的曲線 $ P=23, a=13, b=10, N=19, G=(18, 2) $ 但我只有在非常小的值子集上有一個帶有指定消息的有效公鑰 $ k $ .
有什麼解決方案我可以計算限制嗎 $ (r, s) $ 生成對以確定我的簽名是可恢復的,還是我只需要嘗試重新執行簽名操作,直到我得到一個有效的簽名?
更新:我發現在 ECDSA 和 RFC7091 中有不同的簽名/驗證算法:
- 在 ECDSA 中,我們將 s 計算為 $ s=k^{-1}(z+rd_A)\mod n $
- 在 RFC7091 中,我們將 s 計算為 $ s=(zk+rd_A)\mod n $
在哪裡 $ z $ 是消息的雜湊, $ d_A $ 是私鑰, $ k $ 是隨機的 $ 0<k<n $ , $ n $ 是子組階和 $ r $ 計算類似於兩種算法。
所以 ECDSA 中 pubkey 的恢復公式: $ Q=r^{−1}(sR−zG) $ 由於不同的值,不應該正常工作 $ s $ 由兩種算法產生。
是否有可能修改恢復公式以適用於 RFC7091 標準?
來自 RFC7091 的簽名驗證邏輯實際上是:
$$ r \stackrel{?}= abs( h^{-1}sP - h^{-1}rQ ) $$ 在哪裡 $ r, s $ 是來自簽名的值, $ h $ 是消息雜湊(轉換為整數), $ P $ 是 EC 組生成器,並且 $ Q $ 是公鑰,並且 $ abs $ 是將一個點映射到其 x 座標的函式。
你什麼都知道,除了 $ Q $ ; 您可以通過使用簡單的代數來恢復它;你會發現這兩點 $ R, R’ $ 和 $ r $ 作為 x 座標,然後 $ Q $ 是其中之一:
$$ r^{-1}(sP - hR) $$ $$ r^{-1}(sP - hR’) $$ (你計算的地方 $ r^{-1} $ 模曲線階數)