Authenticated-Encryption
如何在 libsodium 的公鑰認證加密中添加“附加數據”?
我注意到 libsodium在使用對稱加密時提供了 AEAD 。
然而,在第 8 節(公鑰密碼術)下,沒有描述允許包含附加數據 (AD) 的公鑰方法。
牢記加密最佳實踐,是否有一種優雅的方法可以將附加數據的功能本質上添加到像 crypto_aead_chacha20poly1305_encrypt 這樣的公鑰加密 AE 方法中?也就是說,假設 libsodium 建構塊保持原樣。如何添加以明文形式發送的附加資訊,這些資訊將成為經過身份驗證的消息的一部分?
我很好奇現在沒有這種方法是出於什麼特殊原因。
在內部,libsodium 公鑰加密使用與(非AEAD)密鑰認證加密相同的原語,即 XSalsa20 和 Poly1305。libsodium 所基於的 NaCl 根本沒有 AEAD 介面。相反,libsodium 從TLS 草案中添加了它。對於這些原語的公鑰 AEAD 使用沒有類似的參考,因為在 TLS 中,它們預計將與協商的密鑰一起使用。這是我對 libsodium 中不存在它的主要原因的猜測。
順便說一句,公鑰 AEAD 的案例總體上似乎有點薄。通常,AEAD 中的附加數據用於非機密但必須與特定消息相關聯的協議資訊。例如,在 TLS 中,它包括序列號和壓縮細節。但是,如果您有一個發送多條消息的協議,您實際上並不希望對每條消息使用公鑰加密,而是使用會話密鑰和對稱加密。
您可以通過多種方式建構自己的:
- 最簡單的方法是在要加密的消息中包含附加數據。當然,如果你還需要明文發送,那就太浪費了,而且你只能在解密後進行驗證。您可以通過在消息中僅包含數據的散列來避免重複長數據。
- 或者,您可以簽署加密消息 + 附加數據。這需要一個簽名密鑰對,其公鑰為接收者所知。它還增加了相當多的成本。但是,它確實允許在解密之前驗證附加數據。
- 最後,您可以協商一個對稱密鑰並使用 libsodium 中已經存在的 AEAD 密碼。簡單地生成一個隨機對稱密鑰並使用經過公鑰驗證的加密對其進行加密就可以了,但也有更複雜的想法,具體取決於您需要哪種安全性。
注意:目前包含的基於草案的 AEAD 密碼僅使用 8 字節隨機數,它太短而無法安全隨機生成。更高版本的 libsodium 將包含具有更長隨機數的更新版本。