Cbc

使用 XOR 解密簡單的 CBC

  • January 10, 2019

我已經搜尋過,我的問題與此處顯示的完全相同:

使用 XOR 加密解密具有已知 IV 的簡單 CBC 消息

但是,當我實施解決方案時它不起作用,我自己的解決方案也不起作用。

我將重申問題

我收到了一條使用 CBC 加密的密文消息。我知道塊大小是 12 個字節,並且我知道第一個塊的明文值。

我也知道加密函式是一個簡單的異或:

Ci=K⊕(Mi⊕Ci−1) 其中 C0=IV。

我的(不正確的)解決方案,用 Java 程式:

術語:

“encrypted”是保存密文

的字節數組 “decrypted”是保存恢復的明文(解密密碼)

的字節數組 “first_block”是保存解密的第一個塊(即 IV)

“key ”的字節數組" 是一個字節數組,它會在恢復後保存密鑰

^ 是 XOR 的 java 表達式

IV是已知的

嘗試1,利用自己的想像:

// corresponds to K = IV (+) C0, where C0 = K (+) IV  

for (int i = 0; i < 12; i++)  
   key[i] = (byte) (first_block[i] ^ encrypted[i]);   

// corresponds to K (+) Ci (+) Ci-1 

for (int i = 12; i < 24; i++)  
   decrypted[i] = (byte) (key[i-12] ^ encrypted[i] ^ encrypted[i-12]);   

**結果:**我解密了 12 的第一個塊,這是我已經知道的 IV,但第二個塊只是胡言亂語

嘗試2,使用從上面連結的上一個問題中獲得的資訊複製:

//K = C0 + C1 + M1

byte[] key = new byte[12];
for (int i = 0; i < 12; i++)
   key[i] = (byte) (encrypted[i] ^ encrypted[i+12] + first_block[i]); 

// Mi = K + Ci + Ci-1
byte[] decrypted = new byte[encrypted.length]; 

for (int i = 12; i < 24; i++)
   decrypted[i] = (byte) (key[i-12] ^ encrypted[i] ^ encrypted[i-12]); 

**結果:**仍然只是胡言亂語,但我上面得到的不同胡言亂語

**我在找什麼:**任何幫助

所以,你正在處理 CBC 解密:(

來自維基百科的圖片在此處輸入圖像描述

您要做的是首先計算密鑰 $ K $ 由手頭的塊密碼使用,因為你的是一個普通的 XOR,你可以通過 XORing 密文、IV 和明文來計算密鑰: $$ K=C_0\oplus M_0 \oplus IV $$

接下來,一旦你得到了你的密鑰,你就可以應用 CBC 解密,通過將密鑰與手頭的密文塊進行異或運算,並將結果與前一個密文塊進行異或以獲得目前的明文: $$ M_i=C_{i}\oplus K \oplus C_{i-1} $$

現在,我看不到整個程式碼,但 IV 被作為第一個明文塊給出似乎很奇怪。

如果給你:1個已知明文塊,1個IV塊和2個密文塊,那麼你將能夠使用我上面描述的方法解密密文的第二個塊……

但是你的說法有些奇怪:

“first_block”是保存解密的第一個塊(即 IV)的字節數組

那麼,第一個塊的解密是IV嗎?你確定嗎?因為這相當於有一個全 0 的第一個明文塊,所以你有: $$ C_2 = (K\oplus IV) \oplus (M_2 \oplus K) = IV \oplus M_2 $$ 所以有第二個塊,它只是 IV 和第二個塊明文的 XOR,這違背了 CBC 模式的目的。

這意味著您可以通過將第二個密文塊與 IV 進行異或來簡單地解密您的第二個塊,因為密鑰已經被取消,並且“連結”不適用,因為第一條消息全為 0。

請注意,無論如何,使用帶有固定鍵的 XOR 執行 CBC 模式 $ K $ 作為分組密碼實際上取消了密鑰 $ K $ 對於所有奇數塊: $$ \begin{aligned} C_0 &= K \oplus M_0 \oplus IV \ C_1 &= K \oplus M_1 \oplus C_0 = K \oplus M_1 \oplus K \oplus M_0 \oplus IV = M_1 \oplus M_0 \oplus IV \ C_2 &= K \oplus M_2 \oplus C_1 =K \oplus M_2 \oplus M_1 \oplus M_0 \oplus IV \ C_3 &= K \oplus M_3 \oplus C_2 = M_3 \oplus M_2 \oplus M_1 \oplus M_0 \oplus IV \ \cdots \end{aligned} $$

這也可以幫助你。

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