Aes

什麼是合適的 AES 填充字元?

  • December 17, 2021

在密碼學和安全性方面,我完全是菜鳥。所以我決定使用 AES Cipher 來加密我的數據。

我用空白空格填充我的輸入數據字元串,以使其適合我的密碼塊大小的倍數。所以"Hello world"變成"Helo world "

但這是正確的方法嗎?有人可以通過發送空字元串來破解我的密鑰嗎?

但這是正確的方法嗎?

有各種填充樣式。必須正確且唯一地刪除填充。例如,全零填充可能會刪除您的實際資訊。如果消息以零結尾,則沒有唯一的方法可以在沒有長度資訊的情況下移除填充(右側部分是填充)。

.....0 00 

是填充後的結果.....000還是.....00.....0?所以這不是適當的填充。以 .結尾的消息也存在同樣的問題1

.....1 00 

.....100.....10還是.....1?一些真正的填充方案;

對於這樣的算法,方法應該是在輸入的尾端用 k - (l mod k) 個八位字節填充所有的值 k - (l mod k),其中 l 是輸入的長度。

例如;

 ......01
 ....0202
 ..030303

正確的方法,確實是使用像 CTR 這樣的模式,這樣你就不需要填充。填充存在安全問題,例如在 CBC 模式下填充 oracle 攻擊。

有人可以通過發送空字元串來破解我的密鑰嗎?

什麼是空字元串,全為零?為什麼需要發送全零?運作模式是什麼?關於這個有很多問題。這實際上取決於您的應用程序。例如,如果您使用 ECB 模式,它可能會顯示您再次發送 -不要使用它。如果您使用語義安全模式,則可以,但是請記住,每種模式都有其自身的問題。例如; 在 CBC 模式下,nonce 必須是不可預測的,在 GCM、CTR 中,IV 必須是唯一的。

使用現代加密模式,如 Authenticated Encryption (AE)。AE 將為您提供機密性、完整性和身份驗證。AE 範例是 TLS 1.3 中的 AES-GCM 和 ChaCha20-Poly1305。AES-GCM 內部使用不需要填充方案的 CTR 模式。

我用空白空格填充我的輸入數據字元串,以使其適合我的密碼塊大小的倍數。所以“Hello world”變成了“Helo world”

但這是正確的方法嗎?

通常我們希望能夠加密多條任意大小的消息。我們可以通過使用ECB、CBC、CTR 或 GCM 模式等操作模式來做到這一點。其中一些模式,特別是 ECB 和 CBC 需要填充。其他模式如 CTR 或 GCM 模式不需要填充(或填充模式基本集成在方案中)。

對於 ECB 或 CBC,我們通常希望確保我們可以加密任何內容的消息。使用您的方案,任何以空格結尾的消息都處於嚴重危險之中,因為它將在右側剝離空白。對於您的特定純文字消息,這可能不是問題,但它不是通用密碼的受歡迎屬性。

因此,如果您決定使用 CBC(因為 ECB 本質上是不安全的),那麼您需要一個始終填充的填充方案,並且它具有可以確定性地刪除而不損壞消息本身的填充方案。大多數安全行業一直在使用 PCKS#7 兼容的填充。

或者,您可以使用像AES-GCM這樣的經過身份驗證的方案,它提供完整性保護並對消息進行身份驗證(從某種意義上說,創建消息的任何人都必須有權訪問密鑰)。在這種情況下,問題會立即解決,因為您不需要填充。這是因為AES在認證的GCM模式內用於計數器模式(即CTR模式),而CTR模式將AES變成了流密碼;那些不需要填充。

有人可以通過發送空字元串來破解我的密鑰嗎?

不,AES - 分組密碼 - 將保護您的密鑰。但是,如果您不使用身份驗證模式或在消息上添加 MAC 身份驗證標籤,攻擊者可能會使用填充 oracle 攻擊或*明文 oracle 攻擊。*如果適用,這些攻擊將暴露消息的所有明文數據 - 基本上使加密和密鑰無用。

請注意,發送空字元串似乎意味著您想使用 AES 來確保傳輸安全。眾所周知,傳輸安全性很難做到正確,因此請確保對任何重要數據使用傳輸協議,例如 TLS 1.3。

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