【问题标题】:Can you specify output length of an encrypted string using AES?您可以使用 AES 指定加密字符串的输出长度吗?
【发布时间】:2020-04-09 05:55:30
【问题描述】:

我遇到了加密问题,我正在寻找一些指导。

我正在使用 AES 加密 (Rijndael) 来加​​密和解密用户密码、安全问题答案和 PIN 码。然后将这些加密值放入数据库中,其中字段定义为 bin(16)、bin(32) 和 bin(64)。最初我使用自定义填充来确保数据的长度,但出于安全原因,我将使用 PKCS7 填充。不幸的是,这种变化使加密字符串的长度变得不可预测,至少对于密码和安全问题的答案是这样。例如,有效密码在加密时可以是 16 或 32 字节长,而安全答案在加密时可以是 16、32 或 64 字节。我知道块大小是什么以及它是如何工作的,但即使使用 32 字节的块大小(可用的最大块大小)我仍然无法控制安全答案的长度(它可能是 32 或 64 字节)。

有没有办法强制我的加密字符串为特定长度,同时仍然使用 AES 和 PCKS7 填充,而不增加输入限制?

【问题讨论】:

  • 这是可以预见的。请参阅来自 CSE 的 answer。
  • 你是对的,也许可预测不是正确的词。当我知道输入的长度时,输出长度是可以预测的。但是如果我不知道输入的长度,这里就是这种情况,我就无法知道输出的长度(除了它是块大小的倍数)。
  • 如果您接受用户的最大尺寸,那么填充零填充更适合您的原因。
  • @kelalaka 是的,这似乎是我最好的选择。感谢您的意见。
  • 它是 10...0000 填充,因此您可以通过查看第一个 1 从末尾删除。

标签: encryption aes rijndael


【解决方案1】:

您实际上是在要求 Pigeonhole Principle 离开(它不会)。

我知道您说您了解块大小,但您似乎没有基于紧随该声明之后的句子。块大小定义了传入算法和传出算法的位串的长度。这就对了。如果您传入 2.5 批 256 位(最多填充 3 个块),那么您将获得 3 个输出块。此外,具有 256 位块大小的 AES 不再是 AES,而是它的 Rijndael。

您可以预测使用 PKCS7 填充的 AES 下给定输入的输出大小,但不能将其限制为 32 字节。

如果您没有加密这些字段,您仍然需要在数据库中设置最大字段大小 - 它们已加密这一事实不会改变这一点。

【讨论】:

  • 我确实了解块大小。我得到的是,如果我的块大小为 256 位,那么确保输出长度的唯一方法是确保输入小于 256 位。但在这种情况下,有一些输入大于 256 位,使得输出为 512 位。无论如何,我很欣赏你的评论。似乎我正在尝试做的事情是不可能的(考虑到我希望满足的限制),所以我将不得不找到另一个解决方案。谢谢。
  • PKCS#7 最多可使用 256 字节的分组密码。也就是 PKCS#5 和 PKCS#7 之间的difference。
猜你喜欢
  • 1970-01-01
  • 2021-02-06
  • 2021-11-01
  • 1970-01-01
  • 2015-06-20
  • 2019-10-07
  • 1970-01-01
  • 2020-07-28
  • 2016-09-04
相关资源
最近更新 更多