两个AES实现生成不同的加密结果

时间:2010-03-22 17:06:29

标签: c++ encryption aes

我有一个使用开源“libgcrypt”加密/解密数据块(32字节)的应用程序。现在我将使用Microsoft CryptAPI来替换它。我的问题是libgcrypt和cryptApi方法生成不同的密文内容,因为我在CFB模式下使用相同的AES-256 algoritjm,相同的密钥和相同的IV,尽管密文可以通过它们自己的密码解密。

有人可以告诉我这是什么问题吗?感谢。

5 个答案:

答案 0 :(得分:2)

两者是否采用不同的字节顺序,或者以不同的顺序分配键/ IV中的字节?

如果字节顺序假设不同,您可能需要重新排序密钥,IV和/或明文中的字节以获得匹配结果。例如,如果您按照abcdefgh的顺序提供字节,则可能需要将其切换为“dcbahgfe”才能使其正常工作。

答案 1 :(得分:1)

CFB还有一个附加参数,即每次迭代时的“移位量”。 Wikipedia page on CFB有一些信息。也就是说,您为每个块加密加密 x 位,其中 x 是1和块大小之间的任何值(AES为128)。我怀疑在您的代码中,Microsoft CryptoAPI和libgcrypt不会对 x 使用相同的值。

正如CryptSetKeyParam()的文档中所述,Windows默认为 x = 8 (即一次一个字节)。这是KP_MODE_BITS参数。另一方面,libgcrypt defaults to x=n用于 n 位块密码(即 x = 128 用于AES)。我不确定libgcrypt可以说服使用其他值。

答案 2 :(得分:1)

我认为问题在于块大小。如果您说您使用32字节作为块大小,请确保两者的块大小是否相同并且也支持。因为某些库块大小固定为Aes为16字节

答案 3 :(得分:0)

你的钥匙和IV的长度是多少? 如果opentext的长度恰好是256位,那么密文会不同吗?

答案 4 :(得分:0)

我有同样的问题,但有一个不同的库。我在这个图书馆注意到了一件事;如果我传递小于32字节的输入字节,那么它显示我两者都是相同的加密数据。

这是你的情况发生了什么?如果是这样,则意味着问题在于填充机制。