Md5加密实现 C语言

一个简单的MD5加密算法C语言示例程序 #include     #include   #include     #include     typedef   unsigned   char   *POINTER;   typedef   unsigned   short   int   UINT2;   typedef   unsigned   long   int   UINT4;   typedef 阅读详情

35.1 前言

MD5加密算法全称为信息摘要算法,主要用途于校验,检验内容是否发生变化。其特点如下:

(1)长度固定。不管加密的内容多长,最后得到的结果长度都是一样的16个字节128bit;

(2)不可逆性。即使知道密文及加密方式但是却无法反向计算,因为摘要是部分内容,一个MD5

反向对应多个原始数据;

(3)常用于字符串及文本的加密;

35.2 MD5加密实现

Md5.h:

#ifndef MD5_H
#define MD5_H

typedef struct
{
	unsigned int count[2];
	unsigned int state[4];
	unsigned char buffer[64];
}MD5_CTX;

void MD5Init(MD5_CTX *context);
void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen);
void MD5Final(MD5_CTX *context,unsigned char digest[16]);
int MD5EncryStr(unsigned char *output,unsigned char *input,unsigned int len);


#endif

 Md5.c:

#include <string.h>
#include "md5.h"

#define F(x,y,z) ((x & y) | (~x & z))
#define G(x,y,z) ((x & z) | (y & ~z))
#define H(x,y,z) (x^y^z)
#define I(x,y,z) (y ^ (x | ~z))
#define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n)))
#define FF(a,b,c,d,x,s,ac) \
	{ \
		a += F(b,c,d) + x + ac; \
		a = ROTATE_LEFT(a,s); \
		a += b; \
	}
#define GG(a,b,c,d,x,s,ac) \
	{ \
		a += G(b,c,d) + x + ac; \
		a = ROTATE_LEFT(a,s); \
		a += b; \
	}
#define HH(a,b,c,d,x,s,ac) \
	{ \
		a += H(b,c,d) + x + ac; \
		a = ROTATE_LEFT(a,s); \
		a += b; \
	}
#define II(a,b,c,d,x,s,ac) \
	{ \
		a += I(b,c,d) + x + ac; \
		a = ROTATE_LEFT(a,s); \
		a += b; \
	}

void MD5Transform(unsigned int state[4],unsigned char block[64]);
void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len);
void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len);

unsigned char PADDING[] = {
	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
};

void MD5Init(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;
}
void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen)
{
	unsigned int i = 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);
}

