在公共渠道中保持機密性和完整性
假設我有兩個人正試圖在公共頻道中交談 $ A $ 和 $ B $ 他們希望保持機密性和完整性。
他們想使用哪種加密算法?對稱,還是基於公鑰?此外,什麼類型的算法套件最好,密鑰大小是多少?
據我了解,鑑於通道是公開的——因此被認為是不受保護的——他們必須先使用公鑰,然後再發送對稱密鑰,從而保護通道。關於密鑰交換,他們可以使用 Diffie Hellman 或 RSA,以及對稱密鑰 MAC。
這個對嗎?他們能做得更容易嗎?有沒有更安全的方法?
他們想使用哪種加密算法?
這將取決於具體情況。要選擇算法,應該(至少)問自己以下問題:
您信任哪些標準?您必須使用哪個標準?你能負擔得起哪些計算?
對稱,還是基於公鑰?
這又取決於情況。通常你會使用兩者的組合,但是有一些有效的案例可以只使用公鑰加密(通常是非常短的消息)和只使用對稱加密,通常是在性能受到限製或共享秘密已經存在的情況下已建立(即使用嵌入式設備或在會話恢復場景中)。
還有什麼類型的算法套件最好,密鑰大小是多少?
算法實際上取決於給定的情況。然而,通常使用 128 - 256 位對稱加密、256 - 512 位散列函式、256 - 512 位橢圓曲線和/或 2048 - 4096 位經典非對稱加密(RSA、DSA…)。
考慮您的第三段:
簡而言之,您是對的。您首先使用非對稱加密(RSA 或 (EC)DH)協商對稱密鑰,然後使用對稱加密來保護您的有效負載。你所描述的基本上是*機會加密*,因為任何一方都沒有採取措施來保證對方的真實性。這意味著中間人攻擊肯定是可能的,因此主動攻擊者可以破壞該計劃。
有沒有更安全的方法?
有:傳輸層安全性(TLS)。
TLS 是安全實時數據傳輸的標準解決方案,甚至有一些很好的安全證明。TLS 可以處理您可能遇到的所有情況:您可以使用預共享密鑰,您可以使用密碼(通過SRP)對伺服器進行身份驗證,您可以僅使用證書(或僅公鑰)一方或雙方,甚至被廣泛部署,著名的庫有OpenSSL、LibreSSL、BoringSSL等。