Public-Key

AUTHENTICATED Diffie-Hellman 的逐步概念實現?

  • February 25, 2016

我已經在我的設置中使用預共享密鑰進行經典 DH,它可以防止知道相同密碼的人竊聽其他人的流量。但它不包括第三方向伺服器進行身份驗證,然後偽裝成伺服器到傳入客戶端的情況,執行身份驗證,然後透明地將進出伺服器的流量轉發給雙方,一直以來它都能夠隨意閱讀和修改。

Wikipedia 在其 DH 文章中包含了一半的解釋,說明了身份驗證/公鑰的風格是如何進行的,但一步一步地遵循會讓人感到困惑。據我了解,私鑰是 g^a%p=PUBKEY 然後對於每個單向加密消息,計算 g^b=ENCRYPTED_SECRET 並將其發送給 PUBKEY 持有者。

但是,我不明白 PUBKEY 持有者在收到後應該如何處理 ENCRYPTED_SECRET 以檢索 b,如果 b 確實應該被檢索的話。也不是這個公式應該是什麼,我對什麼取冪等等。

一步一步會有幫助。謝謝你。

最後我找到了我需要的資訊,謝謝大家的幫助。我把它留在這里以供將來參考。

密鑰生成:

生成一個隨機數 PRIVKEY 作為私鑰

g ^ PRIVKEY % p = PUBKEY 公鑰

公鑰加密的隨機數:

生成隨機 n 作為 nonce

PUB ^ n % p = 共享密鑰(發送方)

g ^ n % p = PUBVAL 公共值,這是通過可能不安全的通道發送的

共享秘密的私鑰解密:

PUBVAL ^ PRIVKEY % p = 共享密鑰(接收方)

然後可以將共享密鑰用作對稱加密密鑰來加密會話的其餘部分。

截獲 PUBVAL 並擁有 PUBKEY 的第三方仍然無法在不知道 n 的情況下推導出共享秘密,而 n 永遠不會被洩露。但是擁有 PRIVKEY 的人就沒有這個問題。

鑰匙尺寸:

p 安全素數模數遵循非對稱密鑰大小(2048、3072、4096 位…)

PRIVKEY,n 個隨機生成的數字必須是對稱安全的預期大小的兩倍(例如,128 位安全的 256 位大小的數字)

雙方都是公鑰持有者,所以我們稱他們為擁有私鑰的 A 和 B $ a $ 和 $ b $ .

DH 從概念上講(這是您可能已經知道的):

  • A:計算 $ g_a = g^a \pmod p $ 並將其發送給 B
  • B:計算 $ g_b = g^b \pmod p $ 並將其發送給 A
  • A:計算密鑰 $ K = g_b^a \pmod p = g^{ab} \pmod p $
  • B:計算密鑰 $ K = g_a^b \pmod p = g^{ab} \pmod p $

現在有幾種身份驗證方案可以驗證它們是否真的在相互交談。您可以查看X.1035 或 SPKE,這裡有完整的分步建議。

基本上我找到了兩種方法:

  • A 和 B 互相發送鹽的雜湊值、他們的公鑰、共享密碼和計算出的密鑰
  • DH參數( $ p $ 或者 $ g $ ) 依賴於共享密碼

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