我在尝试解密文件中的某些数据时遇到问题,我使用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个字节。这会产生相同的结果。
答案 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是先前块的密文。
要解密,您需要相同的IV。如果您缺少IV,所有后续块仍然可以解密,因为它们不是由IV初始化,而是由先前的块密文初始化。