Hash

為什麼在使用 RSA 簽名之前對消息進行雜湊處理?

  • July 5, 2020

說明了使用 RSA 對消息進行數字簽名的過程:

圖片

如圖所示,首先對消息進行散列處理,然後根據散列而不是完整消息計算簽名。

為什麼要在簽名之前對數據進行雜湊處理?為什麼不簽署整個消息?當然,如果您只簽署雜湊值會節省時間,但我聽說直接簽署完整消息也存在安全問題。如果是這樣,它們是什麼?

除了在沒有散列的情況下使用 RSA 簽名時已經提到的 poncho性能問題之外,我只想添加poncho 的安全警告

重新排序

如果您有消息 $ m>N $ 和 $ N $ 作為 RSA 模數,那麼您必須執行至少 2 個 RSA 簽名作為 $ m $ 不再適合 $ Z_N $ . 讓我們假設它需要 $ k $ 這樣的簽名並寫下消息 $ m=(m_1,\ldots,m_k) $ 整體簽名將是 $ \sigma=(\sigma_1,\ldots,\sigma_k) $ , IE, $ k $ RSA 簽名。現在沒有任何額外措施,任何人都可以持有 $ (m,\sigma) $ 可以通過 1) 交換任意一對子消息來操縱消息並採用簽名 $ m_i $ , $ 1\leq i\leq k $ 和相應的子簽名 $ \sigma_i $ 或 2) 丟棄子消息和相應的子簽名。

作為交換的一個例子,假設我們有 $ m=(m_1,m_2,m_3) $ 因此 $ \sigma=(\sigma_1,\sigma_2,\sigma_3) $ ,即由 3 個塊組成的消息的 3 個獨立 RSA 簽名,然後是一個對手 $ (m,\sigma) $ 可以簡單地交換,例如 $ m’=(m_2,m_3,m_1) $ 和 $ \sigma’=(\sigma_2,\sigma_3,\sigma_1) $ ,這是偽造的,因為它顯然是一個有效的簽名。

存在的偽造

如果您在 RSA(教科書 RSA 簽名)中籤名之前不對消息使用冗餘方案,則它們很容易受到存在偽造的影響。讓 $ (e,N) $ 是RSA的公開簽名驗證密鑰,那麼可以隨機選擇一個簽名 $ \sigma \in Z_N $ 並將相應的消息計算為 $ m\equiv \sigma^e \pmod N $ .

請注意,給定 RSA 簽名 $ \sigma $ , 一個消息 $ m $ 和一個公共驗證密鑰 $ (e,N) $ ,教科書RSA簽名的簽名驗證將檢查: $ m\stackrel{?}{\equiv} \sigma^e \pmod N $ .

顯然,該檢查將適用於構造偽造。但是請注意,對手無法控制消息的內容 $ m $ 會的。特別是,它將是一個隨機元素 $ Z_N $ . 但是,這在某些應用程序中可能就足夠了,例如,在發布某些令牌時僅對隨機數進行簽名時。對消息應用冗餘方案,即在簽名之前進行散列和填充使得計算出的偽造簽名在實踐中毫無用處。

最後的話

因此,不得使用教科書 RSA 簽名,而必須使用標準化的 RSA 填充方法,包括散列和填充消息。然後,RSA 簽名提供了強大的安全保證(UF-CMA 安全)。

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