1

我正在尝试在 VB.NET 中使用 AESManaged 或 RijndaelManaged 解密和加密数据。我有一个大小不是块大小的倍数的数据包。在这种情况下,当我尝试解密时,它会出现“要解密的数据长度无效”的错误。如果我删除数据末尾的缺陷块,我只能解密它。但我需要知道最后一个街区是什么。

所以

是否可以解密大小不是块大小倍数的数据?

如果是,我该怎么做?

编辑:

有些信息我忘记写了。

分组密码模式必须是 CBC。因为我可以成功解密除最后一个字节之外的所有数据。

有一个客户端可以解密整个数据。我找到了解密器功能的 asm 代码。如果我理解正确,它的工作原理是这样的:

x = 块大小不足 (x < 16)

缓冲区 = 大小为 (16 + x) 的数组

  • 首先,该函数抓取先前未解密的字节并将其放入缓冲区的前 16 个字节。(16 字节)
  • 将未解密的最后一个字节附加到缓冲区。(x 字节)
  • 从 buffer[x​​] 解密到缓冲区的末尾,并将结果放在同一个地方。(缓冲区的最后 16 个字节)
  • 从 buffer[0] 解密到 buffer[15] 并将结果放到同一个地方。(缓冲区的前 16 个字节)
  • 如您所知,CBC xors 用先前解密的字节解密字节。因此,函数将缓冲区的前 x 个字节与缓冲区的最后 x 个字节进行异或运算。

有没有办法可以在.NET中解密这样的最后一个字节?

4

1 回答 1

2

更新:

你可能有一个带有密文窃取的 CBC 模式,有可能只用一个 cbc implementation 来实现 cbc-cts

原来的:

确保您的所有数据包都是密文。如果它的前缀是标头或可以通过您的长度和解密算法的东西,它不会抱怨前缀数据,它只会在到达结尾之前解密为垃圾并抱怨填充。

如果使用经过身份验证的加密,使用 mac 对密文进行后缀也很常见,这也会为您提供非块大小长度倍数,但如果是这种情况,您需要读取 x 最后一个字节并验证您的密文(常用的是HMAC ) 在解密之前。

Also you make sure that you are using the right AES mode that matches the source of your ciphertext. There are some modes of AES that don't need a blocksize multiple, but they generally aren't supported in the built in .net cryptography anyway.

于 2013-03-08T13:37:00.640 回答