AES解密的问题

时间:2015-06-30 18:01:38

标签: c# encryption aes

我在尝试解密文件中的某些数据时遇到问题,我使用RijndaelManaged的以下设置。这应该是正确的。

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获得的结果覆盖结果的前16个字节。这会产生相同的结果。

2 个答案:

答案 0 :(得分:0)

Try adding before the };

    , IV = new byte[16]
};

If you don't initialize the IV, it is randomly generated, but perhaps they simply used an empty IV.

Note that I really hope they didn't use Padding = PaddingMode.None,, because it isn't reversible, but that is something you'll discover on the last block of data.

答案 1 :(得分:0)

你说CBC应该是正确的。如果它在CBC中加密,那么IV应该与加密数据一起提供。

要在CBC模式下加密,您生成随机IV 将其,密钥和第一个数据块传递给AES算法以获取密文。对于所有后续块,IV是先前块的密文。

CBC Encryption Block Diagram

要解密,您需要相同的IV。如果您缺少IV,所有后续块仍然可以解密,因为它们不是由IV初始化,而是由先前的块密文初始化。

CBC Decryption Block Diagram