來自連續雜湊的流密碼密鑰流
我目前正在研究加密貨幣,想知道以下過程會出現什麼問題……
我想加密一條長消息 $ M $ 具有短對稱密鑰 $ K $ 和一個公共隨機數 $ X $ .
這個想法是增加長度 $ K $ 具有連續的雜湊 $$ K’ = H(X\mathbin|K) \mathbin| H(H(X\mathbin|K)) \mathbin| \cdots $$ 直到 $ length(K’) = length(M) $ .
然後加密 $$ M’ = X \mathbin| (M \oplus K’). $$
我並不是說我會使用它而不是使用 libsodium 之類的東西。
但我想對流密碼有一些我能完全理解的直覺。
這種方法有什麼根本性的問題嗎?是否可以通過最小的更改來調整這種方法以使其不被破壞?
擬議計劃的不安全性
它並不像看起來那麼安全,在現代密碼學標準中它是完全不安全的。它容易受到基本的已知明文攻擊 (KPA) 的攻擊,在現代密碼學中,我們希望密碼至少能夠抵禦選擇的明文攻擊 (CPA)或更好的 Ind-CPA。
現在接受這個想法
$$ K’ = H(X\mathbin|K) \mathbin| H(H(X\mathbin|K)) \mathbin| \cdots. $$
如果第一個輸出存在已知明文塊 $ H(X\mathbin|K) $ 然後攻擊者可以一次又一次地散列(有時寫為 $ H^s(X\mathbin|K) $ ) 在不需要密鑰的情況下顯示其他人。因此,您的設計未通過下一位測試,即您的密鑰流的下一位可以 100% 預測。已知塊不限於第一個塊,它可以在除最後一個塊之外的任何地方。可以計算已知塊之後的所有輸出密鑰流。先前的塊通過散列函式的原像抗性得到保護。
Hash 的 CTR 模式
相反,我們使用了 CTR 模式($$ 1 $$因為它是為 PRF 設計的——偽隨機函式——(這裡我們假設 $ H $ 是 PRF)。CTR 模式是 CPA 安全的。
$$ H(k,0) \mathbin| H(k,1) \mathbin| \cdots \mathbin| H(k,\ell) $$在哪裡 $ \ell $ 是您的消息大小除以輸出大小的數字 $ b $ 的 $ H $ IE $ \ell = len(m) / b $
CTR 模式不需要 PRP(Pseudo-Random Permutation,尚未證明,但是,如 AES),因為它不需要反向加密。例如,參見 ChaCha20。一些受限的環境為實現節省了大量空間。
將此方案轉化為OFB模式
OFB 模式也是 CPA 安全的(ECB 不是)。OFB 將流生成為 $ O_j = E_k(O_{j-1}) $ 和 $ O_0 = IV $ . 加密執行為 $ C_j = P_j \oplus O_j $
正如SEJPM在評論中指出的那樣;讓我們定義 $ H’(m)=H(m|K) $ 並產生類似於OFB的密鑰流。
$$ K’=H’(X)\mathbin| H’(H’(X))\mathbin| \ldots $$請注意,在每一步中,都會再次添加密鑰。所以攻擊者需要從已知的輸出流中處理密鑰。假設使用的雜湊是一個隨機 Oracle (RO),那麼這會將其轉換為 PRF,然後我們可以使用安全參數 OFB。