下面是编程之家 jb51.cc 通过网络收集整理的代码片段。
编程之家小编现在分享给大家,也给大家做个参考。
#include "iostream"
#include "string"
#include "math.h"
using namespace std;
typedef char byte;
//初始化四个数
long A=0X67452301l;
long B=0XEFCDAB89l;
long C=0X98BADCFEl;
long D=0X10325476l;
long F(long x,long y,long z){
return ((x & y) | ((~x) & z)) &0x0ffffffffl;
}
long G(long x,long z){
return ((x & z) | (y & (~z))) &0x0ffffffffl;
}
long H(long x,long z){
return (x ^ y ^ z) &0x0ffffffffl;
}
long I(long x,long z){
return (y ^ (x | (~z))) &0x0ffffffffl;
}
long FF(long a,long b,long c,long d,long Mj,long s,long ti) {
a = (a + F(b,c,d) + Mj + ti) & 0xffffffffl;
a = ( a << s) | (a >> (32 - s));
a += b;
return (a&0xFFFFFFFFL);
}
long GG(long a,int Mj,int s,int ti){
a = (a + G(b,d) + Mj + ti) & 0xffffffffl;
a = ( a << s) | (a >> (32 - s));
a += b;
return (a&0xFFFFFFFFL);
}
long HH(long a,int ti){
a = (a + H(b,d) + Mj + ti) & 0xffffffffl;
a = ( a << s) | (a >> (32 - s));
a += b;
return (a&0xFFFFFFFFL);
}
long II(long a,int ti){
a = (a + I(b,d) + Mj + ti) & 0xffffffffl;
a = ( a << s) | (a >> (32 - s));
a += b;
return (a&0xFFFFFFFFL);
}
void Loops(int group[16]){
long a = A,b = B,c = C,d = D;
//第一轮循环
a = FF(a,b,d,group[0],7,0xd76aa478);
d = FF(d,a,group[1],12,0xe8c7b756);
c = FF(c,group[2],17,0x242070db);
b = FF(b,group[3],22,0xc1bdceee);
a = FF(a,group[4],0xf57c0faf);
d = FF(d,group[5],0x4787c62a);
c = FF(c,group[6],0xa8304613);
b = FF(b,group[7],0xfd469501);
a = FF(a,group[8],0x698098d8);
d = FF(d,group[9],0x8b44f7af);
c = FF(c,group[10],0xffff5bb1);
b = FF(b,group[11],0x895cd7be);
a = FF(a,group[12],0x6b901122);
d = FF(d,group[13],0xfd987193);
c = FF(c,group[14],0xa679438e);
b = FF(b,group[15],0x49b40821);
//第二轮循环
a = GG(a,5,0xf61e2562);
d = GG(d,9,0xc040b340);
c = GG(c,14,0x265e5a51);
b = GG(b,20,0xe9b6c7aa);
a = GG(a,0xd62f105d);
d = GG(d,0x02441453);
c = GG(c,0xd8a1e681);
b = GG(b,0xe7d3fbc8);
a = GG(a,0x21e1cde6);
d = GG(d,0xc33707d6);
c = GG(c,0xf4d50d87);
b = GG(b,0x455a14ed);
a = GG(a,0xa9e3e905);
d = GG(d,0xfcefa3f8);
c = GG(c,0x676f02d9);
b = GG(b,0x8d2a4c8a);
//第三轮循环
a = HH(a,4,0xfffa3942);
d = HH(d,11,0x8771f681);
c = HH(c,16,0x6d9d6122);
b = HH(b,23,0xfde5380c);
a = HH(a,0xa4beea44);
d = HH(d,0x4bdecfa9);
c = HH(c,0xf6bb4b60);
b = HH(b,0xbebfbc70);
a = HH(a,0x289b7ec6);
d = HH(d,0xeaa127fa);
c = HH(c,0xd4ef3085);
b = HH(b,0x04881d05);
a = HH(a,0xd9d4d039);
d = HH(d,0xe6db99e5);
c = HH(c,0x1fa27cf8);
b = HH(b,0xc4ac5665);
//第四轮循环
a = II(a,6,0xf4292244);
d = II(d,10,0x432aff97);
c = II(c,15,0xab9423a7);
b = II(b,21,0xfc93a039);
a = II(a,0x655b59c3);
d = II(d,0x8f0ccc92);
c = II(c,0xffeff47d);
b = II(b,0x85845dd1);
a = II(a,0x6fa87e4f);
d = II(d,0xfe2ce6e0);
c = II(c,0xa3014314);
b = II(b,0x4e0811a1);
a = II(a,0xf7537e82);
d = II(d,0xbd3af235);
c = II(c,0x2ad7d2bb);
b = II(b,0xeb86d391);
//把运算后结果写回去
A += a,B += b,C += c,D += d;
A &= 0xffffffff;
B &= 0xffffffff;
C &= 0xffffffff;
D &= 0xffffffff;
}
//根据循环后ABCD的值得到MD5码
string getMdCode(){
string codes[16]={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
string code = "";
long a = A,d = D;
for (int i = 0; i < 4; i++){
int tmp = a & 0x0f;
string first = codes[tmp];
a >>= 4;
tmp = a & 0x0f;
string second = codes[tmp];
code += (second + first);
a >>= 4;
}
for (int i = 0; i < 4; i++){
int tmp = b & 0x0f;
string first = codes[tmp];
b >>= 4;
tmp = b & 0x0f;
string second = codes[tmp];
code += (second + first);
b >>= 4;
}
for (int i = 0; i < 4; i++){
int tmp = c & 0x0f;
string first = codes[tmp];
c >>= 4;
tmp = a & 0x0f;
string second = codes[tmp];
code += (second + first);
c >>= 4;
}
for (int i = 0; i < 4; i++){
int tmp = d & 0x0f;
string first = codes[tmp];
d >>= 4;
tmp = d & 0x0f;
string second = codes[tmp];
code += (second + first);
d >>= 4;
}
A=0X67452301l;
B=0XEFCDAB89l;
C=0X98BADCFEl;
D=0X10325476l;
return code;
}
int bitToUnsign(int b){
return b < 0 ? b & 0x7f + 128:b;
}
//将64个字节划分成16组,每小组4个字节
int* divideGroup(byte *bytes,int n){
int *group = new int[16];
for (int i = 0; i < 16; i++){
int a1 = bitToUnsign((int)bytes[n+4*i]);
int a2 = (bitToUnsign((int)bytes[n+4*i+1]) << 8);
int a3 = (bitToUnsign((int)bytes[n+4*i+2]) << 16);
int a4 = (bitToUnsign((int)bytes[n+4*i+3]) << 24);
group[i] = a1 | a2 | a3 | a4;
}
return group;
}
//根据输入信息来返回该信息对应的MD5码
string md5(string s){
long length = s.length();
byte *ch = new byte[length + 1];
for (int i = 0; i < length; i++){ //将string转化为byte的数组
ch[i] = (byte)s[i];
}
long groupLength = length / 64;
for (int i = 0; i < groupLength; i++){
Loops(divideGroup(ch,i * 64)); //先分组,然后再进行循环处理
}
int remain = length % 64; //剩余的字节
byte rest[128];
long bitLength = length << 3; //信息总共有多少位
if (remain <=56){
for (int i = 0; i < remain; i++){
rest[i] = ch[length - remain + i];
}
if (remain < 56){
rest[remain] = (byte)(-128);//补1
for (int i = 1; i < 56 - remain; i++){ //补0,直到为56个字节(448位)
rest[remain + i] = 0;
}
}
for (int i = 56; i < 64; i++){ //补长度
rest[i] = (byte)(bitLength & 0xff);
bitLength = bitLength >> 8;
}
Loops(divideGroup(rest,0));
}
else { //多于56个字节,则先补到120字节,再用剩余的八个字节来储存长度
rest[remain] = (-128); //补1
for (int i = remain + 1; i < 120; i++) { //补0
rest[i] = 0;
}
for (int i = 120; i < 128; i++){ //补长度
rest[i] = (byte)(bitLength & 0xff);
bitLength >>= 8;
}
Loops(divideGroup(rest,0));
Loops(divideGroup(rest,64));
}
//根据运算后的ABCD返回其MD5码
return getMdCode();
}
int main(int argc,char * argcs[]){
string s = "";
cout << md5(s) << endl;
s = "a";
cout << md5(s) << endl;
s = "abc";
cout << md5(s) << endl;
return 0;
}
以上是编程之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
总结
以上是编程之家为你收集整理的md5的C语言实现全部内容,希望文章能够帮你解决md5的C语言实现所遇到的程序开发问题。
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
小编个人微信号 jb51ccc
喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!