使用 XOR 解密簡單的 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} $$
這也可以幫助你。