我可以使用 ChaCha20-Poly1305 作為我的 KDF 嗎?
我有兩個使用 PSK 的設備。一種是嵌入式且資源極其有限。我已經在使用 ChaCha20-Poly1305,所以重用它是“免費的”。沒有傳輸加密層,一切都清楚並且有中間人。
我想建立一個 randomvalue/salt/kdf-base 並將其發送到其他設備進行身份驗證,這樣我就不會直接使用我的 PSK。雙方都知道 PSK,並使用此修飾符來更改其儲存的密鑰,並為轉發的數據包使用通用派生。
我的計劃是使用一些 KDF 將我的密鑰修改為臨時會話密鑰。
像這樣使用我現有的 AEAD 是否令人滿意:
nonce: the generated salt payload: empty additional data: empty (OR a flag of key type I want, NIST 800-108) key: my 16Byte PSK tag: The 16Bytes I will use as this session's temporary key
我覺得這樣做是給我一個加密安全的標籤,以防止我的真實 PSK 洩漏,鹽可以在這裡使用,也可以通過電線發送,所以另一方可以做同樣的事情並評估未來的身份驗證數據包。
這完全合法嗎?
由於您使用 ChaCha20 作為密碼,因此在其旁邊添加 BLAKE2 雜湊函式不應佔用太多資源。
BLAKE2 雜湊函式有 2 個變體:BLAKE2b 和 BLAKE2s。ChaCha20 使用 32 位字,更兼容 BLAKE2s。散列和密碼之間的唯一主要區別是移位/旋轉量,以及 HAIFA 散列壓縮函式的操作模式。
雖然@SAI_Peregrinus 有一個很好的建議,但我覺得它有點激進,所以如果你喜歡保守的方法,你可以實現一個額外的 BLAKE2 散列函式,用於你喜歡的任何基於散列的 KDF。
至於您最初的理想,我不推薦它,因為身份驗證器基於有偏模整數運算中的通用散列。
我通過使用不同的關鍵字在另一篇文章中找到了答案。重要的因素不一定是ChaCha20,而是由此產生的MAC/TAG。可以用作我的 KDF / 密鑰生成器嗎?
在這種情況下答案是肯定的,但在其他情況下也可能不是: 任何 MAC 都可以用作 KDF 嗎?
如果 MAC/TAG 輸出與輸入相比是 PRF 輸出,應該沒問題,但 MAC 不必按照定義。在 ChaCha20-Poly1305 的情況下,它是。與 Nonce、Key、Payload 或 Additional Data 上的任何和所有更改相比,輸出是隨機的。
我們嘗試的 HMAC KDF 具有相關的輸入 Key、Salt、Additional Data。AD 應該用於幫助生成多個子集密鑰的地方。
從我的研究來看,ChaCha20-Poly1305 似乎被用作
Nonce=Salt Key=PSK Payload=null AD=optional_derivative_data Tag=new_key
應該是加密安全的。雖然這不是這個功能的最佳用途。與真正的 KDF(如RFC-5869 )相比,這缺少的是指定密鑰大小的選項。就我而言,我將擁有一個 16Byte mac / new 密鑰,並且沒有其他選項。這適用於我已經使用 16B PSK 的應用程序。
我應該注意我進行所有這些工作的原因是我只是在這個受限設備上沒有快閃記憶體來支持我們需要的 ChaCha20-Poly1305 和我們想要的 SHA256-HMAC_HKDF。BLAKE2 和我們希望的其他選項也是如此。兩者都是未經優化編譯的大約 4K ROM。這將是對典型應用程序的輕微濫用,這需要為我們詳細記錄,但要麼這樣要麼什麼都沒有。