2015-06-30 46 views
1

我在解密某個文件中的某些數據時遇到了問題,我正在對RijndaelManaged使用以下設置。這應該是正確的。AES解密存在的問題

RijndaelManaged aesAlg = new RijndaelManaged 
{ 
    KeySize = 128, 
    Mode = CipherMode.CBC, 
    Padding = PaddingMode.None, 
    Key = new byte[] { 0x32, 0x1F, 0x2A, 0xEE, 0xAA, 0x58, 0x4A, 0xB4, 0x9A, 0x6C, 0x9E, 0x09, 0xD5, 0x9E, 0x9C, 0x6F } 
}; 

但是,每當我使用這些設置前16個字節是不正確的,而剩下的就是正確的。但是,我切換到Mode = CipherMode.ECB前16個字節是正確的,其餘是不正確的。我知道CBC使用來自前一個區塊的信息來幫助加密/解密,而ECB不這樣做。有什麼額外的,我失蹤?

這是關於我想要做什麼的一些更多信息。我正在閱讀的文件大約25千兆字節,實際上是一個包含多個文件的包。我確實有一個名爲quickbms的程序的腳本,能夠提取這些文件,我試圖將其轉換爲我自己的程序。該腳本只提供了一個關鍵,並放棄了IV。單獨的塊單獨加密,並且我修改了腳本以輸出塊並將結果與​​此進行比較。同時,我通過提取前16個字節並使用ECB解密,然後使用CBC解密整個數據塊,並用CBC從ECB中獲取CBC的前16個字節來覆蓋結果。這產生了相同的結果。

+0

該文件是如何加密的?你有多確定該文件實際上是否正確?文件有多大? –

+1

如果您使用CBC模式,那麼IV在哪裏?它是否預置在密文中,還是需要從外部提供? –

+0

我更新了帖子,提供了更多信息來解釋我正在嘗試做什麼以及我擁有的信息。 – 7H3LaughingMan

回答

0

嘗試在}之前添加;

, IV = new byte[16] 
}; 

如果您不初始化IV,它是隨機生成的,但也許他們只是使用空的IV。

請注意,我真的希望他們沒有使用Padding = PaddingMode.None,,因爲它不可逆,但這是你會在最後一塊數據上發現的東西。

+0

我忘了更新這個,但我試過這樣做,它的工作完美。至於填充,我不知道,但這是我的作品,因爲塊是0x150(336)字節。 – 7H3LaughingMan

+0

@ 7H3LaughingMan如果塊是336字節,那麼'Padding.None'就可以,因爲AES總是使用16個字節的塊,而336可以被16整除(= 21) – xanatos

0

你說CBC應該是正確的。如果它在CBC中被加密,則應該向IV提供加密的數據。

要在CBC模式下加密,您需要生成一個隨機的IV將它傳遞給密鑰,並將第一個數據塊傳遞給AES算法以獲得密文。對於所有後續塊,IV是先前塊的密文。

CBC Encryption Block Diagram

要解密你需要同樣的IV。如果您錯過了IV,所有後續的塊仍然可以解密,因爲它們不是由IV而是由前面的塊密文初始化的。

CBC Decryption Block Diagram