Public-Key

可以保護確定性 ECDSA 免受故障攻擊嗎?

  • August 6, 2021

Barenghi 和 Pelosi 的一篇論文中,描述了當使用@Thomas_Pornin在RFC6979中描述的確定性 ECDSA 時,故障攻擊可用於派生密鑰

確定性(EC)DSA。在這種情況下,攻擊者的目的是恢復密鑰的值 $ d $ ,來自正確簽名的值 $ (r, s) $ 和錯誤的 $ (\tilde r, \tilde s) $ . 攻擊者能夠建立以下聯立方程組 $ \mathbb{Z}^*_q $ 在未知中 $ d $ 和 $ k $ :

$$ \left{ \begin{align} s &\equiv_q (\texttt{H}(\texttt{msg})+d \cdot r) \cdot k^{-1} \ \tilde s &\equiv_q (\texttt{H}(\texttt{msg})+d \cdot \tilde r) \cdot k^{-1} \end{align} \right. $$

並解決它

$$ \left{ \begin{align} d &\equiv_q \textstyle \frac{(s - \tilde s) \cdot \texttt{H}(\texttt{msg})}{r \cdot \tilde s - \tilde r \cdot s} \ k &\equiv_q s^{-1} \cdot (\texttt{H}(\texttt{msg})+d \cdot r) \end{align} \right. $$

導出密鑰所需的計算量可以忽略不計,如果使用不可靠的故障注入技術,可以確認 $ d $ 和 $ k $ 已提取確定性 $ k $ 對應於 $ d $ 通過指定的程序

$$ 9 $$,並將其與從聯立方程中獲得的結果進行檢查。

可以保護確定性 ECDSA 免受此類故障攻擊嗎?

正如 fgrieu 在他的回答中已經說過的那樣,這是可能的。

有多種方法可以保護確定性 ECDSA 免受故障攻擊,但這些方法將取決於您的故障模型

如果您只考慮一個故障模型,那麼任何需要攻擊者執行兩個故障以實現其目標的構造都是可接受的對策……另一方面,如果您認為攻擊者無處不在並且可以執行她選擇的故障在晶片的任何位置的任何時間點,那麼您很可能找不到任何方法來對抗她。這是一個普遍的假設,由實際實驗支持,在同一計算上執行兩個局部故障是困難的,如果故障的值很重要,則更是如此。

那麼,您如何處理確定性 ECDSA 中的單個故障?

好吧,您可以按照 fgrieu 所說的進行驗證過程,但是最後一步中的第二個錯誤可能會簡單地觸發驗證以輸出“true”而不是“false”,但是您將處於另一個錯誤模型中,其中攻擊者可以犯兩個錯誤……現在,還有其他方法可以使攻擊者更加難以處理第二個錯誤:

第一種方式由 Thomas Pornin 本人在RFC6979 第 3.6 節(強調我的)中描述:

附加數據可以添加到 HMAC 的輸入,在 bits2octets(H(m)) 之後連接:

     K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')

一個案例可能是一個協議,它需要在無法訪問高質量隨機源的系統上使用非確定性簽名算法。 附加數據 k’ 是非重複的(例如,簽名計數器或單調時鐘)就足夠了,以確保以密碼方式與普通 (EC)DSA 簽名無法區分“看似隨機的”簽名。

$$ SP800-90A $$術語,k’是“附加輸入”,可以在生成偽隨機位時設置為參數。 這種變體可以被認為是對附加數據 k’ 源的隨機性的“加強”。

這是Signal 中使用的 XEdDSA 選擇的方式,以防止故障影響其安全性。它允許確定性 ECDSA 對有偏隨機源的額外安全性,仍然看起來完全符合 ECDSA,並且可以有效抵禦XEdDSA 文件中描述的故障攻擊。但是,遺憾的是,您不再獲得簽名的確定性。

實現相同目標的第二種方法可能是對相同的數據進行兩次簽名並比較兩者的輸出,如果它們匹配則繼續,否則在計算中存在錯誤或多個不同步的錯誤。這樣做的好處是,特別是對於 EdDSA,不承擔完整驗證的成本,因為驗證是一種更昂貴的操作方式(對於 ECDSA 來說也更昂貴)。但仍然會使該過程慢一倍。

第三種可能性是使用為 RSA 引入的所謂“感染性”對策,以便最終計算的任何部分中的故障都會隨機化故障輸出。這是最近的一篇論文(發表於 FDTC 2017),其中介紹了針對 EdDSA 的這種對策。這種對策通常會結合相同散列的兩種不同實現,如果兩者都輸出相同的數據,則允許恢復正確的值,否則不會給出任何感興趣的結果。但它非常“本地化”:它可能無法防止在簽名過程的其他步驟中發生故障。

我個人喜歡將隨機性添加到確定性 ECDSA 中,我發現它既優雅,因為它與標準 ECDSA 沒有區別,又高效,因為它在實踐中幾乎沒有成本,這與許多其他方式不同。

PS:順便說一下,Barenghi 和 Pelosi 說 EdDSA 對這類攻擊具有結構性的抵抗力,但實際上並非如此,因為仍然有可能獲得足夠秘密的材料來模仿有效簽名,而只有密鑰的車主可以檢測。

是的,可以保護 ECDSA(包括確定性)免受故障攻擊。一個想法是在釋放簽名之前檢查任何計算的簽名(通過驗證者的算法)(如果驗證失敗則不釋放任何東西;也許,將密鑰歸零並聲明設備有故障或受到攻擊)。

這是一種適用於許多簽名方案的非常通用的技術。Dan Boneh、Richard A. DeMillo、Richard J. Lipton 已經在Eurocrypt 1997的會議記錄中講授了關於檢查密碼協議是否存在錯誤的重要性。

在 (EC)DSA 的情況下,如上文所述,該對策相當昂貴:它使簽署成本增加了一倍以上。

更便宜的對策是可能的;請參閱Lery 的出色回答

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