【问题标题】:AES encryption problem in Debug and Release modeDebug和Release模式下的AES加密问题
【发布时间】:2011-01-01 04:54:56
【问题描述】:

我正在使用 AES 加密算法(Rijndael 实现)。我正在使用 MS Visual Studio 2008 IDE 进行开发工作。我可以在调试和发布模式中看到一个奇怪的问题。当我在调试模式下加密字符串时,它会生成与发布模式不同的字节。但幸运的是解密将产生相同的字符串。我在 Mac 上试过,它会生成一个多字节序列,但能够正确解密所有字节序列。

这个问题与加密算法或调试/发布设置有关吗? 有什么办法可以避免这种情况吗?

问候 德瓦拉·古达

【问题讨论】:

  • 调试/发布中相同输入的加密输出是否始终相同?你是使用常量 IV,以某种方式生成它还是让它未初始化?
  • 我终于找到了问题所在,我没有将要加密的数据的内存归零。这解决了我的问题。感谢您的回复。

标签: c++ visual-studio-2008 encryption aes rijndael


【解决方案1】:

AES 是一个 block 密码。您可以使用它加密和解密固定大小的 128 位块。要加密和解密较长的序列,您通常使用某种“操作模式”和某种“填充方案”,它们都可能通过 IV(初始化向量)和填充涉及一些随机性。在这些情况下,由于所涉及的“随机性”,密文每次都会更长且不同。实际上,同一条消息加密成不同的密文并不是一个坏特性。您甚至需要它来保护自己免受某些攻击。

【讨论】:

    【解决方案2】:

    您应该验证“发布”和“调试”设置之间的差异,最常见的问题出现在“配置属性 -> C/C++ -> 代码生成”以及“配置属性 -> 下的“字符集”一般”。

    我有我的 AES 实现,它在 VC2008 的两种默认配置下都能正常编译。

    【讨论】:

      【解决方案3】:

      您可能想要验证如何为纯文本/密文指定缓冲区大小。在调试版本中,编译器通常将缓冲区初始化为已知值(通常用于检测溢出错误)。例如,在 VC++ 2008 Express 中,我发现 char 缓冲区在调试版本中被初始化为 0xCD。当然,在发布版本中,不会做这样的事情。我并不是说这是您所观察到的原因 - 只是您可能想要检查的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 2022-06-20
        • 1970-01-01
        • 2011-04-11
        • 2012-01-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多