Encryption

為什麼可以在 AES 中加密同一流中的多個消息

  • October 21, 2021

我有一個標準的隨機密鑰和 IV。然後我使用這些密鑰和 iv 創建密碼,然後加密特定消息。稍後,如果我嘗試使用相同的密碼(這意味著相同的密鑰和 iv)加密另一條消息,這是可能的。對此有何解釋?

import os
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes

key = os.urandom(32)
iv = os.urandom(16)

cipher = Cipher(algorithms.AES(key), modes.CTR(iv))

encryptor = cipher.encryptor()
decrypter = cipher.decryptor()

ciphertext1 = encryptor.update(b"secret message")
ciphertext2 = encryptor.update(b"I'll give you 100 and that's my last offer") + encryptor.finalize()


decrypted_message = decrypter.update(ciphertext1)
print("the decrypted message from the cyphertext : ", ciphertext1, " is : ", decrypted_message)

decrypted_message2 = decrypter.update(ciphertext2) + decrypter.finalize()
print("the decrypted message from the ciphertext : ", ciphertext2, " is : ",decrypted_message2)

您沒有清楚地閱讀您的圖書館的文件。

隨著cipher.encryptor()您打開流式傳輸,它僅通過該finalize()方法完成。此操作對於處理大文件和流很重要。可以將輸入分成塊,update()多次呼叫方法來處理塊。

可以將其稱為會話 $ (IV,key) $ 一直開到你關​​門!

稍後,如果我嘗試使用相同的密碼(這意味著相同的密鑰和 iv)加密另一條消息,這是可能的。對此有何解釋?

CTR 模式使用 IV 和計數器的組合用於 PRF/PRF (ChaCha/AES) 的輸入以生成 x 流或使用明文生成密文。CTR 模式在某種意義上與現代版 OTP 的主要區別在於;OPT 具有完美的保密性,而 CTR 具有 Ind-CPA(對計算受限的對手的放鬆)。

一旦初始化CTR 模式,對於每個塊加密,計數器都會遞增。根據庫,計數器可以是 32 位或 64 位。

像 OPT 這樣的 CTR 模式會出現災難性的故障,如果 $ (IV,key) $ 對被重複使用。攻擊者可以嘗試使用嬰兒床拖動技術來破壞機密性。

在您的情況下,更新繼續使用它所在的 CTR 模式。那裡唯一的危險,你可能會耗盡危險開始的計數器。

為什麼可以在 AES 中加密同一流中的多個消息

你根本沒有encryptor()finalize(). 正如文件所說;

  • 一旦 finalize 被呼叫,這個對象就不能再被使用並且 update() 和 finalize() 將引發一個 AlreadyFinalized 異常。

您需要finalize()並選擇一個新的 $ IV $ 或者 $ key $ 並用它創建一個新的加密器。Cipher或者更好的是,在清除前一個實例後創建一個新實例。

額外:如何使用 CTR 模式加密多條消息

CTR 模式中的一個鍵 $ IV $ 可以使用很長時間。由於nonce不長,使用隨機 $ IV $ 由於生日限制,可能會產生碰撞。如果使用 64 位隨機 $ IV $ ’s 和 AES 的 64 計數器,您應該在加密之前停止 $ 2^{32} $ 同一鍵下的消息。

正確的推薦方法是對 IV 使用計數器/LFSR(參見NITS 800-38a 附錄 C),以免發生衝突。唯一的問題是系統故障,您可能會失去 LFSR/計數器的跟踪。在這種情況下,請使用統一隨機選擇的新密鑰。

您可以繼續使用流來加密多條消息,但是,這很危險,給加密增加了不必要的風險。

正確的方法是使用新的 $ (IV,key) $ 為每條消息配對。

CTR 模式只能給你 Ind-CPA。在現代密碼學中,我們想要的不僅僅是 Ind-CPA。身份驗證加密 (AE)(與關聯數據 (AEAD))是現代標準,並且仍在不斷發展。我們有;

  • AES-GCM,和
  • ChaCha20-Poly1305

TLS 1.3中都存在的密碼。兩種密碼套件都是 AEAD 模式,可以在組合模式下為您提供機密性、完整性和身份驗證。

  • AES-GCM 內部使用 CTR 模式加密數據,所以 $ (IV,key) $ 那裡仍然有問題。為了緩解這種情況,有 SIV 模式,AES-GCM-SIV將消息合併到 IV 中以解決此問題。
  • ChaCha20 內部有 CTR 模式(PRF 到 CTR)並且有同樣的問題。為了緩解這種情況,我們使用xCHaCha20-Poly1305啟用 192 位隨機數,以便隨機 $ IV/nonce $ 碰撞不會發生。

在所有情況下,使用 256 位密鑰進行加密以減輕可能的加密量子電腦。

您在這裡只加密一條消息,即secret messageI'll give you 100 and that's my last offer.

您選擇了未經身份驗證的 AES-CTR。在這種模式下,AES 用於生成偽隨機比特流,該流簡單地與明文比特逐一異或。因此,當您將密文的前 14 個字節傳遞給解密函式時,您將得到前 14 個字節的明文。

未經身份驗證的加密是危險的,CTR 尤其如此。事實上這個模組的文件

這是一個“有害物質”模組。僅當您 100% 絕對確定自己知道自己在做什麼時才應該使用它,因為該模組充滿了地雷、龍和帶有雷射槍的恐龍。相反,您可能對Fernet(對稱加密)感興趣。

如果您使用 Fernet,那麼您將無法像這樣將消息分成兩部分解密。

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