ECDSA 恢復任意值
如果我要為 secp256k1 上的 ECDSA 恢復函式提供任意值,該函式是否有可能無法為公鑰返回某個值?
我專門嘗試為我不知道私鑰的乙太坊交易創建簽名(一次性使用交易)。請假設我將選擇簽名的值以優化成功(即,只輸入合理的值)。
編輯:為了澄清我想要實現的目標,請參閱這篇文章https://medium.com/@weka/how-to-send-ether-to-11-440-people-187e332566b7。總而言之:使用一些發明的簽名創建一個交易,對該簽名進行 ecrecover 以找到它的公鑰(和乙太坊地址),用另一個轉賬為該地址提供資金,然後最終送出原始交易。實現在不知道其私鑰的情況下從地址發送交易的最終結果。不是壓倒性的有用,但仍然很有趣。
是的。
非乙太坊橢圓曲線簽名產生的數字
r
和s
都需要在範圍 內[1,n-1]
,其中n
是橢圓曲線基點的階數大小。請參閱Wikipedia - 橢圓曲線數字簽名算法。乙太坊交易簽名,使用 secp256k1 曲線(具有固定
n
值)並且需要數字v
,r
和s
.r
具有與上述相同的範圍,但與標準橢圓曲線簽名不同,s
僅限於該範圍[1, n/2+1]
(參見乙太坊黃皮書 - 附錄 F)。超出這些範圍的任何值都r
將s
生成無效簽名。假設我們堅持這個範圍內的值,我們還必須為乙太坊交易簽名提供一個
r
值。EIP-155指定或。s``v``v = CHAIN_ID *2 + 35``v = CHAIN_ID*2 + 36
該
r
值表示 scep256k1 曲線上某個點的 x 值。從根本上說, 表示由 給出的點的 y 值(即相應的 x 值)v
的奇偶校驗(偶數或奇數)。r
這個奇偶校驗決定是否使用35
或36
在v
上面的規範中。該值v
用作 recoveryid 或recid
在此庫中用於第 89 行的 ECDSA 恢復,由 go-ethereum 使用。不正確v
的值可能會使此恢復不正確並給出無效的結果公鑰。因此,如果要保持v
固定,隨機化r
和s
(或等效地,隨機化所有數字)在其有效性範圍內,我們假設獲得奇數或偶數的機會均等,我們預計平均 50% 的簽名是無效的(因為我們的奇偶校驗不正確) .