AES 解密问题

Issues with AES Decryption

我在尝试解密文件中的某些数据时遇到问题,我正在为 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 使用前一个区块的信息来帮助 encrypt/decrypt 而 ECB 不这样做。我还缺少什么吗?

这里有一些关于我正在尝试做的事情的更多信息。我正在读取的文件大约有 25 GB,实际上是几个文件的一个包。我确实有一个名为 quickbms 的程序的脚本,它能够提取文件,我正在尝试将其转换为我自己的程序。该脚本仅提供密钥并放弃 IV。单独的块被单独加密,我修改了脚本以仅输出块并将我的结果与此进行比较。与此同时,我通过提取前 16 个字节并用 ECB 解密,然后用 CBC 解密整个数据块并用 CBC 用我从 ECB 得到的结果覆盖结果的前 16 个字节来让它工作。这会产生相同的结果。

尝试在 } 之前添加;

    , IV = new byte[16]
};

如果您不初始化 IV,它是随机生成的,但也许他们只是使用了一个空 IV。

请注意,我真的希望他们没有使用 Padding = PaddingMode.None,,因为它是不可逆的,但你会在最后一个数据块中发现这一点。

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

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

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