Key-Derivation

如果僅更改迭代次數,PBKDF2 派生密鑰是否相關?

  • July 9, 2018

我想用密碼加密我的磁碟。

為了從密碼生成一個不錯的密鑰,我使用了 PBKDF2,它應用了一個雜湊函式ķ $ k $ 次到明文並輸出最終結果。

當我修改加密數據時,我會對其進行解密、修改並重新加密。

當我重新加密時,我計劃通過在密鑰派生過程中增加 PBKDF2 迭代次數來使用不同的密鑰(即將描述),即ķ $ k $ 在前面的描述中,因此加密密鑰與以前的加密不同。

我導出密鑰如下。

ķd和r一世在和d=磷乙ķDF2(p一個ss在○rd,r一個nd○米_s一個l噸) $ \mathsf{K}_\mathsf{derived} = \mathsf{PBKDF2}(\mathsf{password}, \mathsf{random_salt}) $ ,它根據使用者輸入的密碼構造一個密鑰。

ķ米一個s噸和r=HķDF-和X噸r一個C噸(ķd和r一世在和d,‘‘沒有鹽’’) $ \mathsf{K}\mathsf{master} = \mathsf{HKDF\text{-}Extract}(\mathsf{K}\mathsf{derived},\texttt{‘’no salt’’}) $ ,它派生一個帶有空鹽的主密鑰。

ķd一個噸一個=HķDF-和Xp一個nd(ķ米一個s噸和r,‘‘AES-KEY’’) $ \mathsf{K}\mathsf{data} = \mathsf{HKDF\text{-}Expand}(\mathsf{K}\mathsf{master}, \texttt{‘‘AES-KEY’’}) $ ,它為 AES 加密磁碟數據派生一個對稱密鑰。推導使用鹽’‘AES-KEY’’ $ \texttt{‘‘AES-KEY’’} $ .

其中 PBKDF2 使用 SHA-256,HKDF-HMAC 函式是 HMAC-SHA256。

我設置了 PBKDF2 的參數,使得滿足以下兩個條件:

  1. 初始的 PBKDF2 迭代次數足夠大,使得密鑰推導至少需要 1 秒。
  2. 每次對消息重新加密時,PBKDF2 的迭代次數至少增加 1 次。

我的問題是:

密鑰是否源自相同的密碼,但在 PBKDF2 中具有不同的輪數,在計算上是否相關?


如果有關係,我使用 AES-CBC 加密,數據不超過 1 GB,我只對數據保密感興趣。

PS 我對推出自己的加密貨幣並不認真,我只是想看看我認為這是安全的預感是否正確。

保持迭代不變,它們應該由 CPU 時間決定。

而是為每次加密提供不同的隨機鹽PBKDF2,您可以將鹽連接到加密數據,它不需要保密。

當然,對於 CBC,您還需要為每個加密提供一個新的隨機 IV,它也可以連接到加密。

您還應該 MAC 加密數據,以便您可以確定解密成功,即使用了正確的密鑰。

不要指望 PBKDF2 進行不同的迭代次數C $ c $ 不相關;有一些例外。相反,為不同的用途更改鹽的固定寬度部分(例如第一個字節)。

如果出於某種正當原因(安全升級)必須更改迭代計數C $ c $ ,至少保持平衡;或禁止C=1 $ c=1 $ ,並且總是增加C $ c $ 超過1 $ 1 $ .

可以關聯不同的值磷乙ķDF2(磷一個ss在○rd,R一個nd○米_s一個l噸,C一世,dķ大號和n) $ \mathsf{PBKDF2}(\mathsf{Password}, \mathsf{Random_salt},c_i,\mathsf{dkLen}) $ 與不同C一世 $ c_i $ 至少當

  • 磷一個ss在○rd $ \mathsf{Password} $ 已知或猜測(R一個nd○米_s一個l噸 $ \mathsf{Random_salt} $ 只需要在迭代次數變化時保持不變);

  • 和dķ大號和n $ \mathsf{dkLen} $ 至少是散列的寬度,或接近它(允許猜測其餘部分);

  • 並且至少滿足以下一項:

    • 最小的C一世 $ c_i $ 是 1
    • 二C一世 $ c_i $ 是連續的整數,另一個更高。

除此之外,我看不出我們如何在不猜測的情況下做出這些相關性磷一個ss在○rd $ \mathsf{Password} $ 和R一個nd○米_s一個l噸 $ \mathsf{Random_salt} $ . 我不要求證明。


理由:限制在dķ大號和n $ \mathsf{dkLen} $ 等於散列的寬度H $ \mathsf H $ , 磷乙ķDF2-H米一個C-H(密碼,小號一個l噸,C)=在1⊕在2⊕…在C

$$ \mathsf{PBKDF2\text{-}HMAC\text{-}H}(\text{Password}, \mathsf{Salt},c)=U_1\oplus U_2\oplus\ldots U_c $$和 在1=H米一個C-H(磷一個ss在○rd,小號一個l噸‖00000001)在2=H米一個C-H(磷一個ss在○rd,在1)⋯在C=H米一個C-H(磷一個ss在○rd,在C−1)$$ \begin{align} U_1&=\mathsf{HMAC\text{-}H}(\mathsf{Password}, \mathsf{Salt}\mathbin|\mathtt{00000001})\ U_2&=\mathsf{HMAC\text{-}H}(\mathsf{Password}, U_1)\ \cdots\ U_c&=\mathsf{HMAC\text{-}H}(\mathsf{Password}, U_{c-1}) \end{align} $$ 當一個C一世 $ c_i $ 是1 $ 1 $ ,輸出為在1 $ U_1 $ 如果知道磷一個ss在○rd $ \mathsf{Password} $ 很容易計算在j $ U_j $ 對於任何j>0 $ j>0 $ ,因此任何迭代計數的 PBKDF2 的值。

當兩個C一世 $ c_i $ 是C $ c $ 和C+1 $ c+1 $ , 對應的 PBKDF2 的 XOR 為在C+1 $ U_{c+1} $ 如果知道磷一個ss在○rd $ \mathsf{Password} $ 很容易計算任何在j $ U_j $ 為了j>C $ j>c $ ,因此任何迭代計數的 PBKDF2 的值C′≥C $ c’\ge c $ .


有趣的事實:只知道磷乙ķDF2-H米一個C-小號H一個1(磷一個ss在○rd,小號一個l噸,C,20) $ \mathsf{PBKDF2\text{-}HMAC\text{-}SHA1}(\mathsf{Password}, \mathsf{Salt},c,20) $ 為了C∈{9999990,9999991,9999992} $ c\in{9999990,9999991,9999992} $ , 測試密碼猜測需要一個H米一個C-小號H一個1 $ \mathsf{HMAC\text{-}SHA1} $ ;小號一個l噸 $ \mathsf{Salt} $ 是無關緊要的。

道德:保持迭代計數C $ c $ 甚至是有道理的。

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