如何防止 RSA 密鑰交換被篡改?
公鑰由
(N, e)
whereN
是兩個大素數的乘積來定義,並且e
被選擇為使Euler 的總函式e.d = 1 (mod phi(N))
在哪裡。是加密指數,是解密指數。phi(N)``e``d
假設
x
是加密為 的對稱密鑰c = x^e mod(N)
。c
如何防止篡改此密文?
如問題下方的評論所示,RSA 通常不用作對稱密鑰的模冪運算。相反,密鑰要麼使用 PKCS#1 v1.5 填充或 - 最好 - OAEP 加密,要麼使用範圍內隨機值的共享密鑰進行加密 $ \big[0, N\big) $ 用於模冪運算。在後一種情況下,實際密鑰是使用 KDF(密鑰導出函式)導出的,有時也簡稱為“PRF”(參見例如 TLS 1.2)。這稱為 RSA-KEM。
基本上有兩種方法可以避免通過中間人 (MitM) 攻擊篡改密鑰:
- 建立對 RSA 公鑰的信任;
- 驗證共享密鑰和/或派生密鑰。
如果您預先共享並信任靜態密鑰對的公鑰,那麼您將進行靜態密鑰交換,即公鑰是可信的,但您不會提供前向安全性。這意味著如果攻擊者知道私鑰,則可以計算每個後續的對稱密鑰。
公鑰的信任可以通過不同的方式建立。對於靜態密鑰對,可以使用 PKI 信任公鑰。如果您需要信任臨時公鑰,接收方可以使用私鑰對其進行簽名,該私鑰是受信任的密鑰對的一部分。
另一種方法是事後驗證已建立的會話密鑰。這可以顯式或隱式地完成。
在共享秘密的顯式驗證中,解密密鑰的一方使用它在雙方已知的靜態數據上生成 MAC 並發送 MAC。該方現在可以確定已經建立了正確的對稱密鑰。
在隱式驗證中,密鑰僅用於來回發送經過身份驗證的消息。這些包的認證驗證表明正確的密鑰已經建立。
當然,只有公鑰受信任的一方被認證。同樣,如果驗證了任何 MAC,則僅表明持有私鑰的一方已經能夠解密。因此,如果您需要對剩餘方進行身份驗證,則需要單獨處理。
在 TLS 中,這是通過簡單地讓另一方創建可以驗證的簽名來執行的。這也需要事先信任該密鑰對的公鑰;最後,您需要始終建立對某事的信任,然後才能驗證該方。
很少使用 TLS 客戶端身份驗證。相反,它被身份驗證框架或基於密碼的身份驗證所取代。或者根本無法確定客戶的身份 - 直到無論如何都進行了購買。
請注意,使用 RSA 密鑰建立建立的密鑰的身份驗證與使案例如 Diffie-Hellman 建立密鑰沒有什麼不同 - 儘管後者需要考慮兩個密鑰對。最後,可以使用相同的技術。