【问题标题】:How can I decrypt the data which size is not multiple of block size?如何解密大小不是块大小倍数的数据?
【发布时间】:2013-03-08 09:55:10
【问题描述】:

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

所以

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

如果是,我该怎么做?

编辑:

有些信息我忘记写了。

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

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

x = 块大小不足 (x

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

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

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

【问题讨论】:

  • 您最好尝试找出使用了哪种模式,以及数据大小无效的原因。如果您只有部分数据,那么您可以切断最后一个字节并尝试解密数据。但这应该是最后的手段。
  • 我添加了一些关于解密数据的信息。

标签: .net cryptography aes rijndael


【解决方案1】:

更新:

你可能有密文窃取的CBC模式,可以实现cbc-cts with just a cbc implementation

原文:

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

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

您还要确保使用与密文来源匹配的正确 AES 模式。有一些 AES 模式不需要块大小的倍数,但它们通常在内置的 .net 加密中不受支持。

【讨论】:

  • 是的,这就是我想要的答案:)
猜你喜欢
  • 2017-06-22
  • 1970-01-01
  • 2016-12-10
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多