Diffie-Hellman“握手”與 RSA“握手”
我有一個關於交換對稱密鑰的問題。我讀過一些關於 Diffie-Hellman 算法的東西,其中兩方獨立生成共享密鑰,在生成之前隻共享它的一部分。
一般來說,我想我明白這是如何工作的,但是如果伺服器從客戶端請求公共 RSA 密鑰,使用這個公共密鑰加密對稱密鑰,並將其發送回客戶端,這不是更容易嗎?
希望您能提供幫助,並在此先感謝您。
fre3zr
使用客戶端的 RSA 公鑰加密伺服器生成的會話密鑰是可能的,但有幾個缺點:
如果將來客戶端的 RSA 私鑰洩露,過去的通信會話可以被破譯;沒有前向保密,就像在某些 Diffie-Hellman 變體中一樣。獲得該理想屬性的唯一選擇是為每個交換使用一個新的 RSA 密鑰對,但隨後
客戶端不參與會話密鑰的生成,因此可能容易受到重放,並且對會話密鑰的信心不足(一個生成器比兩方實現的兩個生成器的組合更容易卡住或熵低) .
客戶端的 RSA 解密比整個 Diffie-Hellman 交換所需的計算密集程度要高得多(如果該簽名是基於 RSA 的,則前向保密所需的 RSA 公鑰的簽名也是如此)。如果 DH 是在一個組上執行的,那就是真的 $ \mathbb Z_p $ (請注意,對於可比較的安全性,RSA 和 DH 中的模數具有相同的數量級,但 RSA 中的解密指數與模數一樣多,而在 DH 中它可以短得多;我們說的是例如 2048 與256 位和相應的性能差距;使用RSA CRT並不能完全抵消);如果我們對 DH使用橢圓曲線組,則性能差異可能會更大。
這確實是可能的,但是這樣做有一個主要缺點,即 RSA 密鑰生成速度很慢。
您必須生成兩個大素數,這是通過選擇隨機奇數並檢查它們是否為素數來完成的。一個數字的機率 $ x $ 主要是在附近 $ 1/\log_e(x) $ . 這意味著一個機率 $ n $ - 素數的位數在附近 $ 1/0.3n $ . 找到兩個 $ 1024 $ -位素數將需要幾百次,這需要相當長的時間。
Diffie-Hellman——是否在沼澤標準素數域中 $ \mathbb{F}_p $ 或者在一些花哨的橢圓曲線上 $ \mathbb{E}(;\cdot;) $ - 使用均勻分佈的組元素,僅比 PRNG 中的隨機字元串更難找到,這使得此選項比生成臨時 RSA 密鑰更有效。
如果出現量子電腦,那麼您討論的方法是在 TLS 握手中替換 Diffie-Hellman 的最直接方法,因為我所知道的算法提供加密和 - 偶爾 - 簽名,但沒有像 Diffie-Hellman .