C语言实现 MD5算法

合集下载

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

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

C语言实现MD5加密,竟如此简单!本文详细讲解视频已经上传到B站:https:///video/BV1uy4y1p7on/公众号后台回复【md5】即可获得本文所有源码。

一、摘要算法摘要算法又称哈希算法。

它表示输入任意长度的数据,输出固定长度的数据,它的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密。

目前可以被解密逆向的只有CRC32算法,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。

消息摘要算法不存在密钥的管理与分发问题,适合于分布式网络上使用。

由于其加密计算的工作量相当巨大,所以以前的这种算法通常只用于数据量有限的情况下的加密。

消息摘要算法分为三类:•MD(Message Digest):消息摘要•SHA(Secure Hash Algorithm):安全散列•MAC(Message Authentication Code):消息认证码这三类算法的主要作用:验证数据的完整性二、MD5简介MD5即Message-Digest Algorithm 5(信息-摘要算法)。

属于摘要算法,是一个不可逆过程,就是无论多大数据,经过算法运算后都是生成固定长度的数据,结果使用16进制进行显示的128bit的二进制串。

通常表示为32个十六进制数连成的字符串。

MD5有什么用?用于确保信息传输完整一致。

是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。

更多用在文档校验上,用来生成密钥检测文档是否被篡改。

三、在线MD5加密有很多在线进行MD5加密的网站,如下:/code/c26.html举例: 给字符串 12334567 加密成。

如图结果为:32135A337F8DC8E2BB9A9B80D86BDFD0 四、C语言实现MD5算法源文件如下:md5.h#ifndef MD5_H#define MD5_Htypedef struct{unsigned int count[2];unsigned int state[4];unsigned char buffer[64];}MD5_CTX;#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 MD5Init(MD5_CTX *context);void MD5Update(MD5_CTX *context,unsigned char *input,u nsigned int inputlen);void MD5Final(MD5_CTX *context,unsigned char digest[16]);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 *inpu t,unsigned int len);#endifmd5.c#include <memory.h>#include 'md5.h'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,u nsigned 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 *inpu t,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); /* 1 */FF(d, a, b, c, x[ 1], 12, 0xe8c7b756); /* 2 */FF(c, d, a, b, x[ 2], 17, 0x242070db); /* 3 */FF(b, c, d, a, x[ 3], 22, 0xc1bdceee); /* 4 */FF(a, b, c, d, x[ 4], 7, 0xf57c0faf); /* 5 */FF(d, a, b, c, x[ 5], 12, 0x4787c62a); /* 6 */FF(c, d, a, b, x[ 6], 17, 0xa8304613); /* 7 */FF(b, c, d, a, x[ 7], 22, 0xfd469501); /* 8 */FF(a, b, c, d, x[ 8], 7, 0x698098d8); /* 9 */FF(d, a, b, c, x[ 9], 12, 0x8b44f7af); /* 10 */FF(c, d, a, b, x[10], 17, 0xffff5bb1); /* 11 */FF(b, c, d, a, x[11], 22, 0x895cd7be); /* 12 */FF(a, b, c, d, x[12], 7, 0x6b901122); /* 13 */FF(d, a, b, c, x[13], 12, 0xfd987193); /* 14 */FF(c, d, a, b, x[14], 17, 0xa679438e); /* 15 */FF(b, c, d, a, x[15], 22, 0x49b40821); /* 16 *//* Round 2 */GG(a, b, c, d, x[ 1], 5, 0xf61e2562); /* 17 */GG(d, a, b, c, x[ 6], 9, 0xc040b340); /* 18 */GG(c, d, a, b, x[11], 14, 0x265e5a51); /* 19 */ GG(b, c, d, a, x[ 0], 20, 0xe9b6c7aa); /* 20 */GG(a, b, c, d, x[ 5], 5, 0xd62f105d); /* 21 */ GG(d, a, b, c, x[10], 9, 0x2441453); /* 22 */ GG(c, d, a, b, x[15], 14, 0xd8a1e681); /* 23 */ GG(b, c, d, a, x[ 4], 20, 0xe7d3fbc8); /* 24 */ GG(a, b, c, d, x[ 9], 5, 0x21e1cde6); /* 25 */ GG(d, a, b, c, x[14], 9, 0xc33707d6); /* 26 */ GG(c, d, a, b, x[ 3], 14, 0xf4d50d87); /* 27 */ GG(b, c, d, a, x[ 8], 20, 0x455a14ed); /* 28 */ GG(a, b, c, d, x[13], 5, 0xa9e3e905); /* 29 */ GG(d, a, b, c, x[ 2], 9, 0xfcefa3f8); /* 30 */ GG(c, d, a, b, x[ 7], 14, 0x676f02d9); /* 31 */ GG(b, c, d, a, x[12], 20, 0x8d2a4c8a); /* 32 *//* Round 3 */HH(a, b, c, d, x[ 5], 4, 0xfffa3942); /* 33 */ HH(d, a, b, c, x[ 8], 11, 0x8771f681); /* 34 */ HH(c, d, a, b, x[11], 16, 0x6d9d6122); /* 35 */ HH(b, c, d, a, x[14], 23, 0xfde5380c); /* 36 */ HH(a, b, c, d, x[ 1], 4, 0xa4beea44); /* 37 */ HH(d, a, b, c, x[ 4], 11, 0x4bdecfa9); /* 38 */ HH(c, d, a, b, x[ 7], 16, 0xf6bb4b60); /* 39 */ HH(b, c, d, a, x[10], 23, 0xbebfbc70); /* 40 */ HH(a, b, c, d, x[13], 4, 0x289b7ec6); /* 41 */ HH(d, a, b, c, x[ 0], 11, 0xeaa127fa); /* 42 */ HH(c, d, a, b, x[ 3], 16, 0xd4ef3085); /* 43 */ HH(b, c, d, a, x[ 6], 23, 0x4881d05); /* 44 */ HH(a, b, c, d, x[ 9], 4, 0xd9d4d039); /* 45 */ HH(d, a, b, c, x[12], 11, 0xe6db99e5); /* 46 */ HH(c, d, a, b, x[15], 16, 0x1fa27cf8); /* 47 */ HH(b, c, d, a, x[ 2], 23, 0xc4ac5665); /* 48 *//* Round 4 */II(a, b, c, d, x[ 0], 6, 0xf4292244); /* 49 */II(d, a, b, c, x[ 7], 10, 0x432aff97); /* 50 */II(c, d, a, b, x[14], 15, 0xab9423a7); /* 51 */II(b, c, d, a, x[ 5], 21, 0xfc93a039); /* 52 */II(a, b, c, d, x[12], 6, 0x655b59c3); /* 53 */II(d, a, b, c, x[ 3], 10, 0x8f0ccc92); /* 54 */II(c, d, a, b, x[10], 15, 0xffeff47d); /* 55 */II(b, c, d, a, x[ 1], 21, 0x85845dd1); /* 56 */II(a, b, c, d, x[ 8], 6, 0x6fa87e4f); /* 57 */II(d, a, b, c, x[15], 10, 0xfe2ce6e0); /* 58 */II(c, d, a, b, x[ 6], 15, 0xa3014314); /* 59 */II(b, c, d, a, x[13], 21, 0x4e0811a1); /* 60 */II(a, b, c, d, x[ 4], 6, 0xf7537e82); /* 61 */II(d, a, b, c, x[11], 10, 0xbd3af235); /* 62 */II(c, d, a, b, x[ 2], 15, 0x2ad7d2bb); /* 63 */II(b, c, d, a, x[ 9], 21, 0xeb86d391); /* 64 */state[0] += a;state[1] += b;state[2] += c;state[3] += d;}五、MD5加密实例MD5加密步骤如下:1.定义MD5_CTX md5c;2.初始化/******************************************************** * 名称: MD5Init()* 功能: 初始化MD5结构体* 入口参数:context:要初始化的MD5结构体* 出口参数: 无*********************************************************/MD5Init(MD5_CTX *context);3.MD5值计算实现MD5值的计算及结构体的更新:/********************************************************** 名称: MD5Update()* 功能: 将要加密的信息传递给初始化过的MD5结构体,无返回值* 入口参数:context:初始化过了的MD5结构体input:需要加密的信息,可以任意长度inputLen:指定input的长度* 出口参数: 无*********************************************************/MD5Update(MD5_CTX *context,(unsigned char *)input,inpu tLen);4.输出转换/********************************************************** 名称: MD5Update()* 功能: 将加密结果存储到,无返回值* 入口参数:context:初始化过了的MD5结构体digest :加密过的结果* 出口参数: 无*********************************************************/MD5Final(MD5_CTX *context,unsigned char digest[16]);5.格式整理转换成32位的16进制字符串。

