我正在編寫一個大量使用密碼學的應用程序。像大多數網絡應用程序一樣,我們將數據分解成不同類型的消息(即時消息,文件塊,視頻幀等) - 每一個都必須檢查真實性以防止篡改和正確的來源。到目前爲止,我可以使用ECDH來協商我已經用於AES的共享密鑰。當然,以後可以使用相同的共享密鑰。數字簽名與HMAC的密鑰通過DH
我的問題是:在這種情況下,使用ECDSA來簽署每條消息是否有額外的好處,而不是簡單地使用ECDH與HMAC建立的共享密鑰?
下面,當我說M時,我的意思是加密的信息或明文;它應該沒關係。請更正以下任何錯誤。
據我所知,在ECDSA(或DSA)通常哈希有一個安全散列算法(我目前使用SHA-2的一個),H(M)
消息(M
),然後使用簽名者的私有密鑰來加密H(M)
。這產生了R
和S
整數(簽名)。然後,M,R和S被髮送給已經擁有發件人公鑰的收件人。計算H'(M)
,並使用R
和S
驗證簽名。 BouncyCastle提供了ECDSASigner
它實現了這一點。
在HMAC中,我需要共享密鑰。然後:
HMAC(K, M) := H(f2(K) || H(f1(K) || M))
(謝謝你的糾正,聖保羅Ebermann見他對細節的答案。)
因此,考慮到DH/ECDH安全地協商共享的祕密,有一個原因,我不應該使用HMAC?
相關:爲什麼NSA爲DSA指定標準算法而不是MAC?僅僅因爲它可以是SHA-2 + AES?
速度在這裏很重要因爲我希望這個協議不僅支持現在的文本消息,還支持不久的將來的大文件和視頻幀。因此,我更喜歡使用HMAC,但希望確保能達到上述目標。
感謝您的幫助!
GCM剛剛引起我的注意。感謝您強調這一點 - 它看起來像BouncyCastle實現它在org.bouncycastle.crypto.modes – Hut8 2011-04-16 00:27:22
我剛剛閱讀[GCM規範](http://csrc.nist.gov/publications/nistpubs/800-38D /SP-800-38D.pdf)。看起來,除了正常計數器模式和密文的密鑰散列(而不是純文本,至少在SSH中使用HMAC)外,沒有什麼別的了。這裏的認證標籤在原理上與您在問題中描述HMAC的方式非常相似(仍然不解密,雙方都對S進行加密並且接收方將結果進行比較)。 – 2011-04-16 01:12:45