2011-04-15 61 views
3

我正在編寫一個大量使用密碼學的應用程序。像大多數網絡應用程序一樣,我們將數據分解成不同類型的消息(即時消息,文件塊,視頻幀等) - 每一個都必須檢查真實性以防止篡改和正確的來源。到目前爲止,我可以使用ECDH來協商我已經用於AES的共享密鑰。當然,以後可以使用相同的共享密鑰。數字簽名與HMAC的密鑰通過DH

我的問題是:在這種情況下,使用ECDSA來簽署每條消息是否有額外的好處,而不是簡單地使用ECDH與HMAC建立的共享密鑰?

下面,當我說M時,我的意思是加密的信息或明文;它應該沒關係。請更正以下任何錯誤。

據我所知,在ECDSA(或DSA)通常哈希有一個安全散列算法(我目前使用SHA-2的一個),H(M)消息(M),然後使用簽名者的私有密鑰來加密H(M) 。這產生了RS整數(簽名)。然後,M,R和S被髮送給已經擁有發件人公鑰的收件人。計算H'(M),並使用RS驗證簽名。 BouncyCastle提供了ECDSASigner它實現了這一點。

在HMAC中,我需要共享密鑰。然後:
HMAC(K, M) := H(f2(K) || H(f1(K) || M)) (謝謝你的糾正,聖保羅Ebermann見他對細節的答案。)

因此,考慮到DH/ECDH安全地協商共享的祕密,有一個原因,我不應該使用HMAC?

相關:爲什麼NSA爲DSA指定標準算法而不是MAC?僅僅因爲它可以是SHA-2 + AES?

速度在這裏很重要因爲我希望這個協議不僅支持現在的文本消息,還支持不久的將來的大文件和視頻幀。因此,我更喜歡使用HMAC,但希望確保能達到上述目標。

感謝您的幫助!

回答

4

DSA的一個缺點是你需要一些很好的隨機字節來簽名。即使是使用不好的隨機源,您的私鑰也可以從簽名中重構。對於一個MAC,你必須簽署很多消息,所以你需要大量的隨機數。如果你沒有硬件生產這些,你將用完熵。

HMAC不需要任何隨機數(這是確定性的)。

此外,我認爲HMAC將比使用DSA更有效率,但您可以(也應該)衡量這一點。


關於「正確的錯誤」:您對HMAC的描述不太正確 - 沒有「解密」。它更像這樣:

您有消息M,散列函數H和共享密鑰K。添加兩個公共函數f1f2(這些是一些簡單的XOR +填充)。然後

HMAC(K, M) := H(f2(K) || H(f1(K) || M)) 

||是簡單的級聯。發送方和接收方執行相同的計算,發送方向他發送消息,然後接收方將其結果與發送的結果進行比較。 (確保以不允許計時攻擊的方式進行比較,即比較所有內容,即使已經發現它不匹配。)

HMAC的確切定義在RFC 2104中,其中還包含一些說明人物。


關於這個問題:

相關:爲何NSA指定標準算法DSA,而不是MAC?

我真的不知道,但這裏是一個想法:

的鏈接列表也提到了「Galois Counter Mode」爲TLS (RFC 5288)SSH (RFC 5647),這是說來保護機密性和完整性的一個。因此,不再需要單獨的MAC。 (這是我第一次讀這篇文章,所以我現在無法判斷這個。)

+0

GCM剛剛引起我的注意。感謝您強調這一點 - 它看起來像BouncyCastle實現它在org.bouncycastle.crypto.modes – Hut8 2011-04-16 00:27:22

+0

我剛剛閱讀[GCM規範](http://csrc.nist.gov/publications/nistpubs/800-38D /SP-800-38D.pdf)。看起來,除了正常計數器模式和密文的密鑰散列(而不是純文本,至少在SSH中使用HMAC)外,沒有什麼別的了。這裏的認證標籤在原理上與您在問題中描述HMAC的方式非常相似(仍然不解密,雙方都對S進行加密並且接收方將結果進行比較)。 – 2011-04-16 01:12:45