两种不同的Aes实现有不同的密文吗?

时间:2012-10-19 07:39:41

标签: algorithm cryptography aes

我正在使用库1 Aes算法实现现在我想将它更改为库2的另一个实现它的工作正常但事情是它给我差异加密数据表单库1,是否可能用ECB模式执行Aes 128位,具有相同的密钥和纯文本,但仅在密文(加密数据)中有所不同,用于2种不同的实现?

我发现还有一件事是,如果我传递的输入字节小于16字节,则两个库的加密数据都会匹配,但在库1中,解密是完美的但在库2中它显示的加密和解密是相同的(不完全解密到原始文本)会出现什么问题?

3 个答案:

答案 0 :(得分:4)

鉴于你的评论,小于16字节的字符串导致相同的输出,以及你使用ECB(你永远不应该使用),我怀疑你的一个库实际上并没有使用ECB,而是默认为CBC(这是一个更好的默认值)并且您将NULL IV传递给CBC。如果我的理论是正确的,那么你应该期望前16个字节总是相同的,并且在那个点之后开始差异。

对此最好的解决方案是将所有代码从ECB(除了极少数情况以外的所有情况都被破坏)转换为CBC或您可以找到的任何其他模式。 CBC是最常见的,你需要传递一个随机生成的IV。

如果无法切换模式,我会调查你的第二个库,并确定如何将其设置为ECB模式,它可能当前不在。任何依赖加密的人应该被警告使用ECB模式泄漏重要信息明文。有时几乎没有加密。请参阅entry at Wikipedia,了解它的真实程度。这不是一些理论上的攻击。真的,真的很糟糕。

答案 1 :(得分:3)

是的,有可能,正如评论所指出的那样。加密设计用于显示输入的微小变化,以实现输入的微小变化。理想情况下,输入中的一位变化将改变输出中50%的位。

避免大多数问题的方法是明确指定所有内容。不要依赖默认值,好像两个库之间的默认值不同,那么输出会有所不同。

  1. 明确指定字符编码以将字符转换为字节。 UTF-8很常见。

  2. 明确指定您正在使用的加密模式。 CBC或点击率模式,如果您不想要身份验证,GCM(如果您这样做)。

  3. 明确指定IV,使用字节,而不是字符,最好是。

  4. 明确指定要使用的填充。 PKCS7(又名PKCS5)很常见。

  5. 如果您仍然遇到问题,请检查两个库的所有内容 byte for byte 是否相同。不要检查字符,而是字节。也就是说,在将它们转换为字节数组之后,在将它们传递给加密方法之前检查一下。

    作为旁注,ECB模式不安全且泄露信息。它仅对测试密码方法的操作有用。如上所述,使用CBC,CTR或GCM模式。这些模式是安全的,GCM包括身份验证。

答案 2 :(得分:1)

这里已经有很多正确答案了。我唯一想提及的,以前没有提到过。

  

对于具有相同密钥的ECB模式128位的Aes实现是可能的   和纯文本,但仅在2的密文(加密数据)上有所不同   不同的实施?

在这种情况下,如果算法正确实现,相同的输入(纯文本,模式,IV,填充)应该产生相同的输出(密文)。

在这种情况下,如果你使用两个已建立的库,很可能是之前提到的问题之一(其中一个输入,编码等的差异)。