Hash
使用 CMAC 代替雜湊函式進行消息簽名
通常,當我們要為消息 M 生成簽名時,我們使用雜湊函式 H,並使用私鑰對 H(M) 的結果進行簽名。如果我們使用帶有密鑰 K 的 CMAC 代替散列函式 H,然後使用私鑰對 CMAC(M, K) 的結果進行簽名會怎樣?這種操作在密碼學上是安全的嗎?如果是這樣,密鑰 K 是否需要保密?
我有一個帶有 AES-CMAC 硬體加速器的設備,想知道是否可以使用它,而不是在軟體中實現散列算法。
如果我們使用帶有密鑰 K 的 CMAC 代替散列函式 H,然後使用私鑰對 CMAC(M, K) 的結果進行簽名會怎樣?這種操作在密碼學上是安全的嗎?
如果 $ K $ 用於特定簽名的簽名是公開的(必須由持有公鑰和簽名且沒有任何秘密的人驗證簽名),然後很容易找到第二條消息 $ M’ $ 這樣 $ \text{CMAC}(M, K) = \text{CMAC}(M’, K) $ ; 也就是說,簽名也將使用第二條消息進行驗證 $ M’ $ .
事實上,攻擊者在選擇它時會有很大的靈活性 $ M’ $ ; 他可以指定整個 $ M’ $ 除了該消息中任何位置的 16 字節對齊塊之外的消息 - 然後他可以有效地計算該 16 字節值必須是什麼;這給了他整個 $ M’ $ .
另一方面,如果 $ K $ 是保密的,以上不適用。當然,這引出了一個明顯的問題:如果簽名者和驗證者確實共享一個秘密(並且您可以相信驗證者不會嘗試生成偽造品),那麼您為什麼不直接使用 CMAC,而不必為簽名操作而煩惱?