md5 算法分片计算 c语言

md5 算法分片计算 c语言

md5 算法分片计算 c语言MD5算法是一种广泛使用的哈希函数,它可以将任意长度的消息作为输入,产生一个128位(16字节)的哈希值作为输出。

在C 语言中,我们可以使用MD5算法对数据进行分片计算,以下是一个简单的示例:c.#include <stdio.h>。

#include <string.h>。

#include <openssl/md5.h>。

void calculate_md5(const char data, size_t data_len, unsigned char md5_sum) {。

MD5_CTX context;MD5_Init(&context);MD5_Update(&context, data, data_len);MD5_Final(md5_sum, &context);}。

int main() {。

const char data = "Hello, MD5!";unsigned char md5_sum[MD5_DIGEST_LENGTH];calculate_md5(data, strlen(data), md5_sum);printf("MD5 sum: ");for (int i = 0; i < MD5_DIGEST_LENGTH; i++) {。

printf("%02x", md5_sum[i]);}。

printf("\n");return 0;}。

在这个示例中,我们使用了OpenSSL库中提供的MD5函数来计算MD5哈希值。

首先,我们定义了一个`calculate_md5`函数,它接受输入数据、数据长度和一个指向存储MD5哈希值的缓冲区的指针。

然后,在`main`函数中,我们调用`calculate_md5`函数来计算给定数据的MD5哈希值,并打印输出结果。

32位md5加密原理

32位md5加密原理

32位md5加密原理MD5(Message Digest Algorithm 5)是一种常用的哈希函数,能够将任意长度的数据转换为128位的哈希值。

它广泛应用于各个领域,如密码学、数字签名以及数据完整性校验等。

本文将介绍32位MD5加密的原理及其过程。

一、MD5的基本原理MD5主要由四个步骤组成:填充、划分、压缩和输出。

首先,对待加密的信息进行填充,使其长度满足512位的倍数。

然后,将填充后的信息划分为若干个512位的分组。

接下来,通过四轮循环运算,对每个分组进行压缩操作。

最后,将压缩后的结果输出为128位的MD5值。

二、填充填充阶段是为了使待加密信息的长度满足512位的倍数。

假设待加密信息的长度为L,那么填充的步骤如下:1. 在信息的末尾添加一个"1",表示信息结束。

2. 在末尾添加若干个"0",直到信息长度满足(L+1+K)%512=448,其中K为满足(L+1+K)%512=448的最小非负整数。

3. 在末尾添加一个64位的二进制数,表示信息的原始长度L。

因为64位可以表示2^64个不同的长度,所以可以满足绝大部分情况下的长度需求。

三、划分填充后的信息将被划分为若干个512位的分组。

假设填充后的信息长度为N*512位,那么划分的步骤如下:1. 将填充后的信息划分为N个512位的分组,每个分组称为一个消息块。

2. 对每个消息块进行压缩操作。

四、压缩压缩操作是MD5算法的核心部分,主要通过四轮循环运算来混淆和加密数据。

每轮循环由16个操作组成,每个操作由逻辑函数、常量和位移量组成。

压缩的步骤如下:1. 初始化四个32位的缓冲区,分别为A、B、C、D。

2. 对每个消息块进行四轮循环运算,每轮循环由16个操作组成。

3. 每轮循环中,根据逻辑函数、常量和位移量对缓冲区进行更新。

4. 最后,将四个缓冲区的内容按顺序连接在一起,即得到128位的MD5值。

五、输出输出阶段将压缩后的结果输出为128位的MD5值。

c语言实现MD5文件校验

c语言实现MD5文件校验

