Rsa

使用 EVP_Verify* 驗證簽名時,是否必須提前了解 RSA 填充方案?

  • December 19, 2019

有沒有辦法確定在驗證期間(在呼叫 EVP_VerifyInit、EVP_VerifyUpdate 和 EVP_VerifyFinal 時)在簽名上使用了哪種 RSA 填充類型,還是必須提前知道的約定問題?

對於這個答案,我將只關注 RSA(存在 RSA 標籤,所以我假設這個問題只是關於 RSA)。我想這也是最有可能需要填充的簽名方案。

TL;DR:您不僅需要提前知道填充方案,還需要了解其他要使用的配置選項,例如數據雜湊方法和 MGF1(配置有自己的雜湊)、PSS 的鹽和標籤。


是的,填充方案是在驗證過程中需要提前知道的,當然還有簽名生成。畢竟,如果不首先自己執行模冪運算,就無法從大多數簽名方案中驗證使用哪種填充方案。

如果您在驗證期間允許 PKCS#1 v1.5 填充用於簽名生成和 PSS(並依賴驗證結果對其中任何一個為真),那麼如果對其中任何一個發起成功的攻擊,您的驗證可能會失敗兩個方案中。除此之外,它還需要您執行兩次簽名生成。

雜湊函式也是如此,接受來自較弱雜湊函式的雜湊可能會導致不安全性。即使這些類型的不安全性不是直接可見或不可能的,通常算法的安全性證明現在通常允許密鑰用於不同的方案。

有時有跡象表明將密鑰用於不同的方案是有問題的。例如,對於 PSS,可以在 PKCS#1 v2.2 中找到以下內容:

該編碼方法通過散列函式、遮罩生成函式和鹽長度的選擇來參數化。對於給定的 RSA 密鑰,這些選項應該是固定的,除了鹽長度可以是可變的(參見

$$ JONSSON $$供討論)。


類似地,已撤銷的 ISO 9796 簽名提供消息恢復規范明確表明需要提前知道配置選項。它包含一個包含三個選項的部分:

使用本標準中規定的簽名方案需要選擇抗衝突的散列函式 h。簽名機制和使用的散列函式之間應該有一個綁定。如果沒有這樣的綁定,攻擊者可能會聲稱使用弱散列函式(而不是實際的散列函式),從而偽造簽名。注 1 有多種方法可以完成此綁定。以下選項按風險增加的順序列出。

  1. 使用特定簽名機制時需要特定的雜湊函式。驗證過程應專門使用該特定散列函式。ISO/IEC 14888-3 給出了此選項的範例,其中 DSA 機制需要使用 ISO/IEC 10118-3(也稱為 SHA-1)中的專用散列函式 3。
  2. 允許一組散列函式,並在證書域參數中明確指出正在使用的散列函式。在證書域內,驗證過程應獨占使用證書中指示的散列函式。在證書域外,有一個由可能不遵守使用者政策的認證機構 (CA) 引起的風險。例如,如果外部 CA 創建允許其他散列函式的證書,則可能會出現簽名偽造問題。在這種情況下,被誤導的驗證者可能與生成其他證書的 CA 發生爭執。
  3. 允許一組散列函式並通過其他方法指示正在使用的散列函式,例如消息中的指示或雙邊協議。驗證過程應專門使用其他方法指示的散列函式。但是,存在攻擊者可能使用另一個散列函式偽造簽名的風險。

加入這個主要是為了說明在呼叫簽名驗證方法時,需要提前知道簽名函式的配置選項。有意義的是,簽名算法本身和填充方法也應該提前知道。


對於使用的方法進行調試或逆向工程,首先執行模冪運算是有意義的。對於 PKCS#1 v1.5 填充,填充字節將立即可辨識。如果它看起來像隨機數據,那麼您很可能正在處理 PSS 簽名方案。通常,您也可以區分填充方法的各種初始字節和尾隨字節。不幸的是,過去使用了許多不同的填充方法,比你想像的要多。

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