void MD5Final(MD5_CTX *context,unsigned char digest[16]) {
	unsigned int index = 0,padlen = 0;
	unsigned char bits[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);
}
void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len) {
	unsigned int i = 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;
	}
}
void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len) {
	unsigned int i = 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;
	}
}
void MD5Transform(unsigned int state[4],unsigned char block[64]) {
	unsigned int a = state[0];
	unsigned int b = state[1];
	unsigned int c = state[2];
	unsigned int d = state[3];
	unsigned int x[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;
}

int MD5EncryStr(unsigned int *output,unsigned char *input,unsigned int len)
{
	MD5_CTX md5;
	unsigned char md5EndStr[16]={0};

	if(NULL == output || input == NULL)
		return -1;

	MD5Init(&md5);
	MD5Update(&md5, input, len);
	MD5Final(&md5, md5EndStr);

	memcpy(output,md5EndStr,sizeof(md5EndStr));
	return 0;
}

main.c: 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include "md5.h"

int main()
{
	int i = 0;
	int nRet = -1;
	int nSize = 0;
	unsigned char MD5ID[16]={0};
	unsigned char *pData ="hello";

	nSize = strlen(pData);
	nRet = MD5EncryStr(MD5ID,pData,nSize);
	if(nRet<0){
		printf("[%s] MD5EncryStr failed,pData=%s,nSize=%d\n",__FUNCTION__,pData,nSize);
		return -1;
	}

	printf("[%s] MD5Encry MD5ID:\n",__FUNCTION__);
	for(i = 0;i<16;i++)
		printf("%x",MD5ID[i]);
	printf("\n");

	return 0;	
}

 结果!

 

md5加密C语言实现 md5加密,这里的程序只是简单实现了md5加密的效果,适用于字符串, md5加密的主要步骤为: 1.md5结构体定义,即md5头文件。 #ifndef MD5_FORENCRPTY_H #define MD5_FORENCRPTY_H /*this is only 32bit*/ typedef unsigned int md5_int; struct MD5_struct { md 阅读详情

相关推荐

C语言实现MD5加密,竟如此简单!

一、摘要算法摘要算法又称哈希算法。它表示输入任意长度的数据,输出固定长度的数据,它的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密。目前可以被解密逆向的只有CRC32算法,只有...

编程与实战的博客 5131

MD5加密算法

MD5在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个。MD5的典型应用是对一段信息串 (Message)产生所谓的指纹 (fingerprint),以防止被“篡改”。

gghhb12的博客 3111

MD5加密算法的C语言实现

MD5(Message Digest Algorithm 5)是一种常用的哈希函数算法,广泛应用于数据完整性校验、数字签名、密码学等领域。在本篇文章中,我们将使用C语言实现MD5加密算法,并提供相应的源代码。

DevGlider的博客 436

Spark-md5 详解

Spark-md5是一个十分优秀的MD5计算库,拥有高效、准确、方便的特点

人与人之间最小的差别是智商,最大的差别是坚持。 1万+

Linux环境下C语言实现MD5加密算法

MD5(Message-Digest Algorithm 5)是广泛用于数据完整性检查的一种散列函数,它能产生出一个128位(16字节)的散列值(hash value),通常用一个32位十六进制数表示。MD5设计的初衷是为了提供安全的数据完整性保护,在网络数据传输中广泛应用于验证数据是否在传输过程中被篡改。MD5算法的核心是一个“压缩函数”,它能够将512位的数据块转换成一个128位的输出。这个过程主要包括四个步骤:初始化、填充、分组处理、输出最终散列值。

weixin_32102617的博客 1033

md5加密算法 C语言(经过测试验证完整版)

md5加密算法 C语言(经过测试验证完整版) 经过调试验证,与工具结果一致 MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

MD5加密算法(c语言实现)

对课本和网上MD5加密算法模糊定义不清楚和不理解的请点进来~~~

haroroda的博客 4万+

Android 16(API 36)状态栏颜色适配全攻略:从沉浸式到自定义背景

本文全面解析Android 16(API 36)强制沉浸式状态栏带来的适配挑战,提供了从FrameLayout包裹法到动态修改Window背景色的核心解决方案。针对传统状态栏颜色设置失效问题,详细阐述了如何利用WindowInsets API实现自定义背景,并涵盖全屏模式、Fragment切换及第三方ROM兼容性等实战场景,为开发者提供一站式适配指南。

weixin_29227425的博客 594

c语言md5加密实现

md5.h #include #include /* POINTER defines a generic pointer type */ typedef unsigned char * POINTER; /* UINT2 defines a two byte word */ //typedef unsigned short int UINT2; /* UINT4 defines a f

ShadowAssassin的专栏 3826

HFSS螺旋线圈的设计与仿真

undefined.全局变量在这里进行设置:Project/Project Properties, browse and setup the global variables.undefined.方程中的局部变量设置:HFSS/Design Properties, browse and setup the local variables。按照下图填写曲线的方程内容:fill the parameters according to the setup in the following picture。

johnboat的专栏 3845

光学设计必知:Ansys Zemax中6种系统孔径类型的适用场景全解析

本文深入解析Ansys Zemax中6种系统孔径类型的适用场景,包括入瞳直径、像方空间F/#、物方空间NA等,帮助光学设计师精准控制光线选择和成像质量。通过实际案例和代码示例,详细讲解各孔径类型的计算原理、参数设置及在显微系统、激光扩束等场景中的优化策略,提升复杂光学系统设计效率。

weixin_29266007的博客 552

C语言实现MD5加密

  MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。   MD5算法可以对任意长度的输入串经过计算得到固定长度的输出,而且只有在明文相同的情况下,才能等到相同的密文,并且这个算法是不可逆的,即便得到了加密以后的密文,也不可能通过解密算法反算出明文。   MD5算法主要的应用场景有:  头文件 md5.h   源文件 md5.c   测试示例....

叶落花枯的博客 7215

全局–局部傅里叶神经算子(GL-FNO):原理、严格推导与 PINN 混合策略

本文提出了一种全局-局部傅里叶神经算子(GL-FNO)及其与物理信息神经网络(PINN)的结合方法。主要内容包括: 架构设计:GL-FNO包含两个分支 - 全局分支处理低频结构,使用下采样输入;局部分支处理高频细节,使用全分辨率输入。两分支通过自适应门控机制融合。 理论分析:证明了GL-FNO在"低频全局+高频局部"任务上的优势,给出了误差分解和复杂度分析,并推导了与PINN结合时的渐进一致性条件。 实现方法:采用频谱微分计算物理残差,推导了完整的训练流程,包括数据损失与物理损失的联合优

VectorShift的博客 1332

C语言/实现MD5加密

MD5算法也叫摘要认证

一口Linux的专栏 2153

药物吸收仿真软件:Caco-2_(9).Caco-2模型在药物开发中的案例分析

通过以上五个案例,我们可以看到Caco-2模型在药物开发中的重要作用。它不仅能够帮助我们预测药物的肠道吸收情况,还能够用于优化药物配方、评估代谢稳定性、研究药物相互作用以及转运蛋白的影响。这些体外实验和仿真分析的结果为药物的进一步临床研究提供了重要的参考依据,有助于缩短药物开发周期,提高研发效率。

kkchenjj的博客 863

GD32F4xx 移植agile_modbus软件包与电能表通信

GD32F4XX 移植agile modbus软件包实现与DTSU电能表通信调试记录

madao1234的博客 1305

MD5加密算法C语言实现

在网上找的C语言实现的MD5加密算法,有一些编译错误,所以就改了一下,全部代码还没搞懂,但是可能以后要用到,所以先把代码放在博客上,到用的使用可以方便些,代码主要包括两部分MD5.h和MD5.c,然后写了一个主函数来验证MD5算法。 /********************************************MD5.h****************************

凌风 1万+

android 如何分析应用的内存(十六)——使用AS查看Android堆

在前面,先介绍了如何使用jdb和VS code查看应用栈相关内容。本文将介绍,如何查看堆中的内容。

安仔的博客 4254

C语言实现哈希加密:MD5算法的代码解读

2. 初始化哈希值:初始化4个32位的变量A、B、C、D,分别为A = 0x67452301,B = 0xEFCDAB89,C = 0x98BADCFE,D = 0x10325476。2. MD5结构体定义:MD5_CTX结构体用于存储MD5运算过程中的中间状态,包括消息块缓冲区(buffer)、消息长度(length)以及当前的哈希值状态(state)。6. 核心变换函数:MD5_Transform函数实现了MD5算法的核心迭代运算,对每一块消息进行4轮运算,更新哈希值状态。// 初始化MD5上下文。

2501_91652765的博客 670

RandLA-Net Tensorrt 推理 c++

RandLA-Net 实现 Tensorrt 部署.

J。 1109

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

利用c语言编写加密程序,C语言MD5加密算法的简单调用实现

1.首先加上一些库:apt-getinstallopenssllibssl-devlibssl-doclibcurl4-openssl-dev2.实现一个用MD5加密密码的小程序:#include#include#include#include#includeintoutput(char *p,unsigned char* pwd, int len){int i;printf("%s"...

weixin_39852121的博客 640

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: 31 Linux input子系统按键驱动--4IO驱动16按键
下一篇: 为什么文件大小比fwrite()写入的数据大
Chasing_Chasing
博客等级 码龄10年 233粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值