2010-01-04 71 views
1

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

此问题与加密算法或调试/发布设置有关吗? 有没有解决方案来避免这种情况?

问候 Devara Gudda

+2

调试/发布中的相同输入的加密输出是否始终相同?您是否使用常量IV,以某种方式生成它或将其保留为未初始化? – beermann 2010-01-05 14:53:30

+0

我终于找到了问题所在,我没有将要加密的数据归零。这解决了我的问题。 感谢您的回复。 – Raviprakash 2010-01-15 10:17:27

回答

0

您应该确认你的“释放”和“调试”设置之间的差异,最多的问题occour在“配置属性 - > C/C++ - >代码生成”,也是“字符集“下的”配置属性 - >常规“。

我有我的AES的实现,它在VC2008的两个默认配置下编译得很好。

0

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

2

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