加密解密_MD5初解
作者:admin 日期:2010-01-02
谈起收费软件,大家的第一反应一定是2个字—花钱!(众人:废话!不让你花钱能叫收费软件啊)。那么之后闪过大家脑海的一定就是那又倒霉又繁琐的序列号啦,但是公平的讲呢,现有的序列号加密算法大多都是由一些软件开发者自行设计的,尤其是个别的软件开发者,自身的IQ就偏低,所以导致大部分是相当的简单,更有些算法的作者下的功夫之大,可谓是前无古人后无来者,所取得的效果也真是前无古人后无来者的“高”(注意标点!)
其实呢,当今互联网世界还是有很多很多成熟的加密算法可以让各位来参考,特别是密码学中比较成熟的一些算法,比如RSA,MD5,TEA等等。但是这里要提醒各位的是,虽然这些算法在互联网上拥有大量的库和源代码,可以让你直接拿来使用,不过方法也是要得当的,否则你的算法和1+1=2这个简单的等式没有本质区别。
哈希算法
哈希算法也叫做单向散列加密,是一种将任意长度的消息压缩到某一长度的函数,当然这个过程是不可逆转的。(这里给大家补充下高中数学知识,函数:任意的非空数集,A在法则f的作用下,都在B中有唯一确定的值与其对应,我们说这个法则f就是A对B的函数。貌似教科书是这么说的..)。可以说呢,哈希算法的应用范围非常的广泛,从数字签名,消息的完整性检验等等都可以用到,大家常见的单向散列加密就有SHA,MD5,HAVAL等等…
MD5算法
为什么要讲MD5算法呢,因为这个算法最流行,流行的都是经典的。它对输入的任意长度的消息进行运算,生成一个128位的消息摘要,但是随着时间的推移,随着爆破攻击和MD5碰撞的深入研究,MD5的流行度开始走低,但是这并不影响我们一同来解密神奇的MD5算法。
我的数学老师告诉我,做数学,一定要去找根源,找到算法原理。所以关于,MD5算法,我也从算法原理说起,至于它的历史,我们之后再谈~~
1 数据填充
填充消息让消息的长度与448模512同余(这句话不理解你可以去问你的数学老师或者计算机老师..)或者给大家通俗的讲,就是说填充后的消息长度要比512的倍数仅仅小64位的数,但是这里要说明的是,即使你消息长度自身的长度符合要求,仍然是需要填充的。
填充方法其实很简单,比那句绕口的话明了很多…在消息后面附一个1,然后用0来填充,直到达到要求(别问我什么要求,如果你认真看上文的话…),这里有个小要求,就是至少填充1位,至多填充512位。
2 添加长度
这时候在上一步的结果后面附加上64位的消息长度,如果你填充前消息的长度就大于18446744073709551616,那么就使用低于64位,这个时候你会惊奇的发现,在添加完填充位和消息长度之后,最终消息的长度正好就是512的整数倍了…(什么?你不相信?手算一个吧…什么你没那么多草稿纸,哎,用3卷卫生纸就差不多了吧)
另外提下,如果说另Z[0…..N-1],其中N就是16的倍数
3 初始化变量
这里用到4个变量 A B C D 来计算消息摘要,A B C D分别都是32位寄存器,这些寄存器通过16进制数值初始化:A=01234567h B=89abcdefgh C=fedcba98h D=76543210h
在内存中是以低字节在前的形式来存储的(这个不理解也可以去参考我之前的幻灯片,有详细的介绍)
大概是这样的形式:
01 23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10
4 数据的处理
要以512位分组为单位处理消息,首先会定义4个辅助函数,每个都是以3个32位双字作为输入,输出一个32位的双字..(看清楚!是双字不是双子…啊,我的血色珍珠披风…嗯,跑题了)
F(X,Y,Z)=(X&Y) ︳((~X)&Z)
G(X,Y,Z)=(X&Z) ︳(Y&(~Z))
H(X,Y,Z)=X^Y^Z
I(X,Y,Z)=Y^(X︳(~Z))
简单的给大家说下,这个是什么意思,这里的&是与操作,︳是或操作,^是异或操作
首先这4轮变换是对进入主体循环的512位消息分组的16个32位字分别进行操作,将A B C D 的副本,a b c d中的3个经过F G H I运算后的结果与第四个相加,然后再和一个32位字以及一个32位字的加法常数,把所得的值循环左移N位,最后将所得结果加上a b c d 的其中之一,然后送回A B C D中完成一次循环。
所用的加法常数有一张表T来定义,其中的I是1~64之中的值,T等于4294967296 *abs(sin(i))所得到结果的一个整数部分,这里的I用弧度制单位表示是为了通过正弦函数和幂函数来消除线性的。
之后的过程呢,就是输出的过程了,当所有的512位分组都运算完毕以后,ABCD的级联就是被输出的MD5结果。
后记
MD5实现了把任意长度的字符串变成一个128位的大整数,而且是不可逆转的,R.Rivest的这个发明是伟大的。即便是现在这个MD5源码满天横飞,随便一个高中女孩都可以搞明白MD5的详尽算法,但是至今没有任何一个人可以用一个经过MD5算法加密过的字符串还原回原始的字符串,当然,你有大把的时间和高端配置的服务器去暴力破解,我也没话说。而王小云老师所说的MD5碰撞试验,也
仅仅是说,MD5算法不应再被用于任何软件完整性检查或代码签名的用途。况且,他们用了两天时间才找到。
实际过程中,如果你的算法运用不当,那绝对是没什么保护效果的,看看下面这个蠢例子
If (我是MD5(用户名) ==我是序列号)
正确的注册码
Else
错误的注册码
看看吧,由于正确的序列号以明文形式出现在内存中,所以每一个破解者都很容易得到了正确的注册码,写注册机只要识别出程序采用的MD5算法就够了,可笑的是,很长时间以来,各位作者都是偏爱这种判断方式。
风暴小结
上面给大家说了MD5算法,在庞大的密码学中,Hash算法还有很多种,比如HAVAL
有一个要引起我们大家深思和重视的问题,就是随着密码分析技术的发展,散列算法都是偏向于不安全的。就比如MD5碰撞。
好了,废话不多说了,已经是深夜时分了,希望本公主没有错过公爵的晚宴,文章也有2千字了…希望这样的东西能给大家带来些好处
原文来自黑客x档案:http://bbs.hackerxfiles.net/thread-388639-1-1.html
其实呢,当今互联网世界还是有很多很多成熟的加密算法可以让各位来参考,特别是密码学中比较成熟的一些算法,比如RSA,MD5,TEA等等。但是这里要提醒各位的是,虽然这些算法在互联网上拥有大量的库和源代码,可以让你直接拿来使用,不过方法也是要得当的,否则你的算法和1+1=2这个简单的等式没有本质区别。
哈希算法
哈希算法也叫做单向散列加密,是一种将任意长度的消息压缩到某一长度的函数,当然这个过程是不可逆转的。(这里给大家补充下高中数学知识,函数:任意的非空数集,A在法则f的作用下,都在B中有唯一确定的值与其对应,我们说这个法则f就是A对B的函数。貌似教科书是这么说的..)。可以说呢,哈希算法的应用范围非常的广泛,从数字签名,消息的完整性检验等等都可以用到,大家常见的单向散列加密就有SHA,MD5,HAVAL等等…
MD5算法
为什么要讲MD5算法呢,因为这个算法最流行,流行的都是经典的。它对输入的任意长度的消息进行运算,生成一个128位的消息摘要,但是随着时间的推移,随着爆破攻击和MD5碰撞的深入研究,MD5的流行度开始走低,但是这并不影响我们一同来解密神奇的MD5算法。
我的数学老师告诉我,做数学,一定要去找根源,找到算法原理。所以关于,MD5算法,我也从算法原理说起,至于它的历史,我们之后再谈~~
1 数据填充
填充消息让消息的长度与448模512同余(这句话不理解你可以去问你的数学老师或者计算机老师..)或者给大家通俗的讲,就是说填充后的消息长度要比512的倍数仅仅小64位的数,但是这里要说明的是,即使你消息长度自身的长度符合要求,仍然是需要填充的。
填充方法其实很简单,比那句绕口的话明了很多…在消息后面附一个1,然后用0来填充,直到达到要求(别问我什么要求,如果你认真看上文的话…),这里有个小要求,就是至少填充1位,至多填充512位。
2 添加长度
这时候在上一步的结果后面附加上64位的消息长度,如果你填充前消息的长度就大于18446744073709551616,那么就使用低于64位,这个时候你会惊奇的发现,在添加完填充位和消息长度之后,最终消息的长度正好就是512的整数倍了…(什么?你不相信?手算一个吧…什么你没那么多草稿纸,哎,用3卷卫生纸就差不多了吧)
另外提下,如果说另Z[0…..N-1],其中N就是16的倍数
3 初始化变量
这里用到4个变量 A B C D 来计算消息摘要,A B C D分别都是32位寄存器,这些寄存器通过16进制数值初始化:A=01234567h B=89abcdefgh C=fedcba98h D=76543210h
在内存中是以低字节在前的形式来存储的(这个不理解也可以去参考我之前的幻灯片,有详细的介绍)
大概是这样的形式:
01 23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10
4 数据的处理
要以512位分组为单位处理消息,首先会定义4个辅助函数,每个都是以3个32位双字作为输入,输出一个32位的双字..(看清楚!是双字不是双子…啊,我的血色珍珠披风…嗯,跑题了)
F(X,Y,Z)=(X&Y) ︳((~X)&Z)
G(X,Y,Z)=(X&Z) ︳(Y&(~Z))
H(X,Y,Z)=X^Y^Z
I(X,Y,Z)=Y^(X︳(~Z))
简单的给大家说下,这个是什么意思,这里的&是与操作,︳是或操作,^是异或操作
首先这4轮变换是对进入主体循环的512位消息分组的16个32位字分别进行操作,将A B C D 的副本,a b c d中的3个经过F G H I运算后的结果与第四个相加,然后再和一个32位字以及一个32位字的加法常数,把所得的值循环左移N位,最后将所得结果加上a b c d 的其中之一,然后送回A B C D中完成一次循环。
所用的加法常数有一张表T来定义,其中的I是1~64之中的值,T等于4294967296 *abs(sin(i))所得到结果的一个整数部分,这里的I用弧度制单位表示是为了通过正弦函数和幂函数来消除线性的。
之后的过程呢,就是输出的过程了,当所有的512位分组都运算完毕以后,ABCD的级联就是被输出的MD5结果。
后记
MD5实现了把任意长度的字符串变成一个128位的大整数,而且是不可逆转的,R.Rivest的这个发明是伟大的。即便是现在这个MD5源码满天横飞,随便一个高中女孩都可以搞明白MD5的详尽算法,但是至今没有任何一个人可以用一个经过MD5算法加密过的字符串还原回原始的字符串,当然,你有大把的时间和高端配置的服务器去暴力破解,我也没话说。而王小云老师所说的MD5碰撞试验,也
仅仅是说,MD5算法不应再被用于任何软件完整性检查或代码签名的用途。况且,他们用了两天时间才找到。
实际过程中,如果你的算法运用不当,那绝对是没什么保护效果的,看看下面这个蠢例子
If (我是MD5(用户名) ==我是序列号)
正确的注册码
Else
错误的注册码
看看吧,由于正确的序列号以明文形式出现在内存中,所以每一个破解者都很容易得到了正确的注册码,写注册机只要识别出程序采用的MD5算法就够了,可笑的是,很长时间以来,各位作者都是偏爱这种判断方式。
风暴小结
上面给大家说了MD5算法,在庞大的密码学中,Hash算法还有很多种,比如HAVAL
有一个要引起我们大家深思和重视的问题,就是随着密码分析技术的发展,散列算法都是偏向于不安全的。就比如MD5碰撞。
好了,废话不多说了,已经是深夜时分了,希望本公主没有错过公爵的晚宴,文章也有2千字了…希望这样的东西能给大家带来些好处
原文来自黑客x档案:http://bbs.hackerxfiles.net/thread-388639-1-1.html
评论: 0 | 查看次数: 8813