2015-06-30 48 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