把文件加密压缩,文件自身的SHA512哈希值作为密码,破解得到这个文件的可能性

这个题其实还是稍微有点意思的,但是这道题的解决其实涉及到了密码学中一个大概10年前争论不休的问题:一个安全Hash的输出能否看成一个随机数?=====================我是回答问题的分割线=====================首先我们还回答一下问题。这个问题其实需要几个前提条件:加密算法本身是安全的。即:只有通过枚举密钥这一种方法才能够破解该加密算法。当然了,这是一个非常直观的说法,有些不太严谨,不过便于理解。产生密钥所使用的Hash(即文中提到的SHA512)是安全的,很难找到两个不同的输入m1,m2,使得Hash(m1) = Hash(m2)。这也是一个非常直观的说法,不太严谨,便于理解。在这两个条件成立的前提下,如果我们认为一个安全Hash的输出值可以看成一个随机数,那么这个问题的答案是可证明安全的。否则,这个问题的答案是实际上安全的。这里我可以大概说一下为什么安全:因为Hash的输出值可以看成是一个随机数。因此,加密文件Hash的结果也可以看成是一个随机数。这样,密文的加密是通过一个随机产生的密钥进行加密的,由于加密算法是安全的,因此除非获知密钥,否则无法恢复出明文信息。因此,这样的加密满足:(1)密钥的随机性,(2)加密算法的安全性。因此加密是安全的。如果我们不能把Hash的输出看成一个随机数。那么加密过程不满足密钥随机性这一条件。因此,攻击者可以通过破解Hash完成加密算法的破解。但是,攻击者在问题条件下用这种方式破解也是不可行的,因为其攻击的前提就是要知道加密的密钥,即Hash结果。但是如果知道Hash的结果问题也就解决了… 所以虽然严格意义上讲我们无法形式化证明安全,但是这种加密方法是实际上安全的。====================我是有关题目解读的分割线=================1. 一个安全Hash的输出能否看成一个随机数在密码学中,一个安全Hash的输出可以看成一个随机数是有对应的密码学安全模型的,这个模型叫做Random Oracle Model,中文为随机预言模型,其定义可参考维基百科:隨機預言。现在一般认为,随机预言可以作为一个安全假设,但并不能证明这个模型是严格意义上安全的。2. 有关题目的一些解读这种加密方式,其实密码是没有给接受者的。虽然密码的生成使用了明文,但是如果加密算法是安全的,那么密文与明文是严格不相关的,也就是说从密文是无法推出明文的任何有用信息的。也就是说,密码完全没有包含在加密的密文中…当然,我的回答里面涉及到了一些密码学的假设以及证明,如果有疑问或者对这个感兴趣,欢迎私信联系我~
■网友
扯了一堆没用的。你这不过是把密码限定为固定64个字符范围固定16个字符(0_9-A_F)而已嘛,跟“文件自身的SHA512哈希值”没多大关系,这样加密和0_9-A_F随机取64个字符做密码没什么区别嘛。只不过密码长度够长,暴力破解需要时间太长了。不过既然你不限破解时间,那就只是时间问题。嗯,这个密码组合实在有点大,如果用暴力破解,用n台电脑分布式规划一下算法,是有可能较短时间攻破的。
■网友
这个问题可以再提炼一下。带密码保护的压缩,可以看作一种加密算法,那么问题就变成了:加密过程中,使用原文的hash作为密钥是否安全?观察下这个过程:密文 = encrypt( 明文, hash(明文) )可以看到,这个过程中,密文完全是由明文自己生成的,并没有引入额外的随机性。更深入的分析已经超出我目前的能力了,但这种方式无疑增大了被破解的概率——也许微不足道。即便不考虑任何对hash算法和加密算法本身安全性的分析,这种做法也给自动化暴力破解提供了便利:for key in 密钥空间: if hash( decrypt(密文, key) ) == key: print "find: ", key当然,512比特(sha512)的密钥空间还是相当大的,这种暴力破解非常耗时。但假如加通过分析能找出一种让


推荐阅读