📄 c语言实现md5算法.txt
字号:
//
//
#include "stdafx.h"
#include "math.h"
#include "stdio.h"
#include "conio.h"
#include "string.h"
unsigned long t[66];//T值
unsigned long A,B,C,D;
char yw4[4][4]={//后面16关于4求模,由于每四个字节就是一个循环
7,12,17,22,
5,9,14,20,
4,11,16,23,
6,10,15,21
};
void reset()
{//初始化数据,已验证此函数产生的数据没错
double d,exp2_32;
int i;
//取得T值
exp2_32=pow(2.0,32.0);
for(i=1.0;i<64.0;i++)
{
d=floor(exp2_32*abs(sin((double)i)));
t[i]=floor(exp2_32*abs(sin((double)i)));
}
//设置A,B,C,D初值
A=0x67452301;
B=0xefcdab89;
C=0x98badcfe;
D=0x10325476;
}
unsigned long f(unsigned long b,unsigned long c,unsigned long d)
{//返回第一轮的处理
return ((b&c)|((~(b))&d));
}
unsigned long g(unsigned long b,unsigned long c,unsigned long d)
{//返回第二轮的处理
return ((b&d)|((~(d))&c));
}
unsigned long h(unsigned long b,unsigned long c,unsigned long d)
{//返回第三轮的处理
return (b^c^d);
}
unsigned long funi(unsigned long b,unsigned long c,unsigned long d)
{//返回第四轮的处理
return (c^(b|(~d)));
}
unsigned long rol(unsigned long temp,int j)
{//返回temp左循环移j位
while(j>0)
{
if(j>=16)
{
_asm{ROL temp,16}
j=j-16;
}
if(j>=8)
{
_asm{ROL temp,8}
j=j-8;
}
if(j>=4)
{
_asm{ROL temp,4}
j=j-4;
}
if(j>=2)
{
_asm{ROL temp,2}
j=j-2;
}
if(j>=1)
{
_asm{ROL temp,1}
j=j-1;
}
}//temp左循环移rolc位
return temp;
}
void loop1(unsigned long msg[16])
{//16*32=512字节,第一轮处理
unsigned long temp;
int i,j;
for(i=0;i<16;i++)
{
temp=A+f(B,C,D)+msg[i]+t[i];
j=yw4[0][i%4];
temp=rol(temp,j);
A=temp+B;
temp=D; D=C;C=B;B=A;A=temp;
}
}
void loop2(unsigned long msg[16])
{//16*32=512字节,第二轮处理
unsigned long temp;
int i,j,k;
for(i=0;i<16;i++)
{
k=(1+5*i)%16;
temp=A+g(B,C,D)+msg[k]+t[i+16];
j=yw4[1][i%4];
temp=rol(temp,j);//左循环移位
A=temp+B;
temp=D;D=C;C=B;B=A;A=temp;
}
}
void loop3(unsigned long msg[16])
{//16*32=512字节,第三轮处理
unsigned long temp;
int i,j,k;
for(i=0;i<16;i++)
{
k=(5+3*i)%16;
temp=A+h(B,C,D)+msg[k]+t[i+32];
j=yw4[2][i%4];
temp=rol(temp,j);//左循环移位
A=temp+B;
temp=D; D=C;C=B;B=A;A=temp;
}
}
void loop4(unsigned long msg[16])
{//16*32=512字节,第四轮处理
unsigned long temp;
int i,j,k;
for(i=0;i<16;i++)
{
k=(7*i)%16;
temp=A+funi(B,C,D)+msg[k]+t[i+48];
j=yw4[3][i%4];
temp=rol(temp,j);//左循环移位
A=temp+B;
temp=D; D=C;C=B;B=A;A=temp;
}
}
void loop(unsigned long msg[16])
{//对一个分组进行一次处理
unsigned long tempa,tempb,tempc,tempd;
tempa=A;tempb=B;tempc=C;tempd=D;//保存当前情况,用于第四论后处理
loop1(msg);loop2(msg);loop3(msg);loop4(msg);//四轮加密
A=tempa+A;B=tempb+B;C=tempc+C;D=tempd+D;//作为输出
}
void input_msg()
{//输入内容,并进行处理,显示结果
char msg[10240];
unsigned long inmsg[600];
char lenmsg[10];
char res[100];
int i=0,tempi,k,j;
fflush(stdin);
printf("\n\n输入内容:");
scanf("%s",msg);
i=strlen(msg);//计算长度
tempi=i;//被填前的长度
memmove(inmsg,msg,i);
msg[i]=128;//第一位为1
memset(msg+i,0,10240-i);//其余填0
i=i+64-i%64;//要求填够1至512位,i的单位为字节
k=tempi*8;//填充前的字节数
inmsg[i/4-2]=k%16;k=k/16;//按低位放在最前面的方法保存
for(j=0;j<7;j++)
{//7*4+4=32位
inmsg[i/4-2]=inmsg[i/4-2]*16+k%16;k=k/16;
}
inmsg[i/4-1]=k%16;k=k/16;
for(j=0;j<7;j++)
{//7*4+4=32位
inmsg[i/4-1]=inmsg[i/4-1]*16+k%16;k=k/16;
}
for(tempi=0;tempi<i/64;tempi++)
{//对每组进行四轮处理
loop(inmsg+tempi*16);
}
sprintf(res,"%4X",A);
sprintf(res+strlen(res),"%4X",B);
sprintf(res+strlen(res),"%4X",C);
sprintf(res+strlen(res),"%4X",D);
printf("结果:%s",res);
}
int main()
{
char key=0;
do
{
reset();//初始化数字
input_msg();
printf("\n要退出请按ESC,否则按任意键继续!");
key=getch();
}
while(key!=27);
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -