看到这个标题你的第一反应是不是觉得这不可能,并认为我是个菜鸟,联MD5是做什么用的都不懂就在这里瞎扯。
有这样的反应很正常,因为我每次和人说,我用的加解密工具是自己用MD5算法实现的,都是这样的反应。但不管你信不信,这是事实。
接下来我说下大致的算法并随后上传一个工具软件。来证明我没说大话。然后大家和我一起写自己的加解密工具让别人去破解吧!^_^
什么是MD5呢?下面是摘自网络上对MD5的简单介绍。
Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等
而对于MD5的常规用法,我将其简单概括就是将口令和一个动态字串进行混合,然后进行MD5运算得到一个32位的MD5结果。并用此32位MD5结果与服务器运算结果进行对比,一至则通过。而其中参加运算的动态字串一般为时间戳。
很明显MD5的特性是对任意字串可以形成一个32位的结果。并且任意字串相同则经过MD5运算后结果也相同,若只对文件内容进行简单MD5计算得到的32位结果,是无法进行逆向操作还原文件的,
所以要用MD5对文件进行加解密是不能简单这样做的,需要变通一下。我们利用位异或运算特性来实现对文件的加解密。
将口令经MD5运算后得到32位的值A,将文件中的数据按32位分割成多个部分B[1..n],并对每一部分与A进行位异或得到数据C[1..n],这样C就为密文。将C[1,n]分别与A进行位异或运算,则实现解密过程得到B[1,n].
接下来,写个密文件头,用来记录文件的实际长度以保证加解密过程中文件的长度一至,然后就可以了呢,这样做可以是可以,但比较容易被解密。大约只要约42亿次就可暴力解密。
如何增加破解的难度呢?分析下就会发现上面的算法最大的破绽就是用相同的A对文件各部分B[1,n]进行位异或。若使A也变成A[1,n],则破解难度将大增。
如何使一个A变成n个不同的A呢?我们还是利用MD5的特性,将口令中混入一个有序值,如自然数1到N,或者有序偶数等,这样每次都进行MD5运算就可形成A[1,n]。