今天在看哈希算法的时候,有点疑惑为啥MD5的输入每个相同的输入都能对应相同的输出,那为啥不能根据映射表来反推出原文,后面看到一句话 “哈希是用无限的输入对应有限的哈希结果集”,豁然开朗,也就是根本没有映射表,MD5的哈希算法就是只能一头进另一头出,不可逆,也就是无限的输入,一定能找到一个哈希值,但是这个固定的哈希值,可能还是对应无限的输入,所以不能进行反推,由此想到中文的哈希加密方式的一种可能。
就是我们能不能设计一种算法,直接对中文进行哈希比如,
1、“我今天去上学”对应的哈希值 : x横y竖z撇n捺m点q折p勾.......(x,y,z,n,m,q,,pint值)
2、“一二一” 对应的哈希值为: 4横0竖0撇0捺0点0折0勾....
3、“一 一 一 一” 对应的哈希值为:4横0竖0撇0捺0点0折0勾...
4、“二 二” 对应的哈希值为:4横0竖0撇0捺0点0折0勾...
也就是说,任何的中文,甚至几百亿个字的中文,都能对应一个且唯一 一个哈希值,但是不能从哈希值倒推出原文。比如 100横100竖100撇100捺100点100折100勾... 你能猜出它是由哪些中文组成的?结果应该趋于无限。
优点:
1、输入是无限的,而输出也是无限的,如果设置长密码,被反推破解密码的可能性几乎为0
缺点:
1、输出是无限的是因为对整个输入进行了解析,比如输入几百亿个中文,然后还有先每个汉字进行笔画的分类统计,才能得出哈希值,可能会导致处理时间较长(不过MD5估计也会对所有的字符进行遍历统计)
2、汉字越少,哈希碰撞概率会急剧升高,比如上面的示例2、3、4,得出的就是同一个哈希值,而且字数越少越容易被暴力破解,比如哈希值:“1横0竖0撇0捺0点0折0勾...”我们能猜出它应该就是“一”。
写到一半才想起来,这个哈希加密的方式愚蠢至极,虽然说这也是一直单向求解的加密方式,你几乎不能从哈希值得出我的原文,但是,这他妈完全不能作为密码加密来进行使用,因为这个哈希结果太明显了,容易被伪造,比如我知道你的哈希值是
100横0竖0撇0捺0点0折0勾...我不知道原文是一二三。。。(省略)。。 还是 二一三一。。。。。但是我完全可以直接输入100百个一,得出这个哈希值,然后和数据库的一对比,直接破解,太蠢了!至于其他更复杂的哈希值,也可以通过求余的方式进行填充构造哈希值。
根本就是像 “睡眠算法” 一样扯。
无限对应有限其实就是非对称加密。。。。。