Rsa

RSA 簽名 - 是否需要驗證 EMSA-PKCS1-v1_5 填充?

  • November 26, 2021

我正在使用一個嵌入式系統,該系統僅在韌體更新由特定的 2048 位 RSA 私鑰有效簽名時才接受韌體更新(嵌入式系統的引導載入程序知道相應的公鑰)。

在發布方面,簽名由以下方式生成:

  1. 計算韌體映像的 SHA-256 雜湊
  2. 根據 EMSA-PKCS1-v1_5 填充它(這涉及預先添加一個固定的 1792 位字元串)
  3. 通過使用 RSA 私鑰求冪來對連接的 2048 位值進行簽名

在嵌入式端,簽名通過以下方式驗證:

  1. 獨立(重新)計算接收到的韌體映像的 SHA-256 雜湊
  2. 通過使用 RSA 公鑰求冪從簽名中恢復連接的 2048 位值
  3. 驗證值的前 1792 位是否與預期的填充字元串完全匹配
  4. 驗證值的最後 256 位(即在發布系統上計算的 SHA-256 雜湊)與在嵌入式系統上計算的雜湊完全匹配

所以,問題:

第 3 步(驗證 EMSA-PKCS1-v1_5 填充)對系統的安全性是否重要?

(這是一個理論上的問題;我想自學。在嵌入式方面驗證填充並不是一個顯著的額外成本。)

PS 我已經嘗試搜尋現有的問題/答案,並且攻擊忽略填充的 RSA 簽名驗證非常接近。不過,在這種情況下,我認為該實現基本上是在整個恢復的 2048 位值中搜尋與重新計算的 SHA-256 雜湊匹配的子字元串;以及在散列後產生垃圾數據的可能性,使這種 Kindle HDX 黑客攻擊成為可能。

在這種情況下,我特別想知道簡單地忽略/刪除前 1792 位(假設是填充)並僅將最後 256 位與預期的散列進行比較是否是一個壞主意。這是否開啟了相同類型攻擊的可能性?還是針對不同的攻擊?

第 3 步(驗證 EMSA-PKCS1-v1_5 填充)對系統的安全性是否重要?

的。這對於小型 RSA 公共指數至關重要 $ e $ .

缺少這項檢查,對於 $ e\in{3,5,7} $ , 容易計算的整數 $ s=h^{(e^{-1}\bmod2^{254})}\bmod2^{256} $ 是任何帶有奇數 SHA-256 雜湊的消息的可接受簽名 $ h $ (大約是兩條消息中的一條)。攻擊可以擴展到 $ e=9 $ ,並通過大量的計算工作 $ e=11 $ , 通過嘗試多條消息直到 $ s $ 因此計算驗證 $ s<\sqrt[e]N $ . 奇數個 $ h $ 嘗試是關於 $ 2^{256}/\sqrt[e]N $ .

這是有效的,因為通過建構 $ s $ , 它擁有 $ s^e<N $ , 所以 $ s^e\bmod N=s^e $ . 所以 $ (s^e\bmod N)\bmod 2^{256} $ ,這是問題的錯誤簽名驗證程序檢查的內容,是 $ h^{(e^{-1}\bmod2^{254})e}\bmod2^{256} $ , 那是 $ h $ 對於奇數 $ h $ (注意這樣的 $ h $ 互質於 $ 2^{256} $ 和 $ \lambda(2^{256})=2^{254} $ , 在哪裡 $ \lambda $ 是Carmichael 函式,這樣 $ \forall m>0 $ 和 $ \forall a $ 互質於 $ m $ , $ a^{\lambda(m)}\bmod m=1 $ ).

如果有攻擊為 $ e\ge13 $ 對於問題的參數,我想知道。但正如美國國家安全域所說的那樣:“攻擊總是會變得更好;它們永遠不會變得更糟”

結論是我們應該全面檢查 RSA 簽名填充。在我看來,系統地避免非常小的 $ e $ ,這應該只是在我們負擔得起的情況下採取的額外預防措施 $ \approx8 $ 使用標準導致簽名驗證的時間損失 $ e=F_4=2^{(2^4)}+1=65537 $ . 此外,我們應該使用帶有 RSA 問題可還原性參數的填充,就像RSASSA-PSSISO/IEC 9796-2方案 2 或 3 中的那樣。


PKCS#1 V1.5 type 01 簽名的不正確驗證至少用於比比皆是。這首先是由 Daniel Bleichenbacher 基於實施錯誤的 RSA 簽名偽造(由 Crypto 2006 rump session 的 Hal Finney 提供的帳戶)公開的。在後來衍生的攻擊中:Ulrich Kühn、Andrei Pyshkin、Erik Tews、Ralf-Philipp Weinmann、Bleichenbacher 對 PKCS#1 RSA 簽名的低指數攻擊的變體;和BERserk 漏洞。我一直想知道*“從不將可歸因於無能的東西歸咎於惡意”是否*真的適用於這些錯誤的實現。


¹ Bruce Schneier 在應用密碼學 IIRC 中。

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