#include <windows.h>#include <wincon.h>#include<conio.h>#include<stdio.h>#include<string.h>#include<stdlib.h>CONSOLE_SCREEN_BUFFER_INFO csbiInfo;extern WINBASEAPI HWND WINAPI GetConsoleWindow();#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 RL(x, y) (((x) << (y)) | ((x) >> (32 - (y)))) //x向左循环移y位#define PP(x) (x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24) //将x高低位互换,例如PP(aabbccdd)=ddccbbaa#define FF(a, b, c, d, x, s, ac) a = b + (RL((a + F(b,c,d) + x + ac),s))#define GG(a, b, c, d, x, s, ac) a = b + (RL((a + G(b,c,d) + x + ac),s))#define HH(a, b, c, d, x, s, ac) a = b + (RL((a + H(b,c,d) + x + ac),s))#define II(a, b, c, d, x, s, ac) a = b + (RL((a + I(b,c,d) + x + ac),s))unsigned A,B,C,D,a,b,c,d,i,len,flen[2],x[16]; //i临时变量,len文件长,flen[2]为位二进制表示的文件初始长度//x[16]int file_choose=0;//文件导入初始状态//全局变量char filename2[30]="MD5_result.txt";//默认文件位置void menu();void clear();void js();void md5();void save();char filename[100]; //文件名FILE *fp;int main(int argc, char* argv[]){int d1,d2,d,x, xy=0,i, k=0, s[100],ch,dir=40;struct re{int top;int left;int right;int bottom;}rt[7];RECT rect;HWND hwnd;//窗口句柄HDC hdc,dc;//画图设备HBRUSH hbr,hbr2;COORD pos3_1 = {1, 4},pos2_1 = {1, 4},pos2_2 = {1, 5},pos2_3 = {1, 6},pos2_4 = {1, 7};INPUT_RECORD mouseRec;DWORD state = 0, res=0;POINT pt;HPEN pn;HANDLE hOut, hIn;COLORREF yellow,red;yellow= RGB(0,0,255);red= RGB(0,255,0);hwnd=GetConsoleWindow();hdc = GetDC(hwnd);hbr= CreateSolidBrush(red);dc = GetDC(hwnd);SelectObject(dc,hbr);for(rt[1].left=150,i=2;i<=3;i++) rt[i].left=rt[i-1].left+110;for(rt[1].right=210,i=2;i<=3;i++) rt[i].right=rt[i-1].right+110;for(i=0;i<=3;i++) rt[i].top=40;for(i=0;i<=3;i++) rt[i].bottom=60;hOut = GetStdHandle(STD_OUTPUT_HANDLE);hIn=GetStdHandle(STD_INPUT_HANDLE);pn=CreatePen(PS_SOLID,1,RGB(0,255,0));GetClientRect(hwnd, &rt);SelectObject(hdc, pn);SetTextColor(hdc,RGB(255,255,0));SetBkMode(hdc,TRANSPARENT);MoveToEx(hdc,40,35,NULL);LineTo(hdc,540,35);hbr= CreateSolidBrush(yellow);SelectObject(dc,hbr);for(i=1;i<=6;i++)Rectangle(dc,rt[i].left,rt[i].top,rt[i].right,rt[i].bottom);SetTextColor(hdc,RGB(255,0,0));TextOut(hdc,250,10,TEXT("文件完整校验"),12);//输出文本GetClientRect(hwnd, &rt);SelectObject(hdc, pn);//选画笔SetTextColor(hdc,RGB(0,255,255));////设颜色TextOut(hdc,150,40,TEXT("导入文件"),8);//输出文本TextOut(hdc,260,40,TEXT("存储MD5 "),8);//输出文本TextOut(hdc,370,40,TEXT(" 退出"),8);//输出文本GetClientRect(hwnd, &rt);//得到控制台客户区的大小SelectObject(hdc, pn);//选画笔SetTextColor(hdc,RGB(0,255,0));////设颜色TextOut(hdc,460,370,TEXT("Copy Right:小帅哥"),17);//输出文本ShowWindow(hwnd,SW_SHOW);for(;;) // 循环{//读取输入的信息ReadConsoleInput(hIn, &mouseRec, 1, &res);Sleep(100);if (mouseRec.EventType == MOUSE_EVENT){if (mouseRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED){GetCursorPos(&pt);ScreenToClient(hwnd,&pt);if(pt.x>rt[1].left && pt.x<rt[1].right &&pt.y>rt[1].top && pt.y<rt[1].bottom){SetConsoleCursorPosition(hOut, pos3_1);clear();SetConsoleCursorPosition(hOut, pos3_1);if(k<15&&k>=9) k++;else k=9;SetConsoleTextAttribute(hOut, k);if(k%2==0)hbr= CreateSolidBrush(RGB(k*5,0,k*10));elsehbr= CreateSolidBrush(RGB(0,k*10,0));dc = GetDC(hwnd);//画刷SelectObject(dc,hbr);Rectangle(dc,0,60,650,350);js();printf("计算完成!");continue;}else if(pt.x>rt[2].left && pt.x<rt[2].right &&pt.y>rt[2].top && pt.y<rt[2].bottom){SetConsoleCursorPosition(hOut, pos3_1);clear();SetConsoleCursorPosition(hOut, pos3_1);if(k<15&&k>=9) k++;else k=9;SetConsoleTextAttribute(hOut, k);if(k%2==0)hbr= CreateSolidBrush(RGB(0,0,k*10));elsehbr= CreateSolidBrush(RGB(k*10,0,0));dc = GetDC(hwnd);//画刷SelectObject(dc,hbr);Rectangle(dc,0,60,650,350);save();printf("存储完成!");continue;}else if(pt.x>rt[3].left && pt.x<rt[3].right &&pt.y>rt[3].top && pt.y<rt[3].bottom){break;}};}}ReleaseDC(hwnd,hdc);return 0;}void clear(){int i;HANDLE hOut;COORD pos={1,4};SetConsoleCursorPosition(hOut, pos); // 设置光标位置for(i=0;i<=15;i++)printf( " \n"); }void js(){//while(1)//{printf("请键入文件位置:");fflush(stdin);gets(filename); //用get函数,避免scanf以空格分割数据,if (filename[0]==34)filename[strlen(filename)-1]=0,strcpy(filename,filename+1); //支持文件拖曳,但会多出双引号,这里是处理多余的双引号if (!strcmp(filename,"exit"))exit(0); //输入exit退出if (!(fp=fopen(filename,"rb"))){printf("Can not open this file!\n");// continue;} //以二进制打开文件fseek(fp, 0, SEEK_END); //文件指针转到文件末尾if((len=ftell(fp))==-1){printf("Sorry! Can not calculate files which larger than 2 GB!\n");fclose(fp);printf("please close the soft,then open it again!");// continue;} //ftell函数返回long,最大为GB,超出返回-1rewind(fp); //文件指针复位到文件头A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476; //初始化链接变量flen[1]=len/0x20000000; //flen单位是bitflen[0]=(len%0x20000000)*8;memset(x,0,64); //初始化x数组为:void *memset(void *s, char ch, unsigned n);将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,//块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作fread(&x,4,16,fp); //以字节为一组,读取组数据for(i=0;i<len/64;i++) //为什么要除以{ //循环运算直至文件结束md5();memset(x,0,64);fread(&x,4,16,fp);}((char*)x)[len%64]=128; //文件结束补,补操作,128二进制即if(len%64>55)md5(),memset(x,0,64);memcpy(x+14,flen,8); //文件末尾加入原文件的bit长度md5();fclose(fp);printf("MD5 Code:%08x%08x%08x%08x\n",PP(A),PP(B),PP(C),PP(D)); //高低位逆反输出// break;//}}void save(){FILE *fp2;fp2=fopen(filename2,"a");fprintf(fp2,"%s","文件路径");fprintf(fp2,"%s\n",filename);fprintf(fp2,"MD5 Code: %08x%08x%08x%08x\n",PP(A),PP(B),PP(C),PP(D));fprintf(fp2,"\n");fclose(fp2);}void md5(){ //MD5核心算法,供轮a=A,b=B,c=C,d=D;/**//* Round 1 */FF (a, b, c, d, x[ 0], 7, 0xd76aa478); /**//* 1 */FF (d, a, b, c, x[ 1], 12, 0xe8c7b756); /**//* 2 */FF (c, d, a, b, x[ 2], 17, 0x242070db); /**//* 3 */FF (b, c, d, a, x[ 3], 22, 0xc1bdceee); /**//* 4 */FF (a, b, c, d, x[ 4], 7, 0xf57c0faf); /**//* 5 */FF (d, a, b, c, x[ 5], 12, 0x4787c62a); /**//* 6 */ FF (c, d, a, b, x[ 6], 17, 0xa8304613); /**//* 7 */ FF (b, c, d, a, x[ 7], 22, 0xfd469501); /**//* 8 */ FF (a, b, c, d, x[ 8], 7, 0x698098d8); /**//* 9 */ FF (d, a, b, c, x[ 9], 12, 0x8b44f7af); /**//* 10 */ FF (c, d, a, b, x[10], 17, 0xffff5bb1); /**//* 11 */ FF (b, c, d, a, x[11], 22, 0x895cd7be); /**//* 12 */ FF (a, b, c, d, x[12], 7, 0x6b901122); /**//* 13 */ FF (d, a, b, c, x[13], 12, 0xfd987193); /**//* 14 */ FF (c, d, a, b, x[14], 17, 0xa679438e); /**//* 15 */ FF (b, c, d, a, x[15], 22, 0x49b40821); /**//* 16 *//**//* Round 2 */GG (a, b, c, d, x[ 1], 5, 0xf61e2562); /**//* 17 */ GG (d, a, b, c, x[ 6], 9, 0xc040b340); /**//* 18 */ GG (c, d, a, b, x[11], 14, 0x265e5a51); /**//* 19 */ GG (b, c, d, a, x[ 0], 20, 0xe9b6c7aa); /**//* 20 */ GG (a, b, c, d, x[ 5], 5, 0xd62f105d); /**//* 21 */ GG (d, a, b, c, x[10], 9, 0x02441453); /**//* 22 */ GG (c, d, a, b, x[15], 14, 0xd8a1e681); /**//* 23 */ GG (b, c, d, a, x[ 4], 20, 0xe7d3fbc8); /**//* 24 */ GG (a, b, c, d, x[ 9], 5, 0x21e1cde6); /**//* 25 */ GG (d, a, b, c, x[14], 9, 0xc33707d6); /**//* 26 */ GG (c, d, a, b, x[ 3], 14, 0xf4d50d87); /**//* 27 */ GG (b, c, d, a, x[ 8], 20, 0x455a14ed); /**//* 28 */ GG (a, b, c, d, x[13], 5, 0xa9e3e905); /**//* 29 */ GG (d, a, b, c, x[ 2], 9, 0xfcefa3f8); /**//* 30 */ GG (c, d, a, b, x[ 7], 14, 0x676f02d9); /**//* 31 */ GG (b, c, d, a, x[12], 20, 0x8d2a4c8a); /**//* 32 *//**//* Round 3 */HH (a, b, c, d, x[ 5], 4, 0xfffa3942); /**//* 33 */ HH (d, a, b, c, x[ 8], 11, 0x8771f681); /**//* 34 */ HH (c, d, a, b, x[11], 16, 0x6d9d6122); /**//* 35 */ HH (b, c, d, a, x[14], 23, 0xfde5380c); /**//* 36 */ HH (a, b, c, d, x[ 1], 4, 0xa4beea44); /**//* 37 */ HH (d, a, b, c, x[ 4], 11, 0x4bdecfa9); /**//* 38 */ HH (c, d, a, b, x[ 7], 16, 0xf6bb4b60); /**//* 39 */ HH (b, c, d, a, x[10], 23, 0xbebfbc70); /**//* 40 */ HH (a, b, c, d, x[13], 4, 0x289b7ec6); /**//* 41 */ HH (d, a, b, c, x[ 0], 11, 0xeaa127fa); /**//* 42 */ HH (c, d, a, b, x[ 3], 16, 0xd4ef3085); /**//* 43 */ HH (b, c, d, a, x[ 6], 23, 0x04881d05); /**//* 44 */HH (a, b, c, d, x[ 9], 4, 0xd9d4d039); /**//* 45 */ HH (d, a, b, c, x[12], 11, 0xe6db99e5); /**//* 46 */ HH (c, d, a, b, x[15], 16, 0x1fa27cf8); /**//* 47 */HH (b, c, d, a, x[ 2], 23, 0xc4ac5665); /**//* 48 *//**//* Round 4 */II (a, b, c, d, x[ 0], 6, 0xf4292244); /**//* 49 */II (d, a, b, c, x[ 7], 10, 0x432aff97); /**//* 50 */II (c, d, a, b, x[14], 15, 0xab9423a7); /**//* 51 */II (b, c, d, a, x[ 5], 21, 0xfc93a039); /**//* 52 */II (a, b, c, d, x[12], 6, 0x655b59c3); /**//* 53 */II (d, a, b, c, x[ 3], 10, 0x8f0ccc92); /**//* 54 */II (c, d, a, b, x[10], 15, 0xffeff47d); /**//* 55 */II (b, c, d, a, x[ 1], 21, 0x85845dd1); /**//* 56 */II (a, b, c, d, x[ 8], 6, 0x6fa87e4f); /**//* 57 */II (d, a, b, c, x[15], 10, 0xfe2ce6e0); /**//* 58 */II (c, d, a, b, x[ 6], 15, 0xa3014314); /**//* 59 */II (b, c, d, a, x[13], 21, 0x4e0811a1); /**//* 60 */II (a, b, c, d, x[ 4], 6, 0xf7537e82); /**//* 61 */II (d, a, b, c, x[11], 10, 0xbd3af235); /**//* 62 */II (c, d, a, b, x[ 2], 15, 0x2ad7d2bb); /**//* 63 */II (b, c, d, a, x[ 9], 21, 0xeb86d391); /**//* 64 */A += a;B += b;C += c;D += d;}。

