首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AES解密的有效结果有多大可能在一个字节和一个字节之间存在差异?

AES解密的有效结果有多大可能在一个字节和一个字节之间存在差异?
EN

Stack Overflow用户
提问于 2017-03-07 18:09:07
回答 3查看 120关注 0票数 2

我需要用Java解密AES加密的字节。源数据以两个已知的验证字节开始,作为成功解密的指示。由于某些协议原因,数据的长度小于255字节,如果已经加密数据的人需要的话,假设数据是填充的,而前面提到的验证字节也用作填充。我已经用我的方法成功地解密了数十万条记录。

现在我得到了一些记录,在成功之后(?)解密与预期的解密结果不同的是一个字节,也只有一个字节。当然,这不是验证字节;-),而是另一个字节,具有非常特殊的、记录在案的含义。它总是同一个字节,总是相同的,常量的错误值。简单地说,我得到了一个0x47,根据一些制造商的特定文档,我应该在那里拥有0x44

尽管如此,根据我所拥有的文档,结果中的其他一切都是正确的,这是有意义的。现在的问题是,我得到的数据的制造商声称真正得到的是0x44,而不是我的输入数据完全相同的0x47。我们有不同的意见。

对于解密,我将密码学AES/CBC/NoPadding结合使用,在应用程序的调试器中,我可以看到,在调用Cipher.final之后,结果数据中已经出现了错误的0x47。因为在我的方法中没有发现任何错误,所以我决定测试可选的AES解密器,并找到了3(!)对于完全相同的输入数据,声明完全相同的结果的不同实现:

  • http://aes.online-domain-tools.com
  • http://extranet.cryptomathic.com/aescalc/index
  • -d -aes-128-cbc -iv . -K . -p -nopad -in in.bin -out out.bin

还有其他的AES解密器,但它们中的大多数不支持init向量,因此也没有提供正确的结果。这就是重点,不同的输入产生不同的输出,根据我的测试,差异总是很大的。它从不只是改变了几个字节,或者其他什么,它总是完全错误或完全正确的,除了我看到的一个字节。

那么,如果实现适当的AES,同一输入相同的AES解密操作会产生不同的结果吗?我不这样认为。

除了一个字节之外,错误的输入产生正确结果的可能性有多大?因为无论是我的输入还是其他输入都可能是错误的,即使它是复制的,而且我看不出有什么不同。

错误的AES实现产生近乎正确的结果的可能性有多大?Java提供错误的AES实现的可能性有多大?我不这样认为。

关于我还能测试什么有什么建议吗?在我看来,我可能有3种不同的额外实现都证明了我的结果,所以我认为我所做的是正确的,而且由于某种原因,一个特殊字节的差异需要来自其他地方。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-07 20:28:53

在这种情况下,不正确的字节似乎位于第一个块中,因此由不正确的IV引起。

关于答复的评论:

IV是用第一个数据块xor‘编辑的,参见CBC模式解密。在加密时,IV的单个字节(或位)更改将影响所有字节,但在解密时,它只影响第一个块中与不正确的字节(或比特) IV对应的字节(位)。

另一种常见的方法是将IV加到加密的数据中,这样就不必通过另一个通道/方法来共享IV,以确保它是正确的。

这确实指出核查计划很差。更好的方案考虑到所有加密的字节,通常是加密数据的HMAC。但在计算有限的环境中,CRC甚至校验和可能就足够了。

票数 0
EN

Stack Overflow用户

发布于 2017-03-07 19:04:33

除了一个字节之外,错误的输入产生正确结果的可能性有多大?

这很可能是很可能的,取决于错误的输入:我发现了差异,在init向量中只有一个字节是不同的,这种差异在实际结果中只有一个字节的差异。

init向量的不同之处在于对底层规范的不同理解,后者定义了如何正确构建init向量。数据来自某个设备,它需要在数据中包含它的版本号,而规范允许同时在两个不同的地方包含该版本。对于当前有问题的记录,它可以在两个不同的地方使用,但也有两个不同的值。所以我首先使用版本号,而另一方使用第二位的版本号,因为这两个值不同,我们得到了不同的init向量和不同的结果。

WTF?:-)

票数 1
EN

Stack Overflow用户

发布于 2017-03-07 20:13:38

在CBC模式下,使用密钥对每个密码文本块进行解密,结果是XORed与前面的密码文本块一起恢复纯文本。

因为这是一个简单的XOR操作,所以前一个密码文本中的翻转位将翻转当前纯文本块中的对应位。(当然,用翻转位对数据进行解密也会彻底破坏以前的纯文本块。)

在解密第一个块时,没有密码文本的“先前”块。这就是初始化向量出现的地方。它充当密码文本的第零块,如上所述,对IV的更改将导致第一个纯文本块中的位对位更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42655317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档