【问题标题】:Size of data after AES decryptionAES解密后的数据大小
【发布时间】:2015-02-20 13:59:34
【问题描述】:

我只发现这个问题得到了回答:

Size of data after AES/CBC and AES/ECB encryption

由于 AES 在加密消息的末尾添加了填充,因此在给定输入长度的情况下,有一个简单的公式可以确定预期的输出长度。但是,有什么方法可以确定 DECRYPTED 消息的预期大小是多少?如果没有,我是否应该将其与 iv 和加密消息一起发送?

【问题讨论】:

  • 我们在这里谈论什么填充? PKCS#5/PKCS#7 还是别的什么?
  • 我正在使用 OpenSSL C++ 库中的 AES_cbc_encrypt 函数...这能回答您的问题吗?否则,我如何确定正在使用什么填充?
  • AES 不添加填充。包括 CBC 在内的各种模式通常需要填充,但您的套件应指定填充的类型。您调用的函数甚至有可能没有执行任何填充,实际上在非块长度输入上行为不端。

标签: encryption cryptography aes


【解决方案1】:

AES 是一种分组密码。块密码仅加密块,在 AES 的情况下,128 位/16 字节的块。要将分组密码用于大量数据,您需要操作模式。有一些操作模式,例如 AES-CBC 和不安全的 AES-ECB,确实需要填充,因为它们也对每个块进行加密/解密。对于 AES,即使在解密之前,您也可以确定填充量为 1 到 16 个字节。

AES-CFB、AES-OFB 和最重要的 AES-CTR 等其他模式不需要填充。这些模式只是创建一个与明文一样大的密文(尽管如果您无法计算它,您可能仍需要静态量的开销来发送 IV 向量)。 AES-GCM 是一种在内部也使用 CTR 的模式,但也添加了一个身份验证标签来保护消息的完整性和真实性。

如果您想知道解密前的大小,可以将明文的长度与消息一起发送。但是,如果您想保护消息的完整性,则应在身份验证标记中包含这些值。

如果您可以选择,简单地选择 CTR 或 GCM 模式加密可能更容易。


请注意,还有一种方法称为 CBC 的密文窃取。然而,CTS 并不经常可用。它可以删除较大密文的填充,但仍然会留下 IV 作为开销。

【讨论】:

  • 好的,但是假设有人使用 AES128-CBC,或者任何带有 libgcrypt 的东西。确定输出大小的方法是什么?
猜你喜欢
  • 2011-03-18
  • 2015-12-24
  • 2020-02-12
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 2015-03-13
相关资源
最近更新 更多