MD5算法简介及编程实现

MD5算法简介及编程实现

实验三MD5算法实验目的:1.了解哈希函数的概念和功能,以及一些典型的哈希函数2.进一步理解MD5算法的概念及结构,掌握MD5算法对数据的处理过程3.通过编程模拟MD5算法的处理步骤实验内容:一.MD5算法概述MD5算法是一种消息摘要算法(Message Digest Algorithm),此算法以任意长度的信息(message)作为输入进行计算,产生一个128-bit(16-byte)的指纹或报文摘要(fingerprint or message digest)。

两个不同的message产生相同message digest的几率相当小,从一个给定的message digest逆向产生原始message更是困难,因此MD5算法适合用在数字签名应用中。

MD5实现简单,在32位的机器上运行速度也相当快,当然实际应用也不仅仅局限于数字签名。

MD5算法的处理步骤:第一步:增加填充增加padding使得数据长度(bit为单位)模512为448。

如果数据长度正好是模512为448,增加512个填充bit,也就是说填充的个数为1-512。

第一个bit为1,其余全部为0。

(即第一个字节为0x80)第二步:补足长度将数据长度转换为64bit的数值,如果长度超过64bit所能表示的数据长度的范围,值保留最后64bit,增加到前面填充的数据后面,使得最后的数据为512bit的整数倍。

也就是32bit的16倍的整数倍。

在RFC1321中,32bit称为一个word。

第三步:初始化变量:用到4个变量,分别为A、B、C、D,均为32bit长。

初始化为:A: 0x01234567B: 0x89abcdefC: 0xfedcba98D: 0x76543210第四步:数据处理首先定义4个辅助函数:F(X,Y,Z) = XY v not(X) ZG(X,Y,Z) = XZ v Y not(Z)H(X,Y,Z) = X xor Y xor ZI(X,Y,Z) = Y xor (X v not(Z))其中:XY表示按位与,X v Y表示按位或,not(X)表示按位取反。

C语言使用openSSL库AES模块实现加密功能详解

C语言使用openSSL库AES模块实现加密功能详解

C语⾔使⽤openSSL库AES模块实现加密功能详解本⽂实例讲述了C语⾔使⽤openSSL库AES模块实现加密功能。

分享给⼤家供⼤家参考,具体如下:概述在密码学⾥⾯⼀共有3中分类:1.对称加密/解密对称加密⽐较常见的有DES/AES。

加密⽅和解密⽅都持有相同的密钥。

对称的意思就是加密和解密都是⽤相同的密钥。

2.⾮对称加密/解密常见的加密算法DSA/RSA。

如果做过Google Pay的话,应该不会陌⽣。

⾮对称意味着加密和解密使⽤的密钥不是相同的。

这种应⽤的场合是需要保持发起⽅的权威性,⽐如Google中⼀次⽀付⾏为,只能Google通过私钥来加密产出来,但是⼤家都能通过公钥来认证这个是真的。

打个更加浅显的⽐⽅:私钥可以理解成美联储的印钞机,公钥可以理解成在民间⽆数的美元验钞机。

还有⼀个场合也是https使⽤证书⽅式登录的时候,也是使⽤的双向的⾮对称加密模式来做的。

3.离散这种只能被称为验签,⽽不是加密。

因为这类算法只能⼀个⽅向(将输⼊数据离散到某个特定的数字,反向解密是⽆法做到的。

)。

最常见的算法就是MD5。

在写php的时候⼤量的使⽤这种验签来做认证。

他可以将字符串离散成32byte的16进制的数字。

本次使⽤AES CBC⽅式来加密。

CBC模式加密是SSL的通讯标准,所以在做游戏的时候经常会使⽤到。

openSSL的基本⽤法可以参考这个两个细节这种加密的需要了解下⾯两个细节:1.加密的内存块⼀般按照16字节(这个也可以调整)对齐;当原始内存块没有对齐字节数的时候,需要填充;2.加密解密不会引发内存的膨胀或者缩⼩;最近在使⽤Python,Java,c#都去看过AES的接⼝,最轻松的是c#,java。

当使⽤C来写,才能明显感受到在这些操作过程中,有多少次内存的分配,多少的内存拼接。

啥事都有成本,封装良好的语⾔损失掉的效率可能来⾃于这些便利。

准备知识函数接⼝int AES_set_encrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key);int AES_set_decrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key);// 设置加密keyAES_KEY aes;AES_set_encrypt_key(key,128,&aes);// 这⾥填写的128是bit位,128bit=(128/8)bytes=16bytes,这个换算和32bit对应int为内存指针的原理⼀样。

详解C#实现MD5加密的示例代码

详解C#实现MD5加密的示例代码

详解C#实现MD5加密的⽰例代码C#实现MD5加密,具体如下:⽅法⼀⾸先,先简单介绍⼀下MD5MD5的全称是message-digest algorithm 5(信息-摘要算法,在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest开发出来,经md2、md3和md4发展⽽来。

MD5具有很好的安全性(因为它具有不可逆的特征,加过密的密⽂经过解密后和加密前的东东相同的可能性极⼩)引⽤using System.Security.Cryptography;using System.Text;具体代码如下(写在按钮的Click事件⾥):byte[] result = Encoding.Default.GetBytes(this.tbPass.Text.Trim()); //tbPass为输⼊密码的⽂本框MD5 md5 = new MD5CryptoServiceProvider();byte[] output = puteHash(result);this.tbMd5pass.Text = BitConverter.ToString(output).Replace("-",""); //tbMd5pass为输出加密⽂本的⽂本框⽅法⼆C# md5加密(上)string a; //加密前数据string b; //加密后数据b=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(a,"MD5")using System;using System.Security.Cryptography;⽅法2public static string GetMD5(string myString){MD5 md5 = new MD5CryptoServiceProvider();byte[] fromData = System.Text.Encoding.Unicode.GetBytes(myString);byte[] targetData = puteHash(fromData);string byte2String = null;for (int i=0; i<targetData.Length; i++){byte2String += targetData[i].ToString("x");}return byte2String;}using System.Security.Cryptography;/// <summary>/// 给⼀个字符串进⾏MD5加密/// </summary>/// <param name="strText">待加密字符串</param>/// <returns>加密后的字符串</returns>public static string MD5Encrypt(string strText){MD5 md5 = new MD5CryptoServiceProvider();byte[] result = puteHash(System.Text.Encoding.Default.GetBytes(strText));return System.Text.Encoding.Default.GetString(result);}C# MD5加密using System.Security.Cryptography;private void btnOK_Click(object sender, System.EventArgs e){string strConn = "server=192.168.0.51;database=chengheng;User id=sa; password=123";if(texName.Text.Trim()==""){this.RegisterStartupScript("sf","<script language='javascript'>alert('⽤户名不能为空');document.all('texName').focus()</script>"); return;}else if(texPassword.Text.Trim()==""){this.RegisterStartupScript("sfs","<script language='javascript'>alert('密码不能为空');document.all('texPassword').focus()</script>"); return;}else{//将获取的密码加密与数据库中加了密的密码相⽐较byte[] by = puteHash(utf.GetBytes(texPassword.Text.Trim()));string resultPass = System.Text.UTF8Encoding.Unicode.GetString(by);conn.ConnectionString=strConn;SqlCommand comm = new SqlCommand();string name = texName.Text.Trim().ToString();mandText="select Ruser_pwd,Ruser_nm from Ruser where Accountno = @name";comm.Parameters.Add("@name",SqlDbType.NVarChar,40);comm.Parameters["@name"].Value=name;try{conn.Open();comm.Connection=conn;SqlDataReader dr=comm.ExecuteReader();if(dr.Read()){//⽤户存在,对密码进⾏检查if(dr.GetValue(0).Equals(resultPass)){string user_name=dr.GetValue(1).ToString();string user_Accountno=texName.Text.Trim();Session["logon_name"]=user_name;Session["logon_Accountno"]=user_Accountno;//登录成功,进⾏页⾯导向}else{this.RegisterStartupScript("wp","<script language='javascript'>alert('密码错误,请检查。

