Public-Key

使用 HKDF 或 SCrypt 派生子密鑰會更好嗎?

  • May 3, 2020

好的,所以我正在嘗試從 EC 公鑰派生一個子公鑰。我想出了幾個想法,現在我想知道哪個更安全。

Mp:主密鑰對,這包括一個私鑰(表示為 Mpri)和一個擴展的公鑰(表示為 Mpub,稍後會詳細介紹)。

i:來自使用者的某種輸入,它可能是也可能不是隨機/高熵。

P: i 的 RIPEMD160 雜湊。

現在有一個 CKD(子密鑰派生)函式將返回 512 位(來自 HMAC-SHA512 或 SCrypt)。前 256 位將是密鑰,而後 256 位將是鏈碼(表示為 C)。總共 512 位是擴展公鑰。

我可以使用 HMAC-SHA512(Key = C, Data = P),或者我可以使用 SCrypt(Password = P, Salt = C, N = 2^16, p = 1, dLen = 512) 或 SCrypt(Password = P || c, Salt = null, N = 2^16, p = 1, dLen = 512) 從前一個密鑰派生新密鑰。

一個父級可能有多個子鍵(想想每個分支有多個葉子),因此 C 的值可能不會改變,而 i (和 P)的值會改變。

哪個最安全?提供 N 和 p 的其他值會使 SCrypt 成為比 HMAC-SHA512 更好的選擇;如果是這樣,這些值是什麼?兩者中哪個 SCrypt 選項更好?SCrypt 重複加鹽/不加鹽的可能性是否使 HMAC-SHA512 成為更好的選擇?

SCrypt 是一個基於密碼的密鑰派生函式或 PBKDF。一般來說,如果您的輸入已經是一個鍵,則您不需要這樣的功能。在這種情況下,您需要一個基於密鑰的密鑰派生函式 - KBKDF。

目前最好的 KBKDF 可能是HKDF。這可以採用密鑰(例如公鑰),info(例如 $ i $ 或散列 $ i $ ) 和可能的鹽。由於它基於 HMAC,因此幾乎不需要提前執行任何散列(因此使用特定的編碼 $ i $ 就足夠了)。

對於位完全隨機的密鑰材料,您也可以只使用 HKDF-Expand(HKDF 的第一部分,HKDF-Extract 只是壓縮密鑰材料中的隨機位,以防它們分佈不均)。

引用自:https://crypto.stackexchange.com/questions/31557