Encryption

這種加密和 MAC 的可流式組合是否安全?

  • June 2, 2012

我想結合加密和MAC。

對於加密,我使用帶有 CBC 和 PKCS5Padding 的 AES-256。對於 MAC,我使用 HmacSHA512。

我使用 Encrypt-then-Mac 方法(通過密文計算 MAC 並將其與密文一起傳遞)

該算法應該能夠處理流數據,如果我對整個密文計算一次 MAC,則有兩種可能性:

  • 將 mac 添加到密文中:

這是一個非常糟糕的主意,因為加密部分必須對整個文本進行加密,然後才能輸出 mac。因此它不是可流式傳輸的。在解密時,我們必須在知道是否被洩露之前處理整個密文(也不是完全可流式傳輸的)。

  • 將mac附加到密文中:

更好的主意,但解密部分最終只能檢查MAC。在此之前,它確實輸出了許多可能被攻擊者更改的字節,或者它必須等到它看到 MAC(不能再次流式傳輸)。

所以我需要一個解決方案,將密文分成幾部分,然後為每個部分計算一個 MAC。因為密文不應該比明文大很多,所以我選擇了一個大於加密塊大小的 MAC 塊大小(例如 4 kB)。

我想使用類似的模式(與 $ c_X $ = 密文的 X 部分, $ m_i $ = MAC 的 X 部分):

$$ m_1 || IV || c_1 || m_2 || c_2 || m_3 || c_3 || \dots $$ 第一個MAC的計算很清楚( $ k $ 是 MAC 密鑰):

$$ m_1 = MAC(k, IV || c_1) $$ 但後來我們遇到了問題。如果我們只是使用

$$ m_X = MAC(k, c_X), $$ 這不安全。攻擊者可以按順序更改塊,他可以復製或刪除整個塊,等等。

於是我想到了一個類似CBC模式的加密構想:

$$ m_X = MAC(k, m_{X-1} || c_X) $$ 這現在安全嗎?和這個有區別嗎?

$$ m_X = MAC(k, c_1 || … || c_X) $$

看起來您的協議出於完整性目的是安全的,即接收者只會接受與發送者發送的流相同的流(假設 MAC 沒有損壞)。

但是,如果您可能的攻擊場景包含(部分)選擇的明文攻擊,那麼使用 CBC 會使其無法抵禦針對機密部分的類似 BEAST 的攻擊,CodeInChaos 的評論中提到了這一點。

為了使 CBC 免受 BEAST 風格的選擇明文攻擊,重要的是每個塊的“有效初始化向量”(即前一個塊或第一個塊的 IV)不早於塊的內容髮送是固定的。如果您以 MAC 塊的形式發送流(即 $ m_i || c_i $ ) 並且您在知道下一個片段的第一個塊的(明文)之前發送一個完整的片段,既可以觀察密文又選擇該明文塊的攻擊者可以使用它來驗證對密文其他部分的猜測.

在您的文件加密環境中,當您開始加密時,很可能整個文件已經被修復,因此這種攻擊是不可能的。但請確保在創建程序時記錄此限制。或者,使用 CTR 等其他模式代替 CBC,這些模式對選擇的明文攻擊並不弱。

您的格式的一個弱點是,如果您不從頭開始讀取文件,而是尋找到中間,那麼它很容易受到重新排序攻擊。我會使用類似的方案

$ HMAC(IV_0 || i || IV_i || data_i) $

包括 $ IV_0 $ 試圖防止混合多個文件內容的攻擊。

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