MD5 加密算法主思想
来源:互联网 发布:深入分析java web pdf 编辑:程序博客网 时间:2024/05/20 08:22
MD5算法
md5算法的主要思想
1.填充
使其总位数为512的整数倍(为了后面的信息处理)
先求出信息总的位数,,并且以64位的二进制表示,记为M
填充内容为0,填充位数=448-(总位数对512求余)
然后把M在其后加上.
2.加密处理
链接变量
MD5中有四个32位被称作链接变量(Chaining Variable)的整数参数,
分别为:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210
通过这四个变量,对N个512位的分组分别做(4轮的循环),即每个分组都要进行(4轮循环)
将这512个分组分为16个64位的子分组.
这个(4轮循环),每轮都要对这16个子分组进行操作
第一轮循环分别对16个子分组进行运算(操作)
第二轮循环分别对16个子分组进行运算(操作)
第三轮循环分别对16个子分组进行运算(操作)
第四轮循环分别对16个子分组进行运算(操作)
每一轮循环都要用到非线性函数,
分别是:
F(X,Y,Z)=(X&Y)|((~X)&Z)</span>G(X,Y,Z)=(X&Z)|(Y&(~Z))</span>H(X,Y,Z)=X^Y^Z</span> I(X,Y,Z)=Y^(X|(~Z))</span>
每次操作对a、b、c和d中的其中三个作一次非线性函数运算,
然后将所得结果加上第四个变量,文本的一个子分组和一个常数。
再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。
最后用该结果取代a、b、c或d中之一
对应的操作就是:Mj表示第J个子分组,<<<s表示左环移s位,ti为常数.s可设置例子中的.
ti是4294967296*abs(sin(i))的整数部分,i的单位是弧度。(4294967296等于2的32次方)
FF(a,b,c,d,Mj,s,ti)表示a=b+((a+F(b,c,d)+Mj+ti)<<<s)</span>GG(a,b,c,d,Mj,s,ti)表示a=b+((a+G(b,c,d)+Mj+ti)<<<s) HH(a,b,c,d,Mj,s,ti)表示a=b+((a+H(b,c,d)+Mj+ti)<<<s) II(a,b,c,d,Mj,s,ti)表示a=b+((a+I(b,c,d)+Mj+ti)<<<s)
例子:
四轮循环:
第一轮a=FF(a,b,c,d,M0,7,0xd76aa478)b=FF(d,a,b,c,M1,12,0xe8c7b756)c=FF(c,d,a,b,M2,17,0x242070db)d=FF(b,c,d,a,M3,22,0xc1bdceee)a=FF(a,b,c,d,M4,7,0xf57c0faf)b=FF(d,a,b,c,M5,12,0x4787c62a)c=FF(c,d,a,b,M6,17,0xa8304613)d=FF(b,c,d,a,M7,22,0xfd469501)a=FF(a,b,c,d,M8,7,0x698098d8)b=FF(d,a,b,c,M9,12,0x8b44f7af)c=FF(c,d,a,b,M10,17,0xffff5bb1)d=FF(b,c,d,a,M11,22,0x895cd7be)a=FF(a,b,c,d,M12,7,0x6b901122)b=FF(d,a,b,c,M13,12,0xfd987193)c=FF(c,d,a,b,M14,17,0xa679438e)d=FF(b,c,d,a,M15,22,0x49b40821)
第二轮a=GG(a,b,c,d,M1,5,0xf61e2562)b=GG(d,a,b,c,M6,9,0xc040b340)c=GG(c,d,a,b,M11,14,0x265e5a51)d=GG(b,c,d,a,M0,20,0xe9b6c7aa)a=GG(a,b,c,d,M5,5,0xd62f105d)b=GG(d,a,b,c,M10,9,0x02441453)c=GG(c,d,a,b,M15,14,0xd8a1e681)d=GG(b,c,d,a,M4,20,0xe7d3fbc8)a=GG(a,b,c,d,M9,5,0x21e1cde6)b=GG(d,a,b,c,M14,9,0xc33707d6)c=GG(c,d,a,b,M3,14,0xf4d50d87)d=GG(b,c,d,a,M8,20,0x455a14ed)a=GG(a,b,c,d,M13,5,0xa9e3e905)b=GG(d,a,b,c,M2,9,0xfcefa3f8)c=GG(c,d,a,b,M7,14,0x676f02d9)d=GG(b,c,d,a,M12,20,0x8d2a4c8a)第三轮a=HH(a,b,c,d,M5,4,0xfffa3942)b=HH(d,a,b,c,M8,11,0x8771f681)c=HH(c,d,a,b,M11,16,0x6d9d6122)d=HH(b,c,d,a,M14,23,0xfde5380c)a=HH(a,b,c,d,M1,4,0xa4beea44)b=HH(d,a,b,c,M4,11,0x4bdecfa9)c=HH(c,d,a,b,M7,16,0xf6bb4b60)d=HH(b,c,d,a,M10,23,0xbebfbc70)a=HH(a,b,c,d,M13,4,0x289b7ec6)b=HH(d,a,b,c,M0,11,0xeaa127fa)c=HH(c,d,a,b,M3,16,0xd4ef3085)d=HH(b,c,d,a,M6,23,0x04881d05)a=HH(a,b,c,d,M9,4,0xd9d4d039)b=HH(d,a,b,c,M12,11,0xe6db99e5)c=HH(c,d,a,b,M15,16,0x1fa27cf8)d=HH(b,c,d,a,M2,23,0xc4ac5665)第四轮a=II(a,b,c,d,M0,6,0xf4292244)b=II(d,a,b,c,M7,10,0x432aff97)c=II(c,d,a,b,M14,15,0xab9423a7)d=II(b,c,d,a,M5,21,0xfc93a039)a=II(a,b,c,d,M12,6,0x655b59c3)b=II(d,a,b,c,M3,10,0x8f0ccc92)c=II(c,d,a,b,M10,15,0xffeff47d)d=II(b,c,d,a,M1,21,0x85845dd1)a=II(a,b,c,d,M8,6,0x6fa87e4f)b=II(d,a,b,c,M15,10,0xfe2ce6e0)c=II(c,d,a,b,M6,15,0xa3014314)d=II(b,c,d,a,M13,21,0x4e0811a1)a=II(a,b,c,d,M4,6,0xf7537e82)b=II(d,a,b,c,M11,10,0xbd3af235)c=II(c,d,a,b,M2,15,0x2ad7d2bb)d=II(b,c,d,a,M9,21,0xeb86d391)
此次4轮循环完成后,更新ABCD:
A+=a;
B+=b;
C+=c;
D+=d;
然后对下一分组进行相同的运算,到最后,将四个变量的值(二进制)级联,就得到了128位的是散列值.
看起来,主思想也不是太难理解哈!
几个函数:
private static long F(long x, long y, long z) { return (x & y) | ((~x) & z); } private static long G(long x, long y, long z) { return (x & z) | (y & (~z)); } private static long H(long x, long y, long z) { return x ^ y ^ z; } private static long I(long x, long y, long z) { return y ^ (x | (~z)); } private static long FF(long a, long b, long c, long d, long x, long s, long ac) { a += (F(b, c, d)&0xFFFFFFFFL) + x + ac; a = ((a&0xFFFFFFFFL)<< s) | ((a&0xFFFFFFFFL) >>> (32 - s)); a += b; return (a&0xFFFFFFFFL); } private static long GG(long a, long b, long c, long d, long x, long s, long ac) { a += (G(b, c, d)&0xFFFFFFFFL) + x + ac; a = ((a&0xFFFFFFFFL) << s) | ((a&0xFFFFFFFFL) >>> (32 - s)); a += b; return (a&0xFFFFFFFFL); } private static long HH(long a, long b, long c, long d, long x, long s, long ac) { a += (H(b, c, d)&0xFFFFFFFFL) + x + ac; a = ((a&0xFFFFFFFFL) << s) | ((a&0xFFFFFFFFL) >>> (32 - s)); a += b; return (a&0xFFFFFFFFL); } private static long II(long a, long b, long c, long d, long x, long s, long ac) { a += (I(b, c, d)&0xFFFFFFFFL) + x + ac; a = ((a&0xFFFFFFFFL) << s) | ((a&0xFFFFFFFFL) >>> (32 - s)); a += b; return (a&0xFFFFFFFFL); }
- MD5 加密算法主思想
- MD5加密算法
- md5加密算法
- MD5加密算法
- MD5加密算法
- 加密算法MD5
- MD5加密算法
- MD5加密算法
- MD5加密算法
- MD5加密算法
- MD5加密算法
- MD5加密算法
- MD5加密算法
- MD5加密算法
- MD5加密算法
- 'md5加密算法
- md5加密算法
- MD5加密算法
- 黑马程序员---iOS基础---C语言中的结构体等问题
- mysql主从复制之已存在的库
- linux笔记
- hdu 1166
- 【暑期基础】O HDU 2014 青年歌手大奖赛 评委会打分
- MD5 加密算法主思想
- freemarker 输出html escape 转义
- 为了解决scrollview和listview冲突 设置了listview的高度 结果进页面就不是在顶部了
- 相关文档
- zoj 3430 Detect the Virus(ac自动机)
- 28岁程序员转行,何去何从?
- hdu 2057 A + B Again
- 静态代理与动态代理二
- 读书笔记19:访问者模式