MD5加密C语言实现

MD5加密C语言实现

MD5加密C语言实现MD5 (Message Digest Algorithm 5) 是一种常用的密码散列函数,用于将数据加密为128位长度的摘要。

在C语言中,可以通过一系列步骤来实现MD5加密算法。

1.准备工作:首先需要包含一些C标准头文件和预定义常量。

在C语言中,可以使用以下代码来实现:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdint.h>#define HASH_LENGTH 16```2.定义数据结构:MD5算法涉及到一个64字节的消息块和一个4字节的消息摘要块。

在C语言中,可以使用以下代码来定义这些结构:```ctypedef structuint8_t data[64];uint32_t datalen;uint32_t bitlen[2];uint32_t state[4];}MD5_CTX;typedef uint8_t (*hash_function)(uint8_t *);```3.定义常量和函数:MD5算法使用到一些常量和函数。

在C语言中,可以使用以下代码来定义这些常量和函数:```cconst uint32_t k[64] =// more constants ...};const uint32_t r[64] =7,12,17,22,7,12,17,22,// more constants ...};void md5_transform(MD5_CTX *ctx, uint8_t data[]);void md5_init(MD5_CTX *ctx)ctx->datalen = 0;ctx->bitlen[0] = 0;ctx->bitlen[1] = 0;ctx->state[1] = 0xEFCDAB89;ctx->state[2] = 0x98BADCFE;void md5_update(MD5_CTX *ctx, uint8_t data[], uint32_t len) for (uint32_t i = 0; i < len; i++)ctx->data[ctx->datalen] = data[i];ctx->datalen++;if (ctx->datalen == 64)md5_transform(ctx, ctx->data);ctx->bitlen[0] += 512;ctx->bitlen[1] += (ctx->bitlen[0] < 512);ctx->datalen = 0;}}void md5_final(MD5_CTX *ctx, uint8_t hash[])uint32_t i = ctx->datalen;if (ctx->datalen < 56)ctx->data[i++] = 0x80;while (i < 56)ctx->data[i++] = 0x00;}} elsectx->data[i++] = 0x80;while (i < 64)ctx->data[i++] = 0x00;}md5_transform(ctx, ctx->data);memset(ctx->data, 0, 56);}ctx->bitlen[0] += ctx->datalen * 8;ctx->bitlen[1] += (ctx->bitlen[0] < ctx->datalen * 8); ctx->data[63] = ctx->bitlen[0] & 0xff;ctx->data[62] = (ctx->bitlen[0] >> 8) & 0xff;ctx->data[61] = (ctx->bitlen[0] >> 16) & 0xff;ctx->data[60] = (ctx->bitlen[0] >> 24) & 0xff;ctx->data[59] = ctx->bitlen[1] & 0xff;ctx->data[58] = (ctx->bitlen[1] >> 8) & 0xff;ctx->data[57] = (ctx->bitlen[1] >> 16) & 0xff;ctx->data[56] = (ctx->bitlen[1] >> 24) & 0xff;md5_transform(ctx, ctx->data);for (i = 0; i < 4; i++)hash[i] = (ctx->state[0] >> (i * 8)) & 0xff;hash[i + 4] = (ctx->state[1] >> (i * 8)) & 0xff;hash[i + 8] = (ctx->state[2] >> (i * 8)) & 0xff;hash[i + 12] = (ctx->state[3] >> (i * 8)) & 0xff;}void md5_transform(MD5_CTX *ctx, uint8_t data[])uint32_t a, b, c, d, f, g, temp;uint32_t m[16], i, j;for (i = 0, j = 0; i < 16; i++, j += 4)m[i] = (data[j]) + (data[j + 1] << 8) + (data[j + 2] << 16) + (data[j + 3] << 24);}a = ctx->state[0];b = ctx->state[1];c = ctx->state[2];d = ctx->state[3];for (i = 0; i < 64; i++)if (i < 16)f=(b&c),((~b)&d);g=i;} else if (i < 32)f=(d&b),((~d)&c);g=(5*i+1)%16;} else if (i < 48)f=b^c^d;g=(3*i+5)%16;} elsef=c^(b,(~d));g=(7*i)%16;}temp = d;d=c;c=b;b = b + leftrotate((a + f + k[i] + m[g]), r[i]);a = temp;}ctx->state[0] += a;ctx->state[1] += b;ctx->state[2] += c;ctx->state[3] += d;```4.实现加密函数:最后,可以编写一个简单的调用MD5算法的加密函数。

C语言实现MD5算法

C语言实现MD5算法

C语言实现MD5算法MD5(Message-Digest Algorithm 5)是一种常用的哈希函数算法,广泛用于验证数据完整性、密码存储和数字证书等领域。

下面是使用C语言实现MD5算法的代码。

这段代码包含了MD5算法的各个步骤,包括初始化MD5结构体、填充数据、更新状态、计算摘要等。

```c#include <stdio.h>#include <stdint.h>#include <string.h>//定义MD5常量#define B 0xEFCDAB89#define C 0x98BADCFE//循环左移宏定义#define LEFT_ROTATE(x, n) (((x) << (n)) , ((x) >> (32-(n)))) //填充消息void padMessage(uint8_t *message, uint32_t length)//计算需要填充的字节数uint32_t padLength = (length % sizeof(uint32_t) == 56) ? 64 : 56;padLength = padLength - (length % sizeof(uint32_t));//填充1位1message[length++] = 0x80;//填充0位for (uint32_t i = 0; i < padLength; i++) message[length++] = 0x00;}//在消息末尾添加原始消息的长度(以位表示)for (uint32_t i = 0; i < sizeof(uint32_t); i++) message[length++] = (length << 3) >> (i * 8); }//初始化MD5结构体void initMD5(uint32_t *state)state[0] = A;state[1] = B;state[2] = C;state[3] = D;//更新状态void updateState(uint32_t *state, uint32_t *M)uint32_t A = state[0], B = state[1], C = state[2], D = state[3];//定义MD5循环运算函数#define MD5_FUNCTION(a, b, c, d, k, s, i) \a=b+LEFT_ROTATE((a+F(b,c,d)+M[k]+T[i]),s)//迭代压缩消息MD5_FUNCTION(A,B,C,D,0,7,1);MD5_FUNCTION(D,A,B,C,1,12,2);MD5_FUNCTION(C,D,A,B,2,17,3);MD5_FUNCTION(B,C,D,A,3,22,4);MD5_FUNCTION(A,B,C,D,4,7,5);MD5_FUNCTION(D,A,B,C,5,12,6);MD5_FUNCTION(C,D,A,B,6,17,7);MD5_FUNCTION(B,C,D,A,7,22,8);MD5_FUNCTION(A,B,C,D,8,7,9);MD5_FUNCTION(D,A,B,C,9,12,10);MD5_FUNCTION(C,D,A,B,10,17,11);MD5_FUNCTION(B,C,D,A,11,22,12);MD5_FUNCTION(A,B,C,D,12,7,13);MD5_FUNCTION(C,D,A,B,14,17,15); MD5_FUNCTION(B,C,D,A,15,22,16); MD5_FUNCTION(A,B,C,D,1,5,17); MD5_FUNCTION(D,A,B,C,6,9,18); MD5_FUNCTION(C,D,A,B,11,14,19); MD5_FUNCTION(B,C,D,A,0,20,20); MD5_FUNCTION(A,B,C,D,5,5,21); MD5_FUNCTION(D,A,B,C,10,9,22); MD5_FUNCTION(C,D,A,B,15,14,23); MD5_FUNCTION(B,C,D,A,4,20,24); MD5_FUNCTION(A,B,C,D,9,5,25); MD5_FUNCTION(D,A,B,C,14,9,26); MD5_FUNCTION(C,D,A,B,3,14,27); MD5_FUNCTION(B,C,D,A,8,20,28); MD5_FUNCTION(A,B,C,D,13,5,29); MD5_FUNCTION(D,A,B,C,2,9,30); MD5_FUNCTION(C,D,A,B,7,14,31); MD5_FUNCTION(B,C,D,A,12,20,32);MD5_FUNCTION(D,A,B,C,8,11,34); MD5_FUNCTION(C,D,A,B,11,16,35); MD5_FUNCTION(B,C,D,A,14,23,36); MD5_FUNCTION(A,B,C,D,1,4,37); MD5_FUNCTION(D,A,B,C,4,11,38); MD5_FUNCTION(C,D,A,B,7,16,39); MD5_FUNCTION(B,C,D,A,10,23,40); MD5_FUNCTION(A,B,C,D,13,4,41); MD5_FUNCTION(D,A,B,C,0,11,42); MD5_FUNCTION(C,D,A,B,3,16,43); MD5_FUNCTION(B,C,D,A,6,23,44); MD5_FUNCTION(A,B,C,D,9,4,45); MD5_FUNCTION(D,A,B,C,12,11,46); MD5_FUNCTION(C,D,A,B,15,16,47); MD5_FUNCTION(B,C,D,A,2,23,48); MD5_FUNCTION(A,B,C,D,0,6,49); MD5_FUNCTION(D,A,B,C,7,10,50); MD5_FUNCTION(C,D,A,B,14,15,51);MD5_FUNCTION(A,B,C,D,12,6,53); MD5_FUNCTION(D,A,B,C,3,10,54); MD5_FUNCTION(C,D,A,B,10,15,55); MD5_FUNCTION(B,C,D,A,1,21,56); MD5_FUNCTION(A,B,C,D,8,6,57); MD5_FUNCTION(D,A,B,C,15,10,58); MD5_FUNCTION(C,D,A,B,6,15,59); MD5_FUNCTION(B,C,D,A,13,21,60); MD5_FUNCTION(A,B,C,D,4,6,61); MD5_FUNCTION(D,A,B,C,11,10,62); MD5_FUNCTION(C,D,A,B,2,15,63); MD5_FUNCTION(B,C,D,A,9,21,64); #undef MD5_FUNCTION//更新状态state[0] += A;state[1] += B;state[2] += C;state[3] += D;//计算MD5摘要void md5(uint8_t *message, uint32_t length, uint32_t *digest) //初始化MD5结构体uint32_t state[4];initMD5(state);//填充消息padMessage(message, length);//计算消息分组数量uint32_t numOfBlocks = length / 64;//处理每个分组for (uint32_t i = 0; i < numOfBlocks; i++)uint32_t M[16];memcpy(M, message + (i * 64), 64);//更新状态updateState(state, M);}//获取MD5摘要memcpy(digest, state, 16);int mai//测试用例uint8_t message[] = "Hello, MD5!";uint32_t length = sizeof(message) - 1;//计算MD5摘要uint32_t digest[4];md5(message, length, digest);//输出摘要printf("MD5 Digest: ");for (int i = 0; i < 4; i++)printf("%02x", ((uint8_t*)digest)[i]);}printf("\n");return 0;```以上是使用C语言实现MD5算法的代码。

