Aes

這是一個正確的密鑰交換實現嗎?

  • June 13, 2016

到目前為止,我一直在嘗試實現 Diffie Hellman 密鑰交換(我知道我可以堅持使用 SSL/TLS,但我想更深入地了解它),所以我創建了這個基本伺服器<->客戶端密鑰交換:

Generator and modulus are constants, thus same all the time
Generator is 3
Modulus is a 2048bit prime number

Step 1:
 1. Client connects to a server, asks for key exchange
 2. Server generates random 2048bit exponent
 3. Server rises generator to this exponent
 4. Server does modulo on result with 2048bit modulus
 5. Server sends result of modulo operation unencrypted to client

Step 2:
 1. Client receives result from server unencrypted in form of hex number
 2. Client generates random 2048bit exponent
 3. Client rises generator to this exponent
 5. Client sends this number to server unencrypted back
 6. Client rises server's number to client's exponent and does modulo op.
 7. Client remembers result as secret key (2048bit)
 8. Server receives this number, and rises it to it's own exponent and does modulo op.
 9. Server remembers result as secret key (2048bit)

Step3:
 1. Both client and server do SHA256 on secret key and get 256bit integer
 2. This 256bit key is used as private key for further AES/CBC/PKCS5 communication

所以我的問題是:

  1. 指數可以像現在一樣是隨機數還是應該是素數?
  2. 使用動態模數和生成器是更好的主意嗎?
  3. 有什麼可以改進此密鑰交換的方法還是有任何缺陷?
  4. 使用 SHA256 是為 AES/CBC 生成 256 位密鑰的正確方法嗎?

編輯:此密鑰交換的目的是用於伺服器和客戶端之間的 JSON 消息傳遞以及客戶端之間的 VoIP 中的端到端加密(這完全是出於自學目的,我知道我可以堅持使用 WebRTC/DTLS 或任何現有的協議! )

指數可以像現在一樣是隨機數還是應該是素數?

僅選擇質數指數並沒有特別的優勢。

使用動態模數和生成器是更好的主意嗎?

使用動態模數是否有意義目前正在爭論中。有一些已知的算法使得在相同模數下攻擊多個離散對數問題並不比攻擊一個更昂貴。因此有些人聲稱你應該改變模數(不要給 TLA 一個單一的攻擊目標)。其他人說,如果您使用足夠大的模數(並且 2048 位似乎足夠大),這不是問題(此外,生成隨機模數會增加複雜性,這本身就是一個安全問題)。

至於生成器,我們知道答案是“不,它沒有幫助”。可以證明,一個特定的基礎並不(很多)比隨機基礎(相同順序)弱;也就是說,如果您可以用一個基數解決 DLog 或計算 Diffie-Hellman 問題,則可以利用它來解決任何基數(相同順序)的相應問題。選擇一個你知道有一個大素數順序的生成器(可能有一個小的輔因子)更為重要。

有什麼可以改進此密鑰交換的方法還是有任何缺陷?

當然也有缺陷。

您聲明模數是“素數”;這對 Diffie-Hellman 來說還不夠;相反,您需要知道它包含一個大素因子的子組(即 $ p-1 $ 有一個很大的素因數 $ q $ ).

您使用生成器“3”。小型生成器可能很強大(事實上,“2”是一種流行的選擇),但是您應該確保“3”具有較大的素數階(即,它生成一個大小為大素數的子群)。一種明顯的方法是選擇素數 $ p=2q + 1 $ 為素數 $ q $ ; 與 $ p \equiv 11 \pmod{12} $ ; 如果兩個要求都為真,那麼“3”將生成一組大小 $ q $ .

您使用 2048 位指數;這比您需要的要貴得多;您進行上述檢查(確保子組 $ g $ 生成大且質數),那麼 256 位指數就足夠了(並且快 8 倍)。

您不進行任何身份驗證;這意味著可以修改消息的中間人可以將自己插入到對話中並收聽。

您讓伺服器執行第一次模冪運算,並且在任何客戶端驗證之前;這會引發明顯的拒絕服務攻擊。

使用 SHA256 是為 AES/CBC 生成 256 位密鑰的正確方法嗎?

你是如何為 MAC 生成密鑰的(你使用的是帶有 AES/CBC 的 MAC,不是嗎???)

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