如何知道您是否猜到了正確的 Diffie-Hellman 共享秘密?
只給 $ p, $ $ g, $ $ A = g^a\pmod{p} $ 和 $ B = g^b\pmod{p}, $ 共享秘密的可能值是所有唯一值 $ A^b\pmod{p} $ ,其中 b 是某個整數。共享秘密也等於 $ B^a\pmod{p} $ ,其中 a 是某個整數。
因此,我們可以檢查共享密鑰的這些可能值中的每一個。我的問題是,我們如何檢查一個數字是否是正確的共享密鑰?
我的猜測是這樣的:
通常共享秘密用於對稱加密方案,其總體條款必須在公共渠道中邏輯上達成一致。因此,從我們的角度來看,我們會知道正在使用什麼類型的對稱加密,以及如何使用共享密鑰,因此可以嘗試使用每個可能的共享密鑰來解密給定消息,直到找到一個給我們原始資訊的消息,未加密的消息。但是我們必須知道原始的未加密消息應該是什麼樣子。
因此,我們可以檢查共享密鑰的這些可能值中的每一個。
在實踐中,共享秘密的可能值的數量太大,無法掃描所有可能的實用性 - 總是有更容易的攻擊。而且,正如您似乎猜對的那樣,基於 $ g, g^a \bmod p, g^b \bmod p $ 被認為是一個難題(實際上,我們稱之為“決策 Diffie-Hellman 問題”)
一種攻擊是採取 $ g $ 和 $ g^a \bmod p $ 並嘗試恢復 $ a $ (即解決離散對數問題)——一旦我們有 $ a $ ,我們可以計算 $ B^a \bmod p $ (這是共享的秘密),這就是共享的秘密。
另一種可能的方法是攻擊事物的對稱方面——我們完全忽略 DH 操作,只對對稱密鑰進行暴力攻擊。順便說一句:不知道確切的明文通常不是問題;即使我們不知道它到底是什麼,我們通常也足夠了解它以將其與隨機胡言亂語(這是您嘗試使用錯誤密鑰解密時得到的)區分開來 - 此外,如果您使用 AEAD算法,密鑰用於生成標籤(以及加密),標籤還可以用於區分正確的密鑰(即使明文確實是隨機亂碼)。
對於這兩種攻擊,我們通常選擇安全參數(例如 $ p $ 和對稱密鑰的大小)使這兩種方法都不可行。