头文件md5.h
-
#ifndefMD5_H
-
#defineMD5_H
-
-
typedefstruct
-
{
-
unsignedintcount[2];
-
unsignedintstate[4];
-
unsignedcharbuffer[64];
-
}MD5_CTX;
-
-
-
#defineF(x,y,z)((x&y)|(~x&z))
-
#defineG(x,y,z)((x&z)|(y&~z))
-
#defineH(x,y,z)(x^y^z)
-
#defineI(x,y,z)(y^(x|~z))
-
#defineROTATE_LEFT(x,n)((x<<n)|(x>>(32-n)))
-
#defineFF(a,b,c,d,x,s,ac)\
-
{\
-
a+=F(b,c,d)+x+ac;\
-
a=ROTATE_LEFT(a,s);\
-
a+=b;\
-
}
-
#defineGG(a,b,c,d,x,s,ac)\
-
{\
-
a+=G(b,c,d)+x+ac;\
-
a=ROTATE_LEFT(a,s);\
-
a+=b;\
-
}
-
#defineHH(a,b,c,d,x,s,ac)\
-
{\
-
a+=H(b,c,d)+x+ac;\
-
a=ROTATE_LEFT(a,s);\
-
a+=b;\
-
}
-
#defineII(a,b,c,d,x,s,ac)\
-
{\
-
a+=I(b,c,d)+x+ac;\
-
a=ROTATE_LEFT(a,s);\
-
a+=b;\
-
}
-
voidMD5Init(MD5_CTX*context);
-
voidMD5Update(MD5_CTX*context,unsignedchar*input,unsignedintinputlen);
-
voidMD5Final(MD5_CTX*context,unsignedchardigest[16]);
-
voidMD5Transform(unsignedintstate[4],unsignedcharblock[64]);
-
voidMD5Encode(unsignedchar*output,unsignedint*input,unsignedintlen);
-
voidMD5Decode(unsignedint*output,unsignedchar*input,unsignedintlen);
-
-
#endif
C语言文件md5.c
-
#include<memory.h>
-
#include"md5.h"
-
-
unsignedcharPADDING[]={0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-
-
voidMD5Init(MD5_CTX*context)
-
{
-
context->count[0]=0;
-
context->count[1]=0;
-
context->state[0]=0x67452301;
-
context->state[1]=0xEFCDAB89;
-
context->state[2]=0x98BADCFE;
-
context->state[3]=0x10325476;
-
}
-
voidMD5Update(MD5_CTX*context,unsignedchar*input,unsignedintinputlen)
-
{
-
unsignedinti=0,index=0,partlen=0;
-
index=(context->count[0]>>3)&0x3F;
-
partlen=64-index;
-
context->count[0]+=inputlen<<3;
-
if(context->count[0]<(inputlen<<3))
-
context->count[1]++;
-
context->count[1]+=inputlen>>29;
-
-
if(inputlen>=partlen)
-
{
-
memcpy(&context->buffer[index],input,partlen);
-
MD5Transform(context->state,context->buffer);
-
for(i=partlen;i+64<=inputlen;i+=64)
-
MD5Transform(context->state,&input[i]);
-
index=0;
-
}
-
else
-
{
-
i=0;
-
}
-
memcpy(&context->buffer[index],&input[i],inputlen-i);
-
}
-
voidMD5Final(MD5_CTX*context,unsignedchardigest[16])
-
{
-
unsignedintindex=0,padlen=0;
-
unsignedcharbits[8];
-
index=(context->count[0]>>3)&0x3F;
-
padlen=(index<56)?(56-index):(120-index);
-
MD5Encode(bits,context->count,8);
-
MD5Update(context,PADDING,padlen);
-
MD5Update(context,bits,8);
-
MD5Encode(digest,context->state,16);
-
}
-
voidMD5Encode(unsignedchar*output,unsignedint*input,unsignedintlen)
-
{
-
unsignedinti=0,j=0;
-
while(j<len)
-
{
-
output[j]=input[i]&0xFF;
-
output[j+1]=(input[i]>>8)&0xFF;
-
output[j+2]=(input[i]>>16)&0xFF;
-
output[j+3]=(input[i]>>24)&0xFF;
-
i++;
-
j+=4;
-
}
-
}
-
voidMD5Decode(unsignedint*output,unsignedchar*input,unsignedintlen)
-
{
-
unsignedinti=0,j=0;
-
while(j<len)
-
{
-
output[i]=(input[j])|
-
(input[j+1]<<8)|
-
(input[j+2]<<16)|
-
(input[j+3]<<24);
-
i++;
-
j+=4;
-
}
-
}
-
voidMD5Transform(unsignedintstate[4],unsignedcharblock[64])
-
{
-
unsignedinta=state[0];
-
unsignedintb=state[1];
-
unsignedintc=state[2];
-
unsignedintd=state[3];
-
unsignedintx[64];
-
MD5Decode(x,block,64);
-
FF(a,b,c,d,x[0],7,0xd76aa478);
-
FF(d,a,b,c,x[1],12,0xe8c7b756);
-
FF(c,d,a,b,x[2],17,0x242070db);
-
FF(b,c,d,a,x[3],22,0xc1bdceee);
-
FF(a,b,c,d,x[4],7,0xf57c0faf);
-
FF(d,a,b,c,x[5],12,0x4787c62a);
-
FF(c,d,a,b,x[6],17,0xa8304613);
-
FF(b,c,d,a,x[7],22,0xfd469501);
-
FF(a,b,c,d,x[8],7,0x698098d8);
-
FF(d,a,b,c,x[9],12,0x8b44f7af);
-
FF(c,d,a,b,x[10],17,0xffff5bb1);
-
FF(b,c,d,a,x[11],22,0x895cd7be);
-
FF(a,b,c,d,x[12],7,0x6b901122);
-
FF(d,a,b,c,x[13],12,0xfd987193);
-
FF(c,d,a,b,x[14],17,0xa679438e);
-
FF(b,c,d,a,x[15],22,0x49b40821);
-
-
-
GG(a,b,c,d,x[1],5,0xf61e2562);
-
GG(d,a,b,c,x[6],9,0xc040b340);
-
GG(c,d,a,b,x[11],14,0x265e5a51);
-
GG(b,c,d,a,x[0],20,0xe9b6c7aa);
-
GG(a,b,c,d,x[5],5,0xd62f105d);
-
GG(d,a,b,c,x[10],9,0x2441453);
-
GG(c,d,a,b,x[15],14,0xd8a1e681);
-
GG(b,c,d,a,x[4],20,0xe7d3fbc8);
-
GG(a,b,c,d,x[9],5,0x21e1cde6);
-
GG(d,a,b,c,x[14],9,0xc33707d6);
-
GG(c,d,a,b,x[3],14,0xf4d50d87);
-
GG(b,c,d,a,x[8],20,0x455a14ed);
-
GG(a,b,c,d,x[13],5,0xa9e3e905);
-
GG(d,a,b,c,x[2],9,0xfcefa3f8);
-
GG(c,d,a,b,x[7],14,0x676f02d9);
-
GG(b,c,d,a,x[12],20,0x8d2a4c8a);
-
-
-
HH(a,b,c,d,x[5],4,0xfffa3942);
-
HH(d,a,b,c,x[8],11,0x8771f681);
-
HH(c,d,a,b,x[11],16,0x6d9d6122);
-
HH(b,c,d,a,x[14],23,0xfde5380c);
-
HH(a,b,c,d,x[1],4,0xa4beea44);
-
HH(d,a,b,c,x[4],11,0x4bdecfa9);
-
HH(c,d,a,b,x[7],16,0xf6bb4b60);
-
HH(b,c,d,a,x[10],23,0xbebfbc70);
-
HH(a,b,c,d,x[13],4,0x289b7ec6);
-
HH(d,a,b,c,x[0],11,0xeaa127fa);
-
HH(c,d,a,b,x[3],16,0xd4ef3085);
-
HH(b,c,d,a,x[6],23,0x4881d05);
-
HH(a,b,c,d,x[9],4,0xd9d4d039);
-
HH(d,a,b,c,x[12],11,0xe6db99e5);
-
HH(c,d,a,b,x[15],16,0x1fa27cf8);
-
HH(b,c,d,a,x[2],23,0xc4ac5665);
-
-
-
II(a,b,c,d,x[0],6,0xf4292244);
-
II(d,a,b,c,x[7],10,0x432aff97);
-
II(c,d,a,b,x[14],15,0xab9423a7);
-
II(b,c,d,a,x[5],21,0xfc93a039);
-
II(a,b,c,d,x[12],6,0x655b59c3);
-
II(d,a,b,c,x[3],10,0x8f0ccc92);
-
II(c,d,a,b,x[10],15,0xffeff47d);
-
II(b,c,d,a,x[1],21,0x85845dd1);
-
II(a,b,c,d,x[8],6,0x6fa87e4f);
-
II(d,a,b,c,x[15],10,0xfe2ce6e0);
-
II(c,d,a,b,x[6],15,0xa3014314);
-
II(b,c,d,a,x[13],21,0x4e0811a1);
-
II(a,b,c,d,x[4],6,0xf7537e82);
-
II(d,a,b,c,x[11],10,0xbd3af235);
-
II(c,d,a,b,x[2],15,0x2ad7d2bb);
-
II(b,c,d,a,x[9],21,0xeb86d391);
-
state[0]+=a;
-
state[1]+=b;
-
state[2]+=c;
-
state[3]+=d;
-
}
md5函数测试代码文件
-
#include<stdio.h>
-
#include<stdlib.h>
-
#include<string.h>
-
#include"md5.h"
-
-
intmain(intargc,char*argv[])
-
{
-
MD5_CTXmd5;
-
MD5Init(&md5);
-
inti;
-
unsignedcharencrypt[]="admin";
-
unsignedchardecrypt[16];
-
MD5Update(&md5,encrypt,strlen((char*)encrypt));
-
MD5Final(&md5,decrypt);
-
printf("加密前:%s\n加密后:",encrypt);
-
for(i=0;i<16;i++)
-
{
-
printf("%02x",decrypt[i]);
-
}
-
-
getchar();
-
-
return0;
-
}
MD5加密常用字符
7a57a5a743894a0eadmin(16位MD5小写加密)
972130B75066C825ADMIN(16位MD5大写加密)
21232f297a57a5a743894a0e4a801fc3admin(32位MD5小写加密)
73ACD9A5972130B75066C82595A1FAE3ADMIN(32位MD5大写加密)
49ba59abbe56e057123456(16位MD5小写加密)
e10adc3949ba59abbe56e057f20f883e123456(32位MD5小写加密)
469e80d32c0559f8admin888(16位MD5小写加密)
2299413865C28A35ADMIN888(16位MD5大写加密)
7fef6171469e80d32c0559f88b377245admin888(32位MD5小写加密)
A1F63A962299413865C28A3593D359B0ADMIN888(32位MD5大写加密)
PS.md5知识扫盲
MD5:是一个具体的算法,散列算法,哈西算法,但非加密算法(因为没有密钥),可用于加密(不可逆)
MD5是一种单向散列函数,单向散列函数的作用是将任何长度的一段数据散列成固定长度。常用于生成消息认证码等等,可以与非对称算法一起用于数字签名。
标准见http://www.ietf.org/rfc/rfc1321.txt
MD5好象被国内的一个教授破解了,顺便给大家一个地址http://www.cmd5.com/,有时候应该会很方便的.:)
分享到:
相关推荐
用C语言实现MD5哈希函数,它是将文件的每一行进行MD5加密,输出一个128位的哈希值。
md5加密算法 C语言(经过测试验证完整版) 经过调试验证,与工具结果一致 MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash...
linux c语言 实现的md5加密函数
C语言实现的md5算法,可以直接使用已经封装好的函数,传出的参数为16位的字符串数组
是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。 MD5算法具有以下特点: 1...
C语言实现MD5,经测试验证,散列过程完全正确,可供开发者使用!
linux下C语言实现MD5计算源码100行代码 int main() { char md5_str[40]={0}; get_md5("./main.c",md5_str); printf("=============>%s\n",md5_str); return 0; }
C语言版本Linux环境下MD5加密函数,需要在Linux换进下运行。经测试验证,完全正确,内附带使用说明,谢谢
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位... 本资源使用C语言实现MD5加密,可以实现数据的加密和文件的加密,不借助任何的第三方工具,便于移植。
MD5算法的实现,经过测试成立,使用C语言实现,编译通过。
用C语言实现MD4哈希函数,它是将文件的每一行进行加密,输出一个128位的哈希值
lwip协议栈源码提取 链接:https://pan.baidu.com/s/1Lcwap2cC0fNd7FhY44JhPQ 提取码:w74p
c语言实现,md5加密算法, 加密函数:void GetMd5FromString(const char *s,char *resStr)
c语言编写的MD5加密,封装好的函数库,可以作为库函数使用。
哈希函数md5 C语言实现。
通过C语言编程调用libtomcrypt函数库实现MD5加密
MD5的全称是Message-digest Algorithm 5(信息-摘要算法),用于确保信息传输... MD5用的是哈希函数,在计算机网络中应用较多的不可逆加密算法有RSA公司发明的MD5算法和由美国国家技术标准研究所建议的安全散列算法SHA.
FGL程序调用C语言编写的函数进行MD5加密数据
个人编的MD5加密程序,要想了解具体算法说明或者其他加密算法请关注我的博客----适合任何对算法理解不透彻的密码初学者和爱好者。
C语言函数调用栈实例分析.md