如何解密大小不是块大小倍数的数据?

时间:2013-03-08 09:55:11

标签: .net cryptography aes rijndael

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

所以

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

如果是,我该怎么做?

编辑:

我忘了写一些信息。

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

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

x =缺陷块大小(x <16)

buffer =一个大小为(16 + x)

的数组
  • 首先,该函数获取先前未加密的字节并将其放入缓冲区的前16个字节。 (16字节)
  • 将未加密的最后字节追加到缓冲区。 (x字节)
  • 从缓冲区[x]解密到缓冲区的末尾,并将结果放到同一个地方。 (最后16个字节的缓冲区)
  • 从缓冲区[0]到缓冲区[15]的解密,并将结果放在同一个地方。 (前16个字节的缓冲区)
  • 如您所知,CBC使用先前解密的字节xors解密字节。因此,函数xors缓冲区的前x个字节,缓冲区的最后x个字节。

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

1 个答案:

答案 0 :(得分:2)

更新

您可能拥有使用密文窃取的CBC模式,可以实施cbc-cts with just a cbc implementation

原始

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

如果使用authenticated encryption,使用mac对密文进行后缀也很常见,这也会给你一个非块长度倍数,但如果是这种情况你需要读取x个最后字节并验证在解密之前你的密文(常用的是HMAC)。

此外,您还要确保使用与密文源匹配的正确AES模式。有些AES模式不需要块大小,但无论如何它们通常都不支持内置的.net加密。