Aes

使用 Diffie-Hellman 密鑰交換的 AES 加密

  • November 4, 2016

我有兩個系統需要通過 AES-128 加密它們的通信。AES 加密的密鑰應與 Diffie-Hellman (DH) 算法交換。

現在,我已經閱讀了有關 DH 的內容,並且在我的腦海中留下了很多問號。這些是我的問題:

  1. 通常使用 AES-128,您需要密碼和從密碼生成的密鑰。與 DH 交換的究竟是什麼,是密碼還是密鑰?換句話說,Alice 和 Bob 將計算出的秘密是什麼?
  2. 如果我對 DH 使用 1024 位素數和 256 位私有密鑰,則計算出的密鑰將比 AES-128 所需的 128 位多得多。如何轉換密鑰以匹配所需的 128 位?是否有標準來做,因為這兩個系統使用不同的程式語言?

你看,有很多混亂。也許你可以幫助我並闡明它。

AES 中沒有與密碼相關的內容。AES 使用 128 位密鑰,即 128 位序列。你如何想出這樣的密鑰超出了 AES 的範圍。在某些情況下,您希望以一種確定性的方式從密碼(可能還有一些公開的上下文數據,如“鹽”)生成這 128 位;這是密碼雜湊的工作。在其他情況下,特別是您正在談論的情況,沒有密碼。

Diffie-Hellman中,計算以大素數p為模,得到的共享秘密是一個以**p為模的整數,即範圍從0p-1的值。這個值有一些“結構”,所以你不應該盲目地截斷它。“安全”的方法是對該值的編碼應用散列函式,例如 SHA-256。然後散列函式輸出應該用作鍵(可能會截斷以獲得適當的長度;在這一點上,這是安全的)。有一些標準詳細描述了這樣的過程。


當然,您正在重新發明自己的自製 SSL,這通常是一個非常糟糕的主意(除非您是出於教學原因,例如作為家庭作業)。一個真正安全的協議將需要密鑰交換、適當的對稱加密、完整性檢查和至少單方面的身份驗證,因此您必須組裝至少三種加密算法。無論是在設計中還是在實施中,每一個細節都可能危及您的安全。這很難。數百名最優秀的密碼學家花費了 20 年的辛勤勞動,才提出了一個相當安全的SSL版本。

所以有一個標準,它被稱為 TLS(SSL 的“標準”名稱)。

我將嘗試簡化事情:

  1. 初步:當您使用密碼(例如 AES)加密數據時,您需要為其提供密碼。密碼算法採用(在內部 - 您無需以程式方式執行任何操作)密碼並通過對其應用一些加密算法從中生成密鑰。此密鑰生成內部階段的目的是通過散列“混淆”您的密碼,並具有適合密碼算法的適當長度的密鑰。然後密碼在內部使用該密鑰來實際加密您的數據。

現在,Alice 和 Bob 需要交換一些共享秘密,以便雙方都可以使用對稱密碼(例如 AES)加密/解密數據。如果您使用 DH 算法交換共享密鑰,則此密鑰可以用作 AES 密碼的密碼,或者是更強密碼生成算法(如 BPKDF2)的“種子”密碼(您在此處單獨使用 BPKDF2生成更強密碼的程序 - 不要在這裡與名稱的“KDF”-“密鑰派生函式”部分混淆,因為您僅使用它來生成強密碼,而不是 AES 的“密鑰”)。 2. 我現在不想就用於 DH 交換的比特數發表意見——Pornin 先生是這裡的專家,所​​以聽從他的建議——但是要將 DH 秘密結果用作密碼,你可以使用PBKDF2 算法並要求它生成所需的密碼長度,或者(與 PBKDF2 相比是一種較弱的方法)只需使用良好的雜湊函式(例如 SHA256)對 DH 密碼進行雜湊處理,並使用最左邊的 32 或 64 個十六進製字元作為 AES 的密碼-128 或 AES-256 算法。

SHA256 等常見的散列函式算法可用於許多程式語言。

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