Encryption

在 AES 中重用 IV 加密文件

  • June 1, 2018

每個人都說你不應該使用相同的 IV 和 Key。

  • 僅在一個文件上使用相同的 IV 和密鑰是否安全?**編輯:**我將使用 CBC 或 CFB 加密模式,因此 IV 將根據前一個塊進行更新。
  • 每次訪問文件並將數據添加到文件時,使用相同的 IV 是否安全(**編輯:相同的第一個 IV,然後將隨每個塊更新。)。**每次發生這種情況時,只會有一個加密文件,因此不會發生具有相同 IV 和 Key 的多個文件。

**編輯:**使用該文件的程序只會將數據添加到文件的末尾。據我所知,這不會改變文件第一部分的加密,因為 IV 是根據前一個塊中所做的更改。那是對的嗎?

**編輯 2:為簡單起見,假設這是一個由於某種原因我想要加密的日誌文件。**我希望能夠在不需要新密鑰/IV 的情況下添加到此日誌的末尾。由於它是文件的結尾,我在解密時在想,我將擁有 CBC 或 CFB 的下一個 IV,並使用它開始加密下一個條目。至於可變性,我永遠不會有理由更改日誌/文件中間的任何內容,只是添加到最後。我不知道這與密碼可變性/不變性有何關係,但這就是我想要做的。

**最終:**我正在使用CBC。在每一行的開頭我都有一個新的 IV(前 16 個字節是 IV),並且該行的其餘部分使用該 IV 加密。感謝所有的指點。如果有人認為這有任何重大問題,請告訴我。

每個人都說你不應該使用相同的 IV 和 Key。

正確的。他們這麼說是因為任何確定性加密都會洩露有關消息的一些資訊。這可能是很多資訊,例如 CTR 或 CFB 模式,或者如果我們假設攻擊者無法執行選定的明文攻擊,則在 CBC 中的資訊量相對較小。

  • 僅在一個文件上使用相同的 IV 和密鑰是否安全?**編輯:**我將使用 CBC 或 CFB 加密模式,因此 IV 將根據前一個塊進行更新。

這取決於文件​​的使用方式以及可能的攻擊類型。對於 CBC 模式,它將指示文件的哪個塊將被更改。對於 CFB 模式,它可能並且可能會導致更新塊中明文的機密性完全喪失。

為此,攻擊者當然必須能夠看到文件的差異。如果攻擊者只能看到文件的一個版本,那麼這個問題就會消失並且沒有什麼可攻擊的 - 它會使用一個 IV 回歸到正常加密。

  • 每次訪問文件並將數據添加到文件時,使用相同的 IV 是否安全(**編輯:相同的第一個 IV,然後將隨每個塊更新。)。**每次發生這種情況時,只會有一個加密文件,因此不會發生具有相同 IV 和 Key 的多個文件。

您基本上可以將多個版本中的一個文件視為多個文件。但這也意味著有關這些文件的大量資訊是已知的,這使得攻擊文件變得更容易而不是更難。

**編輯:**使用該文件的程序只會將數據添加到文件的末尾。據我所知,這不會改變文件第一部分的加密,因為 IV 是根據前一個塊中所做的更改。那是對的嗎?

對,那是正確的。但是,對於 CBC,您現在違反了規則,即對於攻擊者而言,IV 必須是不可預測的。由於新密文的向量現在是預先知道的,已知的明文攻擊是可能的。因此,如果您的攻擊者能夠以某種方式影響您正在加密的內容,那麼您仍然很容易受到攻擊。例如,日誌文件可能就是這種情況,因為它們取決於程序狀態,而程序狀態通常會受到攻擊者的影響。

因此,在這種情況下,作為流密碼的 CFB 模式更適合這項工作。CFB 模式也使用前一個密文塊,但是這個密文塊在與明文進行異或之前是加密的,因此攻擊者無法執行可用於 CBC 模式的所選明文攻擊。

**編輯 2:**為簡單起見,假設這是一個日誌程序,出於某種原因我想要加密。我希望能夠在不需要新密鑰/IV 的情況下添加到此日誌的末尾。由於它是文件的結尾,我在解密時想,我將獲得 CBC 或 CFB 的下一個 IV,並用它來加密下一個條目。至於可變性,我永遠不會有理由更改日誌/文件中間的任何內容,只是添加到最後。我不知道這與密碼可變性/不變性有何關係,但這就是我想要做的。

最好單獨加密文件中的每個日誌,例如使用計數器或 SIV 模式。由於您需要同步對日誌文件寫入的訪問,您不妨使用隨機數。在這方面唯一棘手的是在需要重新啟動應用程序時防止重用,這可能意味著失去狀態。*如果時間源被認為足夠安全,*您也可以使用 UTC 日誌時間(使用本地時間不是一個好主意,因為如果應用夏令時或更改時區,它可能每年重複一次)。


如果您要對整個文件而不是日誌條目使用任何操作模式,那麼 CTR(計數器)模式提供了最佳屬性:您可以從任何偏移量進行加密/解密,而無需考慮前一個密文塊的值,您不需要填充,也不需要不可預測的 IV。

但請注意,如果您曾經為特定塊重複使用計數器,那麼您在 CTR 模式下會遇到與 CFB 模式相同的問題:幾乎肯定會失去機密性。如果您確實只能添加到文件中,您只想使用 CTR 模式。

如果您的 API 不允許您指定偏移量,您可能需要自己程式 CTR 模式,並且實施加密本身就是危險的。

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