Elliptic-Curves

OpenSSL 是否在使用 ECDSA 簽名之前將 ASN1 編碼應用於雜湊?

  • April 14, 2016

我在堆棧溢出中讀到 OpenSSL 在為 ECDSA 簽名之前對雜湊執行 ASN1 編碼。

換句話說,當-sign呼叫橢圓曲線鍵時,OpenSSL 執行以下步驟:

  1. 計算 $ H = Hash(M) $
  2. 編碼 $ H $ 進入 ASN1 標準 $ H’ $
  3. 符號 $ H’ $

-pkeyutl如果上述情況屬實,那麼為了避免應用步驟 1。有必要首先計算摘要,然後使用橢圓曲線密鑰的原始簽名對摘要進行簽名。

但是,當我同時執行 BOTH-sign-dgst+-pkeyutl時,我能夠-verify在這兩種情況下使用驗證簽名。這意味著 ASN1 編碼未應用於散列。

任何人都可以對這個話題有所了解嗎?我無法在 OpenSSL 文件中找到資訊。

不,您不會在生成 ECDSA 簽名時將 ASN.1 編碼添加到雜湊中。

有兩個原因:

  • 首先是沒有空間,如果我們選擇一條曲線和一個具有同等安全性的雜湊。為了確保免受攻擊 $ O(2^N) $ 時間,一條曲線需要有一個至少是 $ 2N $ 位;以防止碰撞攻擊 $ O(2^N) $ 時間,雜湊需要的輸出至少是 $ 2N $ 位。這意味著,如果我們不添加任何編碼,散列只會適合曲線。如果我們要在雜湊中添加 ASN.1 編碼,這意味著我們需要使曲線大於安全目的所需的曲線。或者,我們可以通過曲線順序對結果取模以使其適合,但這實際上與向雜湊添加一個常數(取決於曲線和雜湊函式)相同,這似乎有點毫無意義。
  • 二是沒有理由。在 RSA 中,驗證者恢復填充的雜湊值;然後,他可以嘗試解析 ASN.1 編碼以確定使用的散列(然後使用該散列對正在驗證的消息進行散列)。對於 ECDSA,驗證者實際上並沒有恢復填充雜湊值;相反,他需要在從簽名中學到任何東西之前生成散列(和填充,如果正在使用填充)消息。因此,我們從在 RSA 中編碼散列的 ASN.1 獲得的潛在收益不適用於 ECDSA。

另外,原來的堆棧溢出問題根本沒有提到ECDSA;它嚴格談論RSA。在您指出的問題中,這是假設 ECDSA 使用填充的問題;答案沒有解決這個問題。

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