stm32 c语言 阿里云 哈希算法

stm32 c语言 阿里云 哈希算法

stm32 c语言阿里云哈希算法
在STM32中使用C语言实现阿里云的哈希算法,可以采用以下步骤:
1. 安装阿里云的SDK,在头文件中包含"HMAC_SHA1.h"和"HMAC_MD5.h"这两个文件。

2. 配置STM32的加密硬件模块,用于加密操作。

3. 定义密钥和明文,在程序中调用HMAC_MD5或者HMAC_SHA1函数进行哈希算法。

例如:
c
#include "HMAC_SHA1.h"
#include "HMAC_MD5.h"
unsigned char key[16] = "1234567890ABCDEF";
unsigned char text[16] = "hello world";
unsigned char result[SHA1_BLOCK_SIZE];
HMAC_SHA1(key, 16, text, 11, result);
4. 处理加密结果,在使用阿里云服务时,需要将加密结果转换成Base64格式,进行字符串拼接等操作。

可以使用Base64编解码函数进行处理。

例如:
c
#include "base64.h"
unsigned char output[SHA1_BLOCK_SIZE * 2];
Base64_Encode(result, SHA1_BLOCK_SIZE, output);
通过以上步骤,就可以在STM32中使用C语言实现阿里云的哈希算法了。

C#计算文件MD5校验C#计算文件MD5校验的方法(IT技术)

C#计算文件MD5校验C#计算文件MD5校验的方法(IT技术)

C#计算文件MD5校验C#计算文件MD5校验的方法(IT技
术)
想了解C#计算文件MD5校验的方法的相关内容吗,令狐不聪在本文为您仔细讲解C#计算文件MD5校验的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:C#,计算文件,MD5校验,下面大家一起来学习吧。

本文实例讲述了C#计算文件MD5校验的方法。

分享给大家供大家参考。

具体分析如下:
C#计算文件的MD5校验,从互联网上下载一个文件,可以使用下面的代码对文件进行MD5校验,看看生成的MD5编码是否和网站提供的一致,如果不一致则表示文件被修改过了,要慎重。

protected string GetMD5HashFromFile(string fileName)
{
FileStream file = new FileStream(fileName,FileMode.Open);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = puteHash(file);
file.Close();
ASCIIEncoding enc = new ASCIIEncoding();
return enc.GetString(retVal);
}
希望本文所述对大家的C#程序设计有所帮助。

C语言中的网络安全架构与防护设计

C语言中的网络安全架构与防护设计

C语言中的网络安全架构与防护设计随着互联网的迅猛发展,网络安全问题愈发突出。

而C语言作为一种广泛应用于网络编程的语言,其网络安全架构和防护设计显得尤为关键。

本文将探讨C语言中的网络安全架构以及相应的防护设计,旨在提供对网络安全问题的理解和解决方案。

一、网络安全架构网络安全架构是构建和保护网络安全的基本框架,C语言中的网络安全架构主要包括以下几个方面:1. 身份验证和授权身份验证是验证用户身份的过程,而授权则是根据用户身份进行访问控制。

在C语言中,常用的身份验证方式包括用户名和密码的验证、数字证书的验证等。

授权方面则可以使用访问控制列表(ACL)或基于角色的访问控制(RBAC)等方式来限制用户的权限。

2. 数据加密数据加密主要通过对数据进行加密和解密来保障数据在传输过程中的安全性。

在C语言中,可以使用诸如对称加密算法(如AES、DES)和非对称加密算法(如RSA)等进行数据加密。

同时,还可以使用消息摘要算法(如MD5、SHA-256)对数据的完整性进行验证。

3. 防火墙防火墙是网络安全的重要组成部分,主要用于监控和过滤网络流量。

在C语言中,可以使用网络套接字API来实现防火墙功能,例如通过设置iptables规则来控制入口和出口流量。

此外,还可以利用防火墙日志来分析和检测潜在的网络攻击。

4. 安全协议C语言提供了一系列的网络安全协议,例如传输层安全协议(TLS)、安全套接字层协议(SSL)等。

这些安全协议可以在应用层和传输层之间提供安全通信通道,保护数据的机密性和完整性。

二、防护设计在构建网络应用程序时,我们需要考虑网络安全威胁和攻击,合理设计防护措施以提高网络系统的安全性。

以下是几种常见的防护设计方法:1. 输入验证输入验证是保护网络应用程序免受恶意用户输入的一种重要手段。

在C语言中,可以使用正则表达式、输入过滤函数等技术来验证输入数据的合法性,并过滤掉潜在的恶意输入,从而防止SQL注入、跨站脚本攻击等常见漏洞。

c语言md5 base算法

c语言md5 base算法

c语言md5 base算法
C语言中可以使用MD5算法来进行消息摘要的计算。

MD5是一种广泛使用的哈希函数,可以将任意长度的消息转换为一个128位的哈希值。

在C语言中,可以使用现成的MD5库来实现MD5算法,也可以手动实现MD5算法。

一种常见的C语言MD5算法实现是使用开源的MD5库,比如OpenSSL库。

使用OpenSSL库可以很方便地计算MD5值,只需要包含相应的头文件,并连接相应的库即可。

通过调用库中的函数,可以对需要计算MD5值的数据进行处理,得到对应的MD5值。

另一种方式是手动实现MD5算法。

MD5算法的核心是对消息进行分块处理、填充、循环移位和模运算等操作,最终得到128位的哈希值。

手动实现MD5算法需要对这些操作进行逐步实现,包括消息预处理、填充、循环处理和结果输出等步骤。

这需要对MD5算法的细节有较深入的理解和编程能力。

无论是使用现成的MD5库还是手动实现MD5算法,都需要注意数据的输入输出格式、内存管理和错误处理等方面,以确保MD5算
法的正确性和安全性。

另外,在实际应用中,还需要考虑数据的保护、加盐等安全机制,以防止MD5值被破解或篡改。

c语言md5加密函数

c语言md5加密函数

