Encryption

為什麼或何時使用初始化向量?

  • October 28, 2012

我試圖弄清楚什麼時候應該使用初始化向量(IV)。

有傳聞稱 WEP因 IV 弱而被破壞。也有人聲稱,如果兩段明文用相同的 Key+IV 加密,那麼恢復明文是微不足道的


為了測試這一點,我使用相同的 IV 和密鑰加密了兩段等長的明文。我正在使用 AES,它具有 128 位塊大小(16 字節),所以我將使我的範例明文小於 16 字節。

Ciphertext1: ba 81 1b c3 d1 6b ee bd 0a 87 23 33 04 90 5d 8a
Ciphertext2: b0 80 01 ed e8 2c 6c 60 17 b7 5d 60 37 9a e8 3d

現在的理論C1 ⊻ C2 = P1 ⊻ P2

在此處輸入圖像描述

所以我計算Ciphertext1 xor Ciphertext2

Ciphertext1: ba 81 1b c3 d1 6b ee bd 0a 87 23 33 04 90 5d 8a
Ciphertext2: b0 80 01 ed e8 2c 6c 60 17 b7 5d 60 37 9a e8 3d
XOR:         0A 01 1A 2E 39 47 82 DD 1D 30 7E 53 33 0A B5 B7

現在,為了比較,兩個(15 字節)明文的 XOR 為:

Plaintext  XOR: 03 0C 1E 1F 1B 49 4E 57 28 07 15 01 53 17 18
Ciphertext XOR: AE 2C 0B F7 19 39 FA D6 0B 16 F4 59 1D EA D5 67

哪些不一樣。

如果使用特定密鑰,是什麼導致加密算法變弱?


偽範常式式碼,使用 WinCrypt API:

hProvider = CryptAcquireContext(null, null, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
hKey = CryptImportKey(hProvider, keyData, sizeof(keyData), null, 0);

encryptedLength = CryptEncrypt(hKey, null, true, 0, plaintextData, plainLength);

CryptDestroyKey(hKey);
CryptReleaseContext(hProvider, 0);

換句話說,用 MSDN 的話來說

如果為對稱分組密碼生成密鑰,則密鑰預設設置為密碼塊連結(CBC) 模式,初始化向量為零。

我在 CBC 模式下使用全**零的 IV。編輯:但是由於只有一個塊被加密,所以沒有“連結”;所以結果就是電子食譜(ECB)。

AES(作為任何分組密碼)與隨機排列無法區分,因此任何屬性如 $ C_1 \oplus C_2 = P_1 \oplus P_2 $ 會很糟糕。

該物業(與 $ K $ 作為“密鑰流位”)對同步流密碼有效,包括分組密碼的一次填充和流密碼模式(CTR、OFB,對於第一個塊也是 CFB),但不適用於那些實際上將明文通過密碼,如CBC。

這就是為什麼您永遠不應該為流密碼重用具有相同初始化向量的相同密鑰(或對沒有初始化向量的流密碼完全重用相同的密鑰)。

對於 CBC,這種誤用的影響只是相同的明文(或實際上相同的起始明文塊)給出相同的密文(相同的起始密文塊)。這仍然是一個不想要的東西,因此即使對於 CBC 模式,您也應該為每條消息使用一個新的隨機 IV。

如果你不能這樣做,在真實數據之前加密一個隨機塊具有相同的效果。

但是如果我們考慮初始化向量,我們有一個類似的屬性。

CBC 模式的工作方式(對於第一個塊)如下所示:

$$ C = Enc_k(IV \oplus P) $$ 所以,如果我們不固定初始化向量,而是根據明文選擇(或者根據IV選擇明文),我們可以得到兩個 $ (IV, P) $ 將給出相同密文的對。

或者反過來:如果我們有兩對 $ (IV, P) $ 和 $ (IV’, P’) $ 這樣 $ C = C’ $ , 那麼我們知道 $ IV \oplus P = IV’ \oplus P’ $ . 寫的不一樣, $ IV \oplus IV’ = P \oplus P’ $ 並且 $ P = IV \oplus IV’ \oplus P’ $ (假設 $ P $ 是原始的、未知的明文,並且 $ (IV’, P’) $ 是後來精心製作的一對)。

這是針對 CBC 的 BEAST 選擇明文攻擊的基礎,此時下一個初始化向量在攻擊者選擇明文塊之前已知。(請注意,這種攻擊可以擴展到所有塊,而不僅僅是第一個。)

因此,如果您正在實施像 TLS 這樣的線上加密協議,請確保僅您確實獲得(至少是第一個塊)要加密的實際消息之後才創建隨機 IV。(對於隨機 IV,與任何明文塊的 XOR 與之前加密的內容相同的可能性可以忽略不計。)


“初始化向量為零的一個塊CBC”版本與ECB相同,並且具有相同的問題:相同的明文給出相同的密文。通常你不想要這個,因為它在語義上不安全

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