c语言实现md5算法,C语言md5

c语言实现md5算法,C语言md5,C语言 MD5的源码实例详解

这篇文章主要介绍了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: