可以使用 ECDSA 簽名 (r, s) 中的 r 值來防止重放攻擊嗎?
ECDSA 簽名具有延展性。給定一個有效簽名 (r, s),可以通過否定 s 值來創建第二個有效簽名。
我已經搜尋了此問題的解決方法,並且https://yondon.blog/2019/01/01/how-not-to-use-ecdsa說:
防禦基於簽名延展性的攻擊的一種解決方案是對給定的公鑰和雜湊強制執行單個規範簽名,這是比特幣採用的方法。更具體地說,比特幣核心客戶端軟體將僅接受“低 s 值”ECDSA 簽名,如果 s 小於或等於曲線階數的一半,則簽名具有低 s 值
$$ 3 $$. 客戶端使用的 secp256k1 曲線庫將始終生成低 s 值形式的簽名,驗證者期望提供的簽名也採用低 s 值形式$$ 4 $$.
另一種解決方案是避免在標識符中使用簽名,或者至少確保在標識符創建過程中使用唯一值,即簽名消息中的隨機數。除非給定的公鑰和散列有一個單一的規範簽名,否則簽名不能作為唯一標識符依賴。
我想知道的是,是否可以使用 r-value 而不是 s-value 進行重放檢測?第一個想法應該使用 s 值,因為它來自給定的消息。r-value 不是從給定消息派生的,而是使用 k-value,它應該是一個隨機值。如果重複的 k 值與相同的私鑰一起使用,則密鑰可能會洩露,因此簽名者必須生成不同的 k 值。這讓我覺得 r-value 可以用來防止重放攻擊。
如果我使用 r-value 來防止重放攻擊有什麼問題嗎?
老實說,我從來沒有真正理解為什麼系統使用簽名作為記錄,而不僅僅是已簽名消息的雜湊值。如果使用它,那麼使用可延展簽名就沒有問題。如果有人有理由不照我說的做,請告訴我,我會更改答案。
更重要的是,沒有理由不使用 $ r $ 部分。如果這在兩個不同的有效簽名中重複,則簽名者可以各自學習對方的私鑰。這是因為通過劃分 $ s $ 簽名中的部分, $ k^{-1} $ 部分脫落。然後,給定一個私鑰,很容易學習另一個私鑰。因此,這不應該是任何人關心的問題(即,如果它可能發生,那麼延展性就不是問題了)。
我可以預見到一個潛在的問題。如果兩個使用者生成相同的 ephemeral $ r $ 和 $ k $ 值(或 $ \ell -k $ ), 一個 $ r $ -only 方案會將這些標記為重播,即使它們不是。發生這種情況的可能性應該可以忽略不計,但是考慮到具有不完美的隨機數生成和大量使用者社區的通用簽名實現,即使個別使用者注意不要重複臨時值,它也可能發生。這也將向雙方表明他們可以各自恢復其他人的私鑰。兩個不同的簽名密鑰之間的衝突使用 $ (r,s) $ - 只有當第二個簽名密鑰是由擁有第一個簽名密鑰的人專門生成時,才可以進行重放檢測。