我正在使用 AES 加密算法(Rijndael 实现)。我正在使用 MS Visual Studio 2008 IDE 进行开发工作。我可以在调试和发布模式中看到一个奇怪的问题。当我在调试模式下加密字符串时,它会生成与发布模式不同的字节。但幸运的是解密将产生相同的字符串。我在 Mac 中尝试过,它会生成一个多字节序列,但能够正确解密所有字节序列。
这个问题与加密算法或调试/发布设置有关吗?有什么办法可以避免这种情况吗?
问候德瓦拉·古达
我正在使用 AES 加密算法(Rijndael 实现)。我正在使用 MS Visual Studio 2008 IDE 进行开发工作。我可以在调试和发布模式中看到一个奇怪的问题。当我在调试模式下加密字符串时,它会生成与发布模式不同的字节。但幸运的是解密将产生相同的字符串。我在 Mac 中尝试过,它会生成一个多字节序列,但能够正确解密所有字节序列。
这个问题与加密算法或调试/发布设置有关吗?有什么办法可以避免这种情况吗?
问候德瓦拉·古达
AES 是一种分组密码。您可以使用它加密和解密固定大小的 128 位块。要加密和解密较长的序列,您通常使用某种“操作模式”和某种“填充方案”,它们都可能通过 IV(初始化向量)和填充涉及一些随机性。在这些情况下,由于所涉及的“随机性”,密文每次都会更长且不同。实际上,同一条消息加密成不同的密文并不是一个坏特性。您甚至需要它来保护自己免受某些攻击。
您应该验证“发布”和“调试”设置之间的区别,最常见的问题出现在“配置属性 -> C/C++ -> 代码生成”以及“配置属性 -> 常规”下的“字符集”。
我有我的 AES 实现,它在 VC2008 的两种默认配置下都能正常编译。
您可能想要验证如何为纯文本/密文指定缓冲区大小。在调试版本中,编译器通常将缓冲区初始化为已知值(通常用于检测溢出错误)。例如,在 VC++ 2008 Express 中,我发现 char 缓冲区0xCD
在调试版本中被初始化。当然,在发布版本中,不会做这样的事情。我并不是说这是您所观察到的原因 - 只是您可能想要检查的内容。