MD5消息摘要算法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MD5消息摘要算法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8124字,纯文字阅读大概需要12分钟。
内容图文
![MD5消息摘要算法](/upload/InfoBanner/zyjiaocheng/1306/f0262b0d76b9482884e0ed4297894523.jpg)
MD5原理:
MD5算法:
1 #include<iostream> 2 #include<string> 3usingnamespace std; 4#define shift(x, n) (((x) << (n)) | ((x) >> (32-(n))))//右移的时候,高位一定要补零,而不是补充符号位 5#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) 6#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) 7#define H(x, y, z) ((x) ^ (y) ^ (z)) 8#define I(x, y, z) ((y) ^ ((x) | (~z))) 9#define A 0x67452301 10#define B 0xefcdab89 11#define C 0x98badcfe 12#define D 0x10325476 13//strBaye的长度 14 unsigned int strlength; 15//A,B,C,D的临时变量 16 unsigned int atemp; 17 unsigned int btemp; 18 unsigned int ctemp; 19 unsigned int dtemp; 20//常量ti unsigned int(abs(sin(i+1))*(2pow32)) 21const unsigned int k[]={ 220xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee, 230xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,0x698098d8, 240x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193, 250xa679438e,0x49b40821,0xf61e2562,0xc040b340,0x265e5a51, 260xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8, 270x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905, 280xfcefa3f8,0x676f02d9,0x8d2a4c8a,0xfffa3942,0x8771f681, 290x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60, 300xbebfbc70,0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05, 310xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,0xf4292244, 320x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92, 330xffeff47d,0x85845dd1,0x6fa87e4f,0xfe2ce6e0,0xa3014314, 340x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391}; 35//向左位移数 36const unsigned int s[]={7,12,17,22,7,12,17,22,7,12,17,22,7, 3712,17,22,5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20, 384,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,6,10, 3915,21,6,10,15,21,6,10,15,21,6,10,15,21}; 40constchar str16[]="0123456789abcdef"; 41void mainLoop(unsigned int M[]) 42{ 43 unsigned int f,g; 44 unsigned int a=atemp; 45 unsigned int b=btemp; 46 unsigned int c=ctemp; 47 unsigned int d=dtemp; 48for (unsigned int i = 0; i < 64; i++) 49 { 50if(i<16){ 51 f=F(b,c,d); 52 g=i; 53 }elseif (i<32) 54 { 55 f=G(b,c,d); 56 g=(5*i+1)%16; 57 }elseif(i<48){ 58 f=H(b,c,d); 59 g=(3*i+5)%16; 60 }else{ 61 f=I(b,c,d); 62 g=(7*i)%16; 63 } 64 unsigned int tmp=d; 65 d=c; 66 c=b; 67 b=b+shift((a+f+k[i]+M[g]),s[i]); 68 a=tmp; 69 } 70 atemp=a+atemp; 71 btemp=b+btemp; 72 ctemp=c+ctemp; 73 dtemp=d+dtemp; 74} 75/* 76*填充函数 77*处理后应满足bits≡448(mod512),字节就是bytes≡56(mode64) 78*填充方式为先加一个1,其它位补零 79*最后加上64位的原来长度 80*/ 81 unsigned int* add(string str) 82{ 83 unsigned int num=((str.length()+8)/64)+1;//以512位,64个字节为一组 84 unsigned int *strByte=new unsigned int[num*16]; //64/4=16,所以有16个整数 85 strlength=num*16; 86for (unsigned int i = 0; i < num*16; i++) 87 strByte[i]=0; 88for ( i=0; i <str.length(); i++) 89 { 90 strByte[i>>2]|=(str[i])<<((i%4)*8);//一个整数存储四个字节,i>>2表示i/4 一个unsigned int对应4个字节,保存4个字符信息 91 } 92 strByte[str.length()>>2]|=0x80<<(((str.length()%4))*8);//尾部添加1 一个unsigned int保存4个字符信息,所以用128左移 93/* 94 *添加原长度,长度指位的长度,所以要乘8,然后是小端序,所以放在倒数第二个,这里长度只用了32位 95*/ 96 strByte[num*16-2]=str.length()*8; 97return strByte; 98} 99string changeHex(int a) 100{ 101int b; 102string str1; 103string str=""; 104for(int i=0;i<4;i++) 105 { 106 str1=""; 107 b=((a>>i*8)%(1<<8))&0xff; //逆序处理每个字节108for (int j = 0; j < 2; j++) 109 { 110 str1.insert(0,1,str16[b%16]); 111 b=b/16; 112 } 113 str+=str1; 114 } 115return str; 116} 117string getMD5(string source) 118{ 119 atemp=A; //初始化120 btemp=B; 121 ctemp=C; 122 dtemp=D; 123 unsigned int *strByte=add(source); 124for(unsigned int i=0;i<strlength/16;i++) 125 { 126 unsigned int num[16]; 127for(unsigned int j=0;j<16;j++) 128 num[j]=strByte[i*16+j]; 129 mainLoop(num); 130 } 131return changeHex(atemp).append(changeHex(btemp)).append(changeHex(ctemp)).append(changeHex(dtemp)); 132} 133 unsigned int main() 134{ 135string ss; 136// cin>>ss;137string s=getMD5("abc"); 138 cout<<s; 139return0; 140 }
MD5总结:
![技术分享](/upload/getfiles/default/2022/11/27/20221127094004485.jpg)
原文:http://www.cnblogs.com/zibility/p/5400546.html
内容总结
以上是互联网集市为您收集整理的MD5消息摘要算法全部内容,希望文章能够帮你解决MD5消息摘要算法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。