这篇文章主要介绍了C语言讯息摘要5的源码实例详解的相关资料,需要的朋友可以参考下
C语言 MD5源码
md5c.h:
/*指针定义了一个泛型指针类型*/
typedef无符号字符*指针;
/* UINT2定义一个两字节的字*/
//typedef无符号短整型UINT2
/* UINT4定义了一个四字节的字*/
typedef无符号长整型UINT4
/* MD5上下文。*/
typedef结构{
UINT4状态[4];/*状态(ABCD) */
UINT4计数[2];/*位数,模2^64 (lsb优先)*/
无符号字符缓冲区[64];/*输入缓冲器*/
} MD5 _ CTX;
void MD5 init(MD5 _ CTX *上下文);
作废MD5更新(MD5 _ CTX *上下文,无符号字符*输入,无符号int输入len);
void MD5更新字符串(MD5 _ CTX *上下文,常量字符*字符串);
int MD5文件更新文件(MD5 _ CTX *上下文,字符*文件名);
void MD5Final(未签名的字符摘要[16],MD5 _ CTX *上下文);
void MDString (char *string,unsigned char digest[16]);
int MD5File (char *filename,unsigned char digest[16]);
md5c.c:
/* MD5C .C - RSA数据安全公司,MD5消息摘要算法
*/
/*版权所有1991-1992年,登记册系统管理人数据安全公司创建于1991年。全部
版权所有。
授予复制和使用本软件的许可,前提是它
被标识为“RSA数据安全公司的讯息摘要5消息摘要"
提及或参考本软件的所有材料中的"算法"
或者这个功能。
还授予制作和使用衍生作品的许可,前提是
此类作品被标识为"源自南非共和国(Republic of South Africa)数据"
所有材料中的"安全公司讯息摘要5消息摘要算法"
提及或引用衍生作品。
RSA数据安全公司。对此不做任何陈述
本软件的适销性或适用性
任何特定用途的软件。它"按原样"提供
没有任何明示或暗示的保证。
这些通知必须保留在本协议任何部分的任何副本中
文档和/或软件。
*/
#包含" md5c.h "
#包含字符串。h
#包含标准视频
/* MD5转换例程的常数。
*/
#定义S11 7
#定义S12 12
#定义S13 17
#定义S14 22
#定义S21 5
#定义S22 9
#定义S23 14
#定义S24 20
#定义S31 4
#定义S32 11
#定义S33 16
#定义S34 23
#定义S41 6
#定义S42 10
#定义S43 15
#定义S44 21
静态void MD5_memcpy(指针输出,指针输入,无符号int len);
静态void MD5Transform (UINT4 state[4],unsigned char block[64]);
静态空的编码(无符号char *输出,UINT4 *输入,无符号int len);
静态void MD5_memset(指针输出,int值,无符号int len);
静态空的解码(UINT4 *output,unsigned char *input,unsigned int len);
静态无符号字符填充[64]={
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
};
/* F,G,H和我是基本的讯息摘要5函数。
*/
#定义F(x,y,z) (((x) (y)) | ((~x) (z)))
#定义G(x,y,z) (((x) (z)) | ((y) (~z)))
#定义H(x,y,z) ((x) ^ (y) ^ (z))
#定义I(x,y,z) ((y) ^ ((x) | (~z)))
/*向左旋转向左旋转x n位。
*/
#define ROTATE_LEFT(x,n) (((x) (n)) | ((x) (32-(n))))
/*第1、2、3和四轮的FF、GG、HH和二变换。
旋转与加法是分开的,以防止重新计算。
*/
#定义FF(a,b,c,d,x,s,ac) { \
(a)=F ((b),(c),(d))(x)(uint 4)(AC);\
(a)=ROTATE_LEFT ((a),(s));\
(a)=(b);\
}
#定义GG(a,b,c,d,x,s,ac) { \
(a)=G ((b)、(c)、(d))(x)(uint 4)(AC);\
(a)=ROTATE_LEFT ((a),(s));\
(a)=(b);\
}
#定义HH(a,b,c,d,x,s,ac) { \
(a)=H ((b)、(c)、(d))(x)(uint 4)(AC);\
(a)=ROTATE_LEFT ((a),(s));\
(a)=(b);\
}
#定义II(a、b、c、d、x、s、ac) { \
(a)=I ((b)、(c)、(d))(x)(uint 4)(AC);\
(a)=ROTATE_LEFT ((a),(s));\
(a)=(b);\
}
/* MD5初始化。开始讯息摘要5操作,写入新的上下文。
*/
void MD5 init(MD5 _ CTX *上下文)/*上下文*/
{
上下文计数[0]=上下文计数[1]=0;
/*加载魔法初始化常量。
*/
上下文状态[0]=0x 67452301;
上下文状态[1]=0x EFC dab 89;
上下文状态[2]=0x 98错误的cfe
上下文状态[3]=0x 10325476;
}
/* MD5块更新操作。继续讯息摘要5消息摘要
操作,处理另一个消息块,并更新
语境。
*/
作废MD5更新(MD5 _ CTX *上下文,无符号字符*输入,无符号整数输入)
{
无符号int i,index,partLen
/*计算字节数64年款*/
index=(unsigned int)((context-count[0]3)0x3F);
/*更新位数*/
if((context-count[0]=((uint 4)input len 3))
((UINT4)inputLen 3))
上下文计数[1];
上下文计数[1]=((uint 4)输入长度29);
part len=64-index;
/*尽可能多次变换。
*/
if (inputLen=partLen) {
MD5_memcpy((指针)上下文缓冲区[索引],(指针)输入,partLen);
MD5变压器(上下文状态,上下文缓冲区);
for(I=部分leni63输入透镜;i=64)
MD5变压器(上下文状态,输入【我】);
索引=0;
}
其他
I=0;
/*缓冲剩余输入*/
MD5_memcpy((指针)上下文缓冲区[索引],(指针)输入[i],输入len-I);
}
/* MD5终结。结束讯息摘要5消息摘要操作,将
消息摘要和将上下文归零。
*/
void MD5Final(无符号字符摘要[16],MD5 _ CTX *上下文)
{
无符号字符位[8];
无符号(同Internationalorganizations)国际组织索引帕德伦
/*保存位数*/
编码(比特,上下文计数,8);
/*输出到56年款64年款.
*/
index=(unsigned int)((context-count[0]3)0x3f);
帕德伦=(指数56)?(56指数):(120指数);
MD5Update (context,PADDING,padLen);
/*追加长度(填充前)*/
MD5更新(上下文,位,8);
/*在摘要中存储状态*/
编码(摘要,上下文状态,16);
/*将敏感信息归零。
*/
MD5_memset((指针)上下文,0,sizeof(*上下文));
}
/* MD5基本转换。基于块转换状态。
*/
静态void MD5Transform (UINT4状态[4],无符号字符块[64])
{
UINT4 a=状态[0],b=状态[1],c=状态[2],d=状态[3],x[16];
解码(x,块,64);
/*第一轮*/
FF (a,b,c,d,x[ 0],S11,0x d 76 a 478);/* 1 */
FF (d,a,b,c,x[ 1],S12,0x E8 c7b 756);/* 2 */
FF (c,d,a,b,x[ 2],S13,0x 242070 db);/* 3 */
FF (b,c,d,a,x[ 3],S14,0x C1 BDC eee);/* 4 */
FF (a,b,c,d,x[ 4],S11,0x f 57c 0 faf);/* 5 */
FF (d,a,b,c,x[ 5],S12,0x 4787 c62a);/* 6 */
FF (c,d,a,b,x[ 6],S13,0xa 8304613);/* 7 */
FF (b,c,d,a,x[ 7],S14,0x FD 469501);/* 8 */
FF (a,b,c,d,x[ 8],S11,0x 698098 D8);/* 9 */
FF (d,a,b,c,x[ 9],S12,0 x8b 44 f 7 af);/* 10 */
FF (c,d,a,b,x[10],S13,0x ffff 5 bb 1);/* 11 */
FF (b,c,d,a,x[11],S14,0x 895 CD 7 be);/* 12 */
FF (a,b,c,d,x[12],S11,0x6b 901122);/* 13 */
FF (d,a,b,c,x[13],S12,0x FD 987193);/* 14 */
FF (c,d,a,b,x[14],S13,0xa 679438 e);/* 15 */
FF (b,c,d,a,x[15],S14,0x 49b 40821);/* 16 */
/*第二轮*/
GG (a,b,c,d,x[ 1],S21,0x f61e 2562);/* 17 */
GG (d,a,b,c,x[ 6],S22,0xc 040 b 340);/* 18 */
GG (c,d,a,b,x[11],S23,0x 265 e5a 51);/* 19 */
GG (b,c,d,a,x[ 0],S24,0x e 9 b 6 c 7 aa);/* 20 */
GG (a,b,c,d,x[ 5],S21,0x d62 f 105d);/* 21 */
GG (d,a,b,c,x[10],S22,0x 2441453);/* 22 */
GG (c,d,a,b,x[15],S23,0x D8 a1 e 681);/* 23 */
GG (b,c,d,a,x[ 4],S24,0x e 7 D3 FBC 8);/* 24 */
GG (a,b,c,d,x[ 9],S21,0x 21e 1c de 6);/* 25 */
GG (d,a,b,c,x[14],S22,0xc 33707d 6);/* 26 */
GG (c,d,a,b,x[ 3],S23,0x f 4d 50d 87);/* 27 */
GG (b,c,d,a,x[ 8],S24,0x 455 a 14 ed);/* 28 */
GG (a,b,c,d,x[13],S21,0x a9 E3 e 905);/* 29 */
GG (d,a,b,c,x[ 2],S22,0x FCE fa 3 f 8);/* 30 */
GG (c,d,a,b,x[ 7],S23,0x 676 f02d 9);/* 31 */
GG (b,c,d,a,x[12],S24,0x 8d 2 a4 c8 a);/* 32 */
/*第三轮*/
HH (a,b,c,d,x[ 5],S31,0x fffa 3942);/* 33 */
HH (d,a,b,c,x[ 8],S32,0x 8771 f 681);/* 34 */
HH (c,d,a,b,x[11],S33,0x6d 9d 6122);/* 35 */
HH (b,c,d,a,x[14],S34,0x FDE 5380 c);/* 36 */
HH (a,b,c,d,x[ 1],S31,0x a4 beea 44);/* 37 */
HH (d,a,b,c,x[ 4],S32,0x 4 bde CFA 9);/* 38 */
HH (c,d,a,b,x[ 7],S33,0 xf 6 bb 4b 60);/* 39 */
HH (b,c,d,a,x[10],S34,0x befbc 70);/* 40 */
HH (a,b,c,d,x[13],S31,0x 289 b 7 EC 6);/* 41 */
HH (d,a,b,c,x[ 0],S32,0x EAA 127 fa);/* 42 */
HH (c,d,a,b,x[ 3],S33,0x d4ef 3085);/* 43 */
HH (b,c,d,a,x[ 6],S34,0x 4881d 05);/* 44 */
HH (a,b,c,d,x[ 9],S31,0x d 9d 4d 039);/* 45 */
HH (d,a,b,c,x[12],S32,0x e 6 db 99 e 5);/* 46 */
HH (c,d,a,b,x[15],S33,0x 1fa 27 cf 8);/* 47 */
HH (b,c,d,a,x[ 2],S34,0x C4 AC 5665);/* 48 */
/*第四轮*/
II (a,b,c,d,x[ 0],S41,0xf 4292244);/* 49 */
II (d,a,b,c,x[ 7],S42,0x 432 aff 97);/* 50 */
II (c,d,a,b,x[14],S43,0x ab 9423 a 7);/* 51 */
II (b,c,d,a,x[ 5],S44,0x fc 93 a 039);/* 52 */
II (a,b,c,d,x[12],S41,0x 655 b 59 c 3);/* 53 */
II (d,a,b,c,x[ 3],S42,0x 8 f 0 CCC 92);/* 54 */
II (c,d,a,b,x[10],S43,0x ffeff 47d);/* 55 */
II (b,c,d,a,x[ 1],S44,0x 85845 DD 1);/* 56 */
II (a,b,c,d,x[ 8],S41,0x 6 fa 87 e 4 f);/* 57 */
II (d,a,b,c,x[15],S42,0 xfe 2 ce 6 e 0);/* 58 */
II (c,d,a,b,x[ 6],S43,0xa 3014314);/* 59 */
II (b,c,d,a,x[13],S44,0x4e 0811 a 1);/* 60 */
II (a,b,c,d,x[ 4],S41,0xf 7537 e82);/* 61 */
II (d,a,b,c,x[11],S42,0x BD 3 af 235);/* 62 */
II (c,d,a,b,x[ 2],S43,0x 2 ad 7d 2bb);/* 63 */
II (b,c,d,a,x[ 9],S44,0 xeb 86d 391);/* 64 */
状态[0]=a;
状态[1]=b;
状态[2]=c;
状态[3]=d;
/*将敏感信息归零。
*/
MD5_memset((指针)x,0,sizeof(x));
}
/*将输入(UINT4)编码为输出(无符号字符)。假设低输入联网(low-entry networking的缩写)是
四的倍数。
*/
静态空的编码(无符号字符*输出,UINT4 *输入,无符号int len)
{
无符号int i,j;
for (i=0,j=0;j lenI,j=4) {
输出[j]=(无符号字符)(输入[I]0x ff);
output[j 1]=(无符号字符)((input[I]8)0x ff);
output[j 2]=(无符号字符)((input[I]16)0x ff);
output[j 3]=(无符号字符)((input[I]24)0x ff);
}
}
/*将输入(无符号字符)解码为输出(UINT4).假设低输入联网(low-entry networking的缩写)是
四的倍数。
*/
静态空的解码(UINT4 *输出,无符号字符*输入,无符号int len)
{
无符号int i,j;
for (i=0,j=0;j lenI,j=4)
output[I]=((uint 4)input[j])|(((uint 4)input[j 1])8)|
(((uint 4)input[j 2])16)|(((uint 4)input[j 3])24);
}
/*注意:如果可能,用标准memcpy替换“for循环”.
*/
静态void MD5_memcpy(指针输出,指针输入,无符号整数长度)
{
无符号int I;
for(I=0;我低输入联网(low-entry networking的缩写)我)
输出[我]=输入[I];
}
/*注意:如果可能,用标准内存集替换“对于循环"。
*/
静态void MD5_memset(指针输出,int值,无符号int len)
{
无符号int I;
for(I=0;我低输入联网(low-entry networking的缩写)我)
((char *)output)[i]=(char)值;
}
/*消化一个字符串并打印结果。
*/
void MDString (char *string,无符号字符摘要[16])
{
MD5_CTX上下文;
unsigned int len=strlen(字符串);
MD5Init(上下文);
MD5Update (context,(unsigned char *)string,len);
MD5Final(摘要,上下文);
}
/*摘要文件并打印结果。
*/
int MD5File (char *filename,无符号字符摘要[16])
{
文件*文件;
MD5_CTX上下文;
int len
无符号字符缓冲区[1024];
if ((file=fopen (filename,' rb'))==NULL)
return-1;
否则{
MD5Init(上下文);
while (len=fread (buffer,1,1024,file))
MD5Update (context,buffer,len);
MD5Final(摘要,上下文);
fclose(文件);
}
返回0;
}
void MD5更新字符串(MD5 _ CTX *上下文,常量字符*字符串)
{
unsigned int len=strlen(字符串);
MD5Update (context,(unsigned char *)string,len);
}
int MD5文件更新文件(MD5 _ CTX *上下文,字符*文件名)
{
文件*文件;
int len
无符号字符缓冲区[1024];
if ((file=fopen (filename,' rb'))==NULL)
return-1;
否则{
while (len=fread (buffer,1,1024,file))
MD5Update (context,buffer,len);
fclose(文件);
}
返回0;
}
用法:
无效总管(无效)
{
无符号字符摘要[16];//存放结果
//第一种用法:
MD5 _ CTX md5c;
MD5 init(md5c);//初始化
MD5UpdaterString(md5c,’你要测试的字符串');
讯息摘要5文件更新文件(md5c,'你要测试的文件路径');
MD5Final(摘要,md5c);
//第二种用法:
MDString('你要测试的字符串,文摘);//直接输入字符串并得出结果
//第三种用法:
讯息摘要5文件('你要测试的文件路径,文摘);//直接输入文件路径并得出结果
}
相关文章:
C++ MD5源码:https://www.jb51.net/article/103113.htm
C语言 MD5源码:https://www.jb51.net/article/103108.htm
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。