c语言md5加密函数C语言MD5加密函数MD5(Message Digest Algorithm 5)是一种广泛使用的密码散列函数,常用于数据加密和数据完整性验证。

在C语言中,我们可以通过编写MD5加密函数来实现对数据的加密操作。

本文将介绍如何使用C语言编写一个简单的MD5加密函数,并详细解释其原理和步骤。

一、MD5加密原理MD5加密算法基于消息摘要算法,它将任意长度的消息作为输入,通过一系列复杂的数学运算,生成一个固定长度的密文。

MD5算法的核心思想是将输入的消息进行分块处理,并对每个分块进行位运算和逻辑运算,最终得到一个128位的摘要。

MD5算法具有以下特点:1. 不可逆性:无法从加密后的密文推导出原始消息。

2. 唯一性:不同的输入会产生不同的摘要。

3. 完整性:对于相同的输入,产生的摘要是稳定的。

二、MD5加密步骤MD5算法的加密过程包括以下几个步骤:1. 填充消息:将消息的位数填充为448的倍数,填充方式为在消息末尾添加一个1和若干个0。

2. 添加长度:将填充后的消息长度添加到消息末尾,以64位二进制数表示。

3. 初始化缓冲区:初始化四个32位的缓冲区A、B、C、D,用于存储最终的摘要。

4. 分块处理:将填充后的消息分为若干个512位的分组,对每个分组进行处理。

5. 迭代压缩:对每个分组进行64轮的迭代压缩操作,更新缓冲区的值。

6. 输出结果:最后将缓冲区的值按照小端序输出,得到128位的摘要。

三、C语言实现MD5加密函数以下是一个简单的C语言实现MD5加密函数的示例代码:#include <stdio.h>#include <string.h>#include <stdint.h>// 定义MD5加密函数void md5_encrypt(const uint8_t *message, uint32_t len, uint8_t *digest) {// 初始化缓冲区uint32_t A = 0x67452301;uint32_t B = 0xEFCDAB89;uint32_t C = 0x98BADCFE;uint32_t D = 0x10325476;// 填充消息// ...// 添加长度// ...// 分块处理// ...// 迭代压缩// ...// 输出结果// ...}int main() {// 测试示例uint8_t message[] = "Hello, MD5!";uint8_t digest[16] = {0};md5_encrypt(message, strlen(message), digest); // 输出结果for (int i = 0; i < 16; i++) {printf("%02x", digest[i]);}printf("\n");return 0;}四、总结通过上述的示例代码,我们可以看到使用C语言编写MD5加密函数并不复杂。

c语言md5加密函数

c语言md5加密函数

c语言md5加密函数【最新版】目录1.MD5 加密算法简介2.C 语言中的 MD5 加密函数3.MD5 加密函数的使用示例正文【1.MD5 加密算法简介】MD5 加密算法是一种广泛应用的哈希函数,它可以将任意长度的明文转换为固定长度的密文。

MD5 加密算法的主要特点是加密速度快、安全性高,适用于各种数据加密和完整性校验场景。

【2.C 语言中的 MD5 加密函数】在 C 语言中,我们可以使用第三方库如 crypto++或自行编写 MD5 加密函数。

这里以 crypto++库为例,介绍如何在 C 语言中使用 MD5 加密函数。

首先,需要安装 crypto++库。

在 Linux 系统下,可以使用以下命令进行安装:```bashsudo apt-get install libcrypto++-dev```然后,在 C 代码中引入 crypto++库:```cpp#include <iostream>#include <crypto++/md5.h>```接下来,可以编写一个 MD5 加密函数:```cppstd::string md5_encrypt(const std::string& input) {std::string output;CryptoPP::MD5 md5;md5.Update(input.c_str(), input.size());md5.Final(output.begin(), output.end());return output;}```【3.MD5 加密函数的使用示例】以下是一个使用上述 MD5 加密函数的简单示例:```cppint main() {std::string input = "Hello, world!";std::string encrypted = md5_encrypt(input);std::cout << "原始字符串:" << input << std::endl;std::cout << "加密后的字符串:" << encrypted << std::endl; return 0;}```运行上述代码,可以得到加密后的字符串。

C语言实现MD5算法

C语言实现MD5算法

C语言实现MD5算法1.理解MD5算法原理:-MD5算法是一种常用的哈希函数,用于将任意长度的消息转换为固定长度的哈希值,通常为128位。

-MD5算法主要包括四个循环运算和四个非线性函数,通过迭代运算将输入的消息分块处理并输出最终的哈希值。

2.定义MD5算法所需的常量和函数:-定义一个64个元素的常数列表,用于在算法运算中使用。

-定义四个非线性的F,G,H,I函数,用于在循环运算中使用。

3.定义MD5算法所需的全局变量:-定义一个128位的缓冲区保存最终输出的哈希值。

-定义一个64位的计数指示器,记录输入消息的长度。

-定义四个32位的寄存器变量A、B、C、D,用于循环运算过程中保存中间结果。

4.实现MD5算法的主要函数:- 实现Padding函数,将输入消息按照MD5算法的规则进行填充,使其长度满足对512位的整数倍。

-实现FF,GG,HH,II四个函数,用于在每个循环运算中进行非线性转换。

-实现MD5算法的核心循环函数,将输入消息分块处理,并对每个分块进行四轮循环运算,更新寄存器变量的值。

-实现MD5算法的输出函数,将最终运算得到的寄存器变量的值按照一定顺序连接起来,得到最终的128位哈希值。

5.实现MD5算法的入口函数:- 在main函数中,读取输入消息,并调用MD5算法的相关函数,得到最终的哈希值。

-打印输出哈希值。

以下为C语言实现MD5算法的伪代码:```c//定义MD5算法所需的常量和函数const uint32_t s[64] = { ... }; // 常数表const uint32_t k[64] = { ... }; // F,G,H,I函数对应的逻辑常数uint32_t F(uint32_t x, uint32_t y, uint32_t z) { ... } // F 函数uint32_t G(uint32_t x, uint32_t y, uint32_t z) { ... } // G 函数uint32_t H(uint32_t x, uint32_t y, uint32_t z) { ... } // H 函数uint32_t I(uint32_t x, uint32_t y, uint32_t z) { ... } // I 函数//定义MD5算法所需的全局变量uint32_t buffer[4]; // 128位缓冲区uint64_t count = 0; // 输入消息的长度uint32_t A, B, C, D; // 寄存器变量// 实现Padding函数void padding(char* message) { ... }//实现FF,GG,HH,II四个函数void FF(...) { ... }void GG(...) { ... }void HH(...) { ... }void II(...) { ... }//实现MD5算法的核心循环函数void MD5Block(uint32_t* block) { ... }//实现MD5算法的输出函数void MD5Output(uint32_t* digest) { ... }//实现MD5算法的入口函数int maichar message[MAX_LENGTH];uint32_t digest[4];//读取输入消息gets(message);//填充输入消息padding(message);//分块处理for (uint32_t i = 0; i < count; i += 64)MD5Block(&message[i]);}//输出最终结果MD5Output(digest);//打印哈希值printf("%08x%08x%08x%08x", digest[0], digest[1], digest[2], digest[3]);return 0;```以上是一个简单的伪代码,实现了C语言下的MD5算法。

C语言中的安全认证和访问控制保护敏感数据和资源

C语言中的安全认证和访问控制保护敏感数据和资源

C语言中的安全认证和访问控制保护敏感数据和资源C语言作为一种广泛应用于系统级编程和嵌入式设备开发的编程语言,其安全认证和访问控制在保护敏感数据和资源方面扮演着重要的角色。

本文将探讨C语言中的安全认证机制和访问控制技术,以及如何应用这些技术来保护敏感数据和资源。

1. 安全认证机制在C语言中,安全认证机制是通过用户身份验证来确保只有经过授权的用户才能访问受保护的数据和资源。

常见的安全认证机制包括密码认证、数字证书和双因素认证等。

1.1 密码认证密码认证是一种常见的安全认证机制,用户需要提供正确的用户名和密码才能访问系统。

C语言中可以使用密码哈希算法例如MD5或SHA-256对用户密码进行加密存储,从而确保密码的安全性。

此外,为增强密码的复杂度,可以要求用户设置包含字母、数字和特殊字符的强密码。

1.2 数字证书数字证书是一种使用非对称加密技术来验证用户身份的安全认证机制。

在C语言中,可以使用OpenSSL等库函数来生成和验证数字证书。

通过将用户的公钥和其他身份信息绑定在一起,并由可信的证书颁发机构签名,可以确保用户身份的真实性和完整性。

1.3 双因素认证双因素认证结合了两种或更多的身份验证因素,例如密码、指纹、手机验证码等。

在C语言中,可以利用硬件模块或库函数来实现双因素认证,以提高系统的安全性。

例如,使用密码和指纹扫描器作为两个认证因素,只有当两者均验证通过时才允许用户访问。

2. 访问控制技术除了安全认证机制外,C语言还提供了一些访问控制技术,用于管理对受保护数据和资源的访问权限。

常见的访问控制技术包括访问控制列表(ACL)、角色基于访问控制(RBAC)和属性基于访问控制(ABAC)等。

2.1 访问控制列表(ACL)访问控制列表是一种基于资源的访问控制方法,通过在每个资源上定义一个列表,指定可以访问该资源的用户和对应的访问权限。

在C 语言中,可以使用结构体来表示访问控制列表,然后在代码中进行适当的判断和控制,以保护敏感数据和资源。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

HH (b, c, d, a, x[ 2], 23, 0xc4ac5665); /**//* 48 */ /**//* Round 4 */ II (a, b, c, d, x[ 0], 6, 0xf4292244); /**//* 49 */ II (d, a, b, c, x[ 7], 10, 0x432aff97); /**//* 50 */ II (c, d, a, b, x[14], 15, 0xab9423a7); /**//* 51 */ II (b, c, d, a, x[ 5], 21, 0xfc93a039); /**//* 52 */ II (a, b, c, d, x[12], 6, 0x655b59c3); /**//* 53 */ II (d, a, b, c, x[ 3], 10, 0x8f0ccc92); /**//* 54 */ II (c, d, a, b, x[10], 15, 0xffeff47d); /**//* 55 */ II (b, c, d, a, x[ 1], 21, 0x85845dd1); /**//* 56 */ II (a, b, c, d, x[ 8], 6, 0x6fa87e4f); /**//* 57 */ II (d, a, b, c, x[15], 10, 0xfe2ce6e0); /**//* 58 */ II (c, d, a, b, x[ 6], 15, 0xa3014314); /**//* 59 */ II (b, c, d, a, x[13], 21, 0x4e0811a1); /**//* 60 */ II (a, b, c, d, x[ 4], 6, 0xf7537e82); /**//* 61 */ II (d, a, b, c, x[11], 10, 0xbd3af235); /**//* 62 */ II (c, d, a, b, x[ 2], 15, 0x2ad7d2bb); /**//* 63 */ II (b, c, d, a, x[ 9], 21, 0xeb86d391); /**//* 64 */ A += a; B += b; C += c; D += d; } main(){ while(1){ printf("Input file:"); gets(filename); //用get函数,避免scanf以空格分割数据, if (filename[0]==34) filename[strlen(filename)-1]=0,strcpy(filename,filename+1); //支持文件拖 曳,但会多出双引号,这里是处理多余的双引号 if (!strcmp(filename,"exit")) exit(0); //输入exit退出 if (!(fp=fopen(filename,"rb"))) {printf("Can not open this file!\n");continue;} //以二进制打开文件 fseek(fp, 0, SEEK_END); //文件指针转到文件末尾
FF (c, d, a, b, x[14], 17, 0xa679438e); /**//* 15 */ FF (b, c, d, a, x[15], 22, 0x49b40821); /**//* 16 */ /**//* Round 2 */ GG (a, b, c, d, x[ 1], 5, 0xf61e2562); /**//* 17 */ GG (d, a, b, c, x[ 6], 9, 0xc040b340); /**//* 18 */ GG (c, d, a, b, x[11], 14, 0x265e5a51); /**//* 19 */ GG (b, c, d, a, x[ 0], 20, 0xe9b6c7aa); /**//* 20 */ GG (a, b, c, d, x[ 5], 5, 0xd62f105d); /**//* 21 */ GG (d, a, b, c, x[10], 9, 0x02441453); /**//* 22 */ GG (c, d, a, b, x[15], 14, 0xd8a1e681); /**//* 23 */ GG (b, c, d, a, x[ 4], 20, 0xe7d3fbc8); /**//* 24 */ GG (a, b, c, d, x[ 9], 5, 0x21e1cde6); /**//* 25 */ GG (d, a, b, c, x[14], 9, 0xc33707d6); /**//* 26 */ GG (c, d, a, b, x[ 3], 14, 0xf4d50d87); /**//* 27 */ GG (b, c, d, a, x[ 8], 20, 0x455a14ed); /**//* 28 */ GG (a, b, c, d, x[13], 5, 0xa9e3e905); /**//* 29 */ GG (d, a, b, c, x[ 2], 9, 0xfcefa3f8); /**//* 30 */ GG (c, d, a, b, x[ 7], 14, 0x676f02d9); /**//* 31 */ GG (b, c, d, a, x[12], 20, 0x8d2a4c8a); /**//* 32 */ /**//* Round 3 */ HH (a, b, c, d, x[ 5], 4, 0xfffa3942); /**//* 33 */ HH (d, a, b, c, x[ 8], 11, 0x8771f681); /**//* 34 */ HH (c, d, a, b, x[11], 16, 0x6d9d6122); /**//* 35 */ HH (b, c, d, a, x[14], 23, 0xfde5380c); /**//* 36 */ HH (a, b, c, d, x[ 1], 4, 0xa4beea44); /**//* 37 */ HH (d, a, b, c, x[ 4], 11, 0x4bdecfa9); /**//* 38 */ HH (c, d, a, b, x[ 7], 16, 0xf6bb4b60); /**//* 39 */ HH (b, c, d, a, x[10], 23, 0xbebfbc70); /**//* 40 */ HH (a, b, c, d, x[13], 4, 0x289b7ec6); /**//* 41 */ HH (d, a, b, c, x[ 0], 11, 0xeaa127fa); /**//* 42 */ HH (c, d, a, b, x[ 3], 16, 0xd4ef3085); /**//* 43 */ HH (b, c, d, a, x[ 6], 23, 0x04881d05); /**//* 44 */ HH (a, b, c, d, x[ 9], 4, 0xd9d4d039); /**//* 45 */ HH (d, a, b, c, x[12], 11, 0xe6db99e5); /**//* 46 */ HH (c, d, a, b, x[15], 16, 0x1fa27cf8)fp))==-1) {printf("Sorry! Can not calculate files which larger than 2 GB!\n");fclose(fp);continue;} //ftell函数返回long,最大为2GB,超出 返回-1 rewind(fp); //文件指针复位到文件头 A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476; //初始化链 接变量 flen[1]=len/0x20000000; //flen单位是bit flen[0]=(len%0x20000000)*8; memset(x,0,64); //初始化x数组为0 fread(&x,4,16,fp); //以4字节为一组,读取16组数据 for(i=0;i<len/64;i++){ //循环运算直至文件结束 md5(); memset(x,0,64); fread(&x,4,16,fp); } ((char*)x)[len%64]=128; //文件结束补1,补0操作,128二进制即10000000 if(len%64>55) md5(),memset(x,0,64); memcpy(x+14,flen,8); //文件末尾加入原文件的bit长度 md5(); fclose(fp); printf("MD5 Code:%08x%08x%08x%08x\n",PP(A),PP(B),PP(C),PP(D)); //高低位逆反输出 } }
a=A,b=B,c=C,d=D; /**//* Round 1 */ FF (a, b, c, d, x[ 0], 7, 0xd76aa478); /**//* 1 */ FF (d, a, b, c, x[ 1], 12, 0xe8c7b756); /**//* 2 */ FF (c, d, a, b, x[ 2], 17, 0x242070db); /**//* 3 */ FF (b, c, d, a, x[ 3], 22, 0xc1bdceee); /**//* 4 */ FF (a, b, c, d, x[ 4], 7, 0xf57c0faf); /**//* 5 */ FF (d, a, b, c, x[ 5], 12, 0x4787c62a); /**//* 6 */ FF (c, d, a, b, x[ 6], 17, 0xa8304613); /**//* 7 */ FF (b, c, d, a, x[ 7], 22, 0xfd469501); /**//* 8 */ FF (a, b, c, d, x[ 8], 7, 0x698098d8); /**//* 9 */ FF (d, a, b, c, x[ 9], 12, 0x8b44f7af); /**//* 10 */ FF (c, d, a, b, x[10], 17, 0xffff5bb1); /**//* 11 */ FF (b, c, d, a, x[11], 22, 0x895cd7be); /**//* 12 */ FF (a, b, c, d, x[12], 7, 0x6b901122); /**//* 13 */ FF (d, a, b, c, x[13], 12, 0xfd987193); /**//* 14 */
相关文档
最新文档