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哈希值,并打印输出结果。
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算法实验目的: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)表示按位取反。
加密系列MD5加密和解密算法详解代码示例
加密系列MD5加密和解密算法详解代码示例MD5加密算法是一种广泛应用的密码加密算法,它将任意长度的数据映射为固定长度的128位哈希值。
MD5加密算法是不可逆的,即通过密文无法还原得到原始数据。
MD5加密算法的实现可以通过编写代码来完成。
下面是一个示例的MD5加密算法的代码:```import hashlibdef md5_encrypt(data):md5 = hashlib.md5md5.update(data.encode('utf-8'))return md5.hexdigestif __name__ == '__main__':data = input("请输入需要加密的数据:")encrypted_data = md5_encrypt(data)print("加密结果为:", encrypted_data)```以上代码实现了一个简单的MD5加密算法。
首先导入了`hashlib`模块,该模块提供了一系列用于数据加密的算法,包括MD5算法。
`md5_encrypt`函数接收一个字符串作为输入数据,并将其转换为字节流形式,然后使用`hashlib.md5`方法创建了一个MD5对象。
接着,通过调用MD5对象的`update`方法将输入数据添加到加密流程中。
最后,通过调用MD5对象的`hexdigest`方法获得加密后的结果,并将其返回。
在`if __name__ == '__main__'`下方的代码段中,首先获取用户输入的数据,然后调用`md5_encrypt`函数对其进行加密,并将结果打印到控制台。
下面是MD5解密算法的示例代码:```import hashlibdef md5_decrypt(encrypted_data):md5 = hashlib.md5md5.update(encrypted_data.encode('utf-8'))return md5.hexdigestif __name__ == '__main__':encrypted_data = input("请输入需要解密的数据:")decrypted_data = md5_decrypt(encrypted_data)print("解密结果为:", decrypted_data)```以上代码实现了一个简单的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 (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算法的加密函数。
MD5算法在MFC下实现
MD5算法在MFC下实现在MFC(Microsoft Foundation Classes)下实现MD5算法,可以按照以下步骤进行:1. 首先,需要引入头文件 "afx.h" 和 "wincrypt.h"。
afx.h 包含了 MFC 的核心功能,而 wincrypt.h 则包含了使用 Windows 加密 API 的相关定义和函数。
```cpp#include "afx.h"#include "wincrypt.h"```2. 为了使用 MD5 算法,我们需要定义一个函数 `CalculateMD5`,该函数接受一个字符串作为输入,并返回该字符串的 MD5 哈希值。
```cppCString CalculateMD5(const CString& input)//初始化MD5并获取上下文句柄HCRYPTPROV hProv = NULL;HCRYPTHASH hHash = NULL;if(!CryptAcquireContextW(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))//处理错误//...}if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) //处理错误CryptReleaseContext(hProv, 0);//...}//更新哈希值if(!CryptHashData(hHash, (BYTE*)(LPCTSTR)input, input.GetLength( * sizeof(TCHAR), 0))//处理错误CryptDestroyHash(hHash);CryptReleaseContext(hProv, 0);//...}//计算哈希值BYTE hash[16];DWORD cbHash = sizeof(hash);CString md5Hash;if(CryptGetHashParam(hHash, HP_HASHVAL, hash, &cbHash, 0)) //将二进制哈希值转换为字符串形式for(DWORD i = 0; i < cbHash; i++)CString byte;byte.Format(_T("%02x"), hash[i]);md5Hash += byte;}}//释放资源CryptDestroyHash(hHash);CryptReleaseContext(hProv, 0);return md5Hash;```3. 在需要使用 MD5 算法的位置,调用 `CalculateMD5` 函数即可计算字符串的 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算法的代码。
C语言计算MD5
C语⾔计算MD5 #include <stdio.h>#include <string.h>#include <stdint.h>#define u8 uint8_t#define u32 uint32_t#define u64 uint64_t#define MD5_DIGEST_SIZE 16#define MD5_HMAC_BLOCK_SIZE 64#define MD5_BLOCK_WORDS 16#define MD5_HASH_WORDS 4#define F1(x, y, z) (z ^ (x & (y ^ z)))#define F2(x, y, z) F1(z, x, y)#define F3(x, y, z) (x ^ y ^ z)#define F4(x, y, z) (y ^ (x | ~z))#define MD5STEP(f, w, x, y, z, in, s) (w += f(x, y, z) + in, w = (w<<s | w>>(32-s)) + x) struct md5_ctx {u32 hash[MD5_HASH_WORDS];u32 block[MD5_BLOCK_WORDS];u64 byte_count;};static void md5_transform(u32 *hash, u32 const *in) {u32 a, b, c, d;a = hash[0];b = hash[1];c = hash[2];d = hash[3];MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);hash[0] += a;hash[1] += b;hash[2] += c;hash[3] += d;}static void md5_transform_helper(struct md5_ctx *ctx) {md5_transform(ctx->hash, ctx->block);}static void md5_init(void *ctx) {struct md5_ctx *mctx = ctx;mctx->hash[0] = 0x67452301;mctx->hash[1] = 0xefcdab89;mctx->hash[2] = 0x98badcfe;mctx->hash[3] = 0x10325476;mctx->byte_count = 0;}static void md5_update(void *ctx, const u8 *data, unsigned int len) {struct md5_ctx *mctx = ctx;const u32 avail = sizeof(mctx->block) - (mctx->byte_count & 0x3f);mctx->byte_count += len;if (avail > len) {memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), data, len); return;}memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), data, avail); md5_transform_helper(mctx);data += avail;len -= avail;while (len >= sizeof(mctx->block)) {memcpy(mctx->block, data, sizeof(mctx->block));md5_transform_helper(mctx);data += sizeof(mctx->block);len -= sizeof(mctx->block);}memcpy(mctx->block, data, len);}static void md5_final(void *ctx, u8 *out) {struct md5_ctx *mctx = ctx;const unsigned int offset = mctx->byte_count & 0x3f;char *p = (char *)mctx->block + offset;int padding = 56 - (offset + 1);*p++ = 0x80;if (padding < 0) {memset(p, 0x00, padding + sizeof (u64));md5_transform_helper(mctx);p = (char *)mctx->block;padding = 56;}memset(p, 0, padding);mctx->block[14] = mctx->byte_count << 3;mctx->block[15] = mctx->byte_count >> 29;md5_transform(mctx->hash, mctx->block);memcpy(out, mctx->hash, sizeof(mctx->hash)); memset(mctx, 0, sizeof(*mctx));}int main(int argc, char *argv[]) {uint8_t buffer[32];uint8_t out[MD5_DIGEST_SIZE];strcpy(buffer, "hello");struct md5_ctx mctx;md5_init(&mctx);md5_update(&mctx, buffer, strlen("hello")); md5_final(&mctx, out);printf("hello md5 is:\n");for(int i = 0; i < MD5_DIGEST_SIZE; i++) {printf("%02X", out[i]);}printf("\n");return 0;}。
c 获取文件md5的3种方法
c 获取文件md5的3种方法获取文件的MD5值有多种方法,以下是其中三种常见的方法:1. 使用命令行工具:在命令行中可以使用专门的工具来计算文件的MD5值。
在Windows系统中,可以使用certutil命令,语法如下:certutil -hashfile 文件路径 MD5。
在Linux或者Mac系统中,可以使用md5sum命令,语法如下:md5sum 文件路径。
2. 使用编程语言的库:许多编程语言都提供了计算MD5值的库,比如在Python中,可以使用hashlib库来计算文件的MD5值。
示例代码如下:python.import hashlib.def get_file_md5(file_path):md5 = hashlib.md5()。
with open(file_path, 'rb') as f:for chunk in iter(lambda: f.read(4096), b''): md5.update(chunk)。
return md5.hexdigest()。
file_path = '文件路径'。
print(get_file_md5(file_path))。
3. 使用MD5计算工具:还有许多第三方的MD5计算工具可以帮助获取文件的MD5值,这些工具通常提供了图形化界面,用户可以通过简单的操作获取文件的MD5值。
常见的MD5计算工具有HashCalc、WinMD5等。
这些方法都可以帮助你获取文件的MD5值,选择适合自己的方法来进行操作即可。
希望这些信息对你有所帮助。
md5加密算法的C(C++)代码实现(完整)
正是因为这个原因,现在被黑客使用最多的一种破译密码的方法就是一种被称为"跑字典"的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用md5程序计算出这些字典项的md5值,然后再用目标的md5值在这个字典中检索。我们假设密码的最大长度为8位字节(8 bytes),同时密码只能是字母和数字,共26+26+10=62个字符,排列组合出的字典的项数则是p(62,1)+p(62,2)…。+p(62,8),那也已经是一个很天文的数字了,存储这个字典就需要tb级的磁盘阵列,而且这种方法还有一个前提,就是能获得目标账户的密码md5值的情况下才可以。这种加密技术被广泛的应用于unix系统中,这也是为什么unix系统比一般操作系统更为坚固一个重要原因。
<< 这四轮(64步)是:
第一轮
ff(a,b,c,d,m0,7,0xd76aa478)
ff(d,a,b,c,m1,12,0xe8c7b756)
ff(c,d,a,b,m2,17,0x242070db)
ff(b,c,d,a,m3,22,0xc1bdceee)
将上面四个链接变量复制到另外四个变量中:a到a,b到b,c到c,d到d.
主循环有四轮(md4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。
rivest在1989年开发出md2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾。并且根据这个新产生的信息计算出散列值。后来,rogier和chauvaud发现如果忽略了检验和将产生md2冲突。md2算法的加密后结果是唯一的——既没有重复。
MD5代码实现文档
MD5.h文件#ifndef __MD5_H__#define __MD5_H__#ifdef __cplusplusextern "C" {#endif/* typedef a 32 bit type */typedef unsigned long int UINT32;/* Data structure for MD5 (Message Digest) computation */typedefstruct{UINT32 i[2]; /* number of _bits_ handled mod 2^64 */UINT32 buf[4]; /* scratch buffer */ unsigned char in[64]; /* input buffer */unsigned char digest[16]; /* actual digest after MD5Final call */} MD5_CTX;void MD5Init (MD5_CTX *mdContext);void MD5Update (MD5_CTX *mdContext, const unsigned char *inBuf, unsigned intinLen); void MD5Final (MD5_CTX *mdContext);#ifdef __cplusplus}#endif#endifMD5.C文件#include "md5.h"/* forward declaration */static void Transform (UINT32 *buf, UINT32 *in);static unsigned char PADDING[64] ={0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};/* F, G and H are basic MD5 functions: selection, majority, parity */ #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)))/* ROTATE_LEFT rotates x left n bits */#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4 *//* Rotation is separate from addition to prevent recomputation */ #define FF(a, b, c, d, x, s, ac) \{(a) += F ((b), (c), (d)) + (x) + (UINT32)(ac); \(a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}#define GG(a, b, c, d, x, s, ac) \{(a) += G ((b), (c), (d)) + (x) + (UINT32)(ac); \(a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}#define HH(a, b, c, d, x, s, ac) \{(a) += H ((b), (c), (d)) + (x) + (UINT32)(ac); \(a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}#define II(a, b, c, d, x, s, ac) \{(a) += I ((b), (c), (d)) + (x) + (UINT32)(ac); \(a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}void MD5Init (MD5_CTX *mdContext){mdContext->i[0] = mdContext->i[1] = (UINT32)0;/* Load magic initialization constants.*/mdContext->buf[0] = (UINT32)0x67452301u;mdContext->buf[1] = (UINT32)0xefcdab89u;mdContext->buf[2] = (UINT32)0x98badcfeu;mdContext->buf[3] = (UINT32)0x10325476u;}void MD5Update (MD5_CTX *mdContext, const unsigned char *inBuf, unsigned intinLen) {UINT32 in[16];int mdi;unsignedinti, ii;/* compute number of bytes mod 64 */mdi = (int)((mdContext->i[0] >> 3) & 0x3F);/* update number of bits */if ((mdContext->i[0] + ((UINT32)inLen<< 3)) <mdContext->i[0])mdContext->i[1]++;mdContext->i[0] += ((UINT32)inLen<< 3);mdContext->i[1] += ((UINT32)inLen>> 29);while (inLen--){/* add new character to buffer, increment mdi */mdContext->in[mdi++] = *inBuf++;/* transform if necessary */if (mdi == 0x40){for (i = 0, ii = 0; i< 16; i++, ii += 4)in[i] = (((UINT32)mdContext->in[ii+3]) << 24) |(((UINT32)mdContext->in[ii+2]) << 16) |(((UINT32)mdContext->in[ii+1]) << 8) |((UINT32)mdContext->in[ii]);Transform (mdContext->buf, in);mdi = 0;}}}void MD5Final (MD5_CTX *mdContext){UINT32 in[16];int mdi;unsignedinti, ii;unsignedintpadLen;/* save number of bits */in[14] = mdContext->i[0];in[15] = mdContext->i[1];/* compute number of bytes mod 64 */mdi = (int)((mdContext->i[0] >> 3) & 0x3F);/* pad out to 56 mod 64 */padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi);MD5Update (mdContext, PADDING, padLen);/* append length in bits and transform */for (i = 0, ii = 0; i< 14; i++, ii += 4)in[i] = (((UINT32)mdContext->in[ii+3]) << 24) |(((UINT32)mdContext->in[ii+2]) << 16) |(((UINT32)mdContext->in[ii+1]) << 8) |((UINT32)mdContext->in[ii]);Transform (mdContext->buf, in);/* store buffer in digest */for (i = 0, ii = 0; i< 4; i++, ii += 4){mdContext->digest[ii] = (unsigned char)(mdContext->buf[i] & 0xFF); mdContext->digest[ii+1] =(unsigned char)((mdContext->buf[i] >> 8) & 0xFF);mdContext->digest[ii+2] =(unsigned char)((mdContext->buf[i] >> 16) & 0xFF); mdContext->digest[ii+3] =(unsigned char)((mdContext->buf[i] >> 24) & 0xFF);}}/* Basic MD5 step. Transform buf based on in.*/void Transform (UINT32 *buf, UINT32 *in){UINT32 a = buf[0], b = buf[1], c = buf[2], d = buf[3];/* Round 1 */#define S11 7#define S12 12#define S13 17#define S14 22FF ( a, b, c, d, in[ 0], S11, 3614090360u); /* 1 */FF ( d, a, b, c, in[ 1], S12, 3905402710u); /* 2 */FF ( c, d, a, b, in[ 2], S13, 606105819u); /* 3 */FF ( b, c, d, a, in[ 3], S14, 3250441966u); /* 4 */FF ( a, b, c, d, in[ 4], S11, 4118548399u); /* 5 */FF ( d, a, b, c, in[ 5], S12, 1200080426u); /* 6 */FF ( c, d, a, b, in[ 6], S13, 2821735955u); /* 7 */FF ( b, c, d, a, in[ 7], S14, 4249261313u); /* 8 */FF ( a, b, c, d, in[ 8], S11, 1770035416u); /* 9 */FF ( d, a, b, c, in[ 9], S12, 2336552879u); /* 10 */FF ( c, d, a, b, in[10], S13, 4294925233u); /* 11 */FF ( b, c, d, a, in[11], S14, 2304563134u); /* 12 */FF ( a, b, c, d, in[12], S11, 1804603682u); /* 13 */FF ( d, a, b, c, in[13], S12, 4254626195u); /* 14 */FF ( c, d, a, b, in[14], S13, 2792965006u); /* 15 */FF ( b, c, d, a, in[15], S14, 1236535329u); /* 16 *//* Round 2 */#define S21 5#define S22 9#define S23 14#define S24 20GG ( a, b, c, d, in[ 1], S21, 4129170786u); /* 17 */GG ( d, a, b, c, in[ 6], S22, 3225465664u); /* 18 */GG ( c, d, a, b, in[11], S23, 643717713u); /* 19 */GG ( b, c, d, a, in[ 0], S24, 3921069994u); /* 20 */GG ( d, a, b, c, in[10], S22, 38016083u); /* 22 */ GG ( c, d, a, b, in[15], S23, 3634488961u); /* 23 */ GG ( b, c, d, a, in[ 4], S24, 3889429448u); /* 24 */GG ( a, b, c, d, in[ 9], S21, 568446438u); /* 25 */ GG ( d, a, b, c, in[14], S22, 3275163606u); /* 26 */ GG ( c, d, a, b, in[ 3], S23, 4107603335u); /* 27 */GG ( b, c, d, a, in[ 8], S24, 1163531501u); /* 28 */GG ( a, b, c, d, in[13], S21, 2850285829u); /* 29 */ GG ( d, a, b, c, in[ 2], S22, 4243563512u); /* 30 */GG ( c, d, a, b, in[ 7], S23, 1735328473u); /* 31 */GG ( b, c, d, a, in[12], S24, 2368359562u); /* 32 *//* Round 3 */#define S31 4#define S32 11#define S33 16#define S34 23HH ( a, b, c, d, in[ 5], S31, 4294588738u); /* 33 */HH ( d, a, b, c, in[ 8], S32, 2272392833u); /* 34 */HH ( c, d, a, b, in[11], S33, 1839030562u); /* 35 */HH ( b, c, d, a, in[14], S34, 4259657740u); /* 36 */HH ( a, b, c, d, in[ 1], S31, 2763975236u); /* 37 */HH ( d, a, b, c, in[ 4], S32, 1272893353u); /* 38 */HH ( c, d, a, b, in[ 7], S33, 4139469664u); /* 39 */HH ( b, c, d, a, in[10], S34, 3200236656u); /* 40 */HH ( a, b, c, d, in[13], S31, 681279174u); /* 41 */ HH ( d, a, b, c, in[ 0], S32, 3936430074u); /* 42 */HH ( c, d, a, b, in[ 3], S33, 3572445317u); /* 43 */HH ( b, c, d, a, in[ 6], S34, 76029189u); /* 44 */HH ( a, b, c, d, in[ 9], S31, 3654602809u); /* 45 */HH ( d, a, b, c, in[12], S32, 3873151461u); /* 46 */HH ( c, d, a, b, in[15], S33, 530742520u); /* 47 */ HH ( b, c, d, a, in[ 2], S34, 3299628645u); /* 48 *//* Round 4 */#define S41 6#define S42 10#define S43 15#define S44 21II ( a, b, c, d, in[ 0], S41, 4096336452u); /* 49 */II ( d, a, b, c, in[ 7], S42, 1126891415u); /* 50 */II ( c, d, a, b, in[14], S43, 2878612391u); /* 51 */II ( b, c, d, a, in[ 5], S44, 4237533241u); /* 52 */II ( d, a, b, c, in[ 3], S42, 2399980690u); /* 54 */II ( c, d, a, b, in[10], S43, 4293915773u); /* 55 */ II ( b, c, d, a, in[ 1], S44, 2240044497u); /* 56 */II ( a, b, c, d, in[ 8], S41, 1873313359u); /* 57 */II ( d, a, b, c, in[15], S42, 4264355552u); /* 58 */ II ( c, d, a, b, in[ 6], S43, 2734768916u); /* 59 */II ( b, c, d, a, in[13], S44, 1309151649u); /* 60 */ II ( a, b, c, d, in[ 4], S41, 4149444226u); /* 61 */II ( d, a, b, c, in[11], S42, 3174756917u); /* 62 */ II ( c, d, a, b, in[ 2], S43, 718787259u); /* 63 */ II ( b, c, d, a, in[ 9], S44, 3951481745u); /* 64 */buf[0] += a;buf[1] += b;buf[2] += c;buf[3] += d;}。
基于51单片机MD5算法实现
基于51单片机MD5算法实现MD5(Message-Digest Algorithm 5)是一种广泛使用的加密算法,用于确保数据完整性和安全性。
在本文中,我们将介绍如何基于51单片机实现MD5算法。
MD5算法的实现需要以下几个步骤:初始化、填充消息、分组处理和生成摘要。
首先,我们需要初始化MD5算法的参数。
MD5算法使用4个32位寄存器(A、B、C和D)来保存中间计算结果。
以及一个64位计数器来记录已处理的消息位数。
此外,还需要定义一个常量表,用于生成每个消息块的32位运算常数。
接下来,我们将把待处理的消息填充到512位的消息块中。
在填充消息之前,我们需要根据消息的长度对其进行填充。
填充规则如下:首先,在消息的末尾添加一个数值为1的位,然后添加若干个0,直到消息的长度满足对512取模等于448的条件。
最后,将消息的长度以64位二进制表示并添加到消息的末尾。
然后,我们需要将填充后的消息块分为16个32位的子块。
每个子块将依次进行一系列的处理。
处理过程可分为4轮,每轮都包含16个操作步骤。
每个步骤的结果将作为下一个步骤的输入。
在每轮处理的过程中,会对子块中的每个字做相应的处理运算,包括逻辑运算和位移运算。
其中,逻辑运算包括与运算、或运算和异或运算;位移运算包括循环左移和循环右移。
最后,将最终的四个32位寄存器的内容按照从低位到高位的顺序连接起来,即为MD5算法的输出结果。
为了在51单片机上实现MD5算法,我们需要先了解51单片机的特点和功能。
51单片机是一种常用的8位单片机,具有低功耗、高性能和易于编程的特点。
它可以实现大部分基本的运算和控制功能,并且具有丰富的通信接口和存储器。
我们可以利用51单片机的GPIO口和定时器功能来实现MD5算法的各种操作。
首先,我们将利用51单片机的GPIO口来实现MD5算法的初始化操作和消息填充操作。
通过设置GPIO口的输入输出状态来实现不同的操作。
然后,我们可以利用51单片机的定时器功能来实现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算法及vc实现(一个MD5对象)- -(1)MD5简介MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。
Message-Digest泛指字节串(Message)的Hash变换,就是把一个任意长度的字节串变换成一定长的大整数。
请注意我使用了“字节串”而不是“字符串”这个词,是因为这种变换只与字节的值有关,与字符集或编码方式无关。
MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。
MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。
举个例子,你将一段话写在一个叫readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现。
如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。
MD5还广泛用于加密和解密技术上,在很多操作系统中,用户的密码是以MD5值(或类似的其它算法)的方式保存的,用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,而系统并不“知道”用户的密码是什么。
一些黑客破获这种密码的方法是一种被称为“跑字典”的方法。
有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。
MD5源代码
Md5源代码using System;using System.Collections.Generic;using System.Text;using System.IO;using System.Security.Cryptography;namespace CSharpMD5{class Program{static void Main(string[] args){CreatNew();}public static void CreatNew(){string name = "";string fileNameMD5 = "";string code = "";string code2 = "";string codeMD5 = "";do{try{Console.WriteLine("输入用户名:");name = Console.ReadLine();fileNameMD5 = GetMD5(name);string filename = @"c:\" + fileNameMD5 + ".data";if (File.Exists(filename)){Console.WriteLine("密码文件已存在,是否修改密码? y/n");string temp = "";temp = Console.ReadLine();if (temp == "Y" || temp == "y"){//File.Delete(filename);Enter(fileNameMD5);}else{CreatNew();}}else{code = SetCode();codeMD5 = GetMD5(code);SaveToFile(filename, codeMD5);}}catch (Exception e){Console.WriteLine(e.ToString());}} while (code != code2);}public static void Enter(string fileNameMD5){string fileName = @"c:\" + fileNameMD5 + ".data";string codeBuffer = "";string code = "";try{using (StreamReader sr = new StreamReader(fileName)) {string temp;while ((temp = sr.ReadLine()) != null){codeBuffer += temp;}}Console.WriteLine("输入原密码:");string codeTemp = Console.ReadLine();codeTemp = GetMD5(codeTemp);if (codeTemp == codeBuffer){code = SetCode();SaveToFile(fileName, code);}else{Console.WriteLine("密码错误!");return;}}catch (Exception e){Console.WriteLine("The file could not be read:");Console.WriteLine(e.Message);}}public static string GetMD5(string str){string temp = "";try{MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();UTF8Encoding encoder = new UTF8Encoding();byte[] hashedDataBytes = puteHash(encoder.GetBytes(str)); temp = System.BitConverter.ToString(hashedDataBytes);temp = temp.Replace("-", "");}catch (Exception e){Console.WriteLine(e.Message);}return temp;}public static string SetCode(){string code = "";string code2 = "";try{do{Console.WriteLine("输入新口令:");code = Console.ReadLine();Console.WriteLine("请再次输入口令确认:");code2 = Console.ReadLine();if (code != code2)Console.WriteLine("两次输入的口令不一致,请重新输入!\n");} while (code != code2);}catch (Exception e){Console.WriteLine(e.Message);}return code;}public static void SaveToFile(string fileName, string text){FileStream fs = new FileStream(fileName, FileMode.Append, FileAccess.Write, FileShare.Write);fs.Close();StreamWriter sw = new StreamWriter(fileName, true, Encoding.ASCII);sw.WriteLine(text + '\n');sw.Close();Console.WriteLine("文件建立成功!");}}}========================================================================================================================================================。
c语言:md5函数
c语⾔:md5函数c语⾔md5函数源码md5相关资料:#include<stdio.h>#include<string.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 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]为64位⼆进制表⽰的⽂件初始长度char filename[200]; //⽂件名FILE *fp;void md5() //MD5核⼼算法,供64轮{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;}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); //⽂件指针转到⽂件末尾if((len=ftell(fp))==-1){printf("Sorry! Can not calculate files which larger than 2 GB!\n"); //ftell函数返回long,最⼤为2GB,超出返回-1fclose(fp);continue;}rewind(fp); //⽂件指针复位到⽂件头A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476; //初始化链接变量flen[1]=len/0x20000000; //flen单位是bitflen[0]=(len%0x20000000)*8;memset(x,0,64); //初始化x数组为0fread(&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⼆进制即10000000if(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)); //⾼低位逆反输出}}ps:偶在看到的,顺⼿就贴了过来。
C语言实现md5函数代码
C语⾔实现md5函数代码头⽂件:md5.h1 #ifndef MD5_H2#define MD5_H34 typedef struct5 {6 unsigned int count[2];7 unsigned int state[4];8 unsigned char buffer[64];9 }MD5_CTX;101112#define F(x,y,z) ((x & y) | (~x & z))13#define G(x,y,z) ((x & z) | (y & ~z))14#define H(x,y,z) (x^y^z)15#define I(x,y,z) (y ^ (x | ~z))16#define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n)))17#define FF(a,b,c,d,x,s,ac) \18 { \19 a += F(b,c,d) + x + ac; \20 a = ROTATE_LEFT(a,s); \21 a += b; \22 }23#define GG(a,b,c,d,x,s,ac) \24 { \25 a += G(b,c,d) + x + ac; \26 a = ROTATE_LEFT(a,s); \27 a += b; \28 }29#define HH(a,b,c,d,x,s,ac) \30 { \31 a += H(b,c,d) + x + ac; \32 a = ROTATE_LEFT(a,s); \33 a += b; \34 }35#define II(a,b,c,d,x,s,ac) \36 { \37 a += I(b,c,d) + x + ac; \38 a = ROTATE_LEFT(a,s); \39 a += b; \40 }41void MD5Init(MD5_CTX *context);42void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen);43void MD5Final(MD5_CTX *context,unsigned char digest[16]);44void MD5Transform(unsigned int state[4],unsigned char block[64]);45void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len);46void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len);4748#endif49源⽂件md5.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,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); /* 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;}————————————————版权声明:本⽂为CSDN博主「艾蔓草」的原创⽂章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原⽂出处链接及本声明。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
output[j] = input[i] & 0xFF;
output[j+1] = (input[i] >> 8) & 0xFF;
output[j+2] = (input[i] >> 16) & 0xFF;
MD5Encode(digest,context->state,16);
}
void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len)
{
unsigned int i = 0,j = 0;
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);
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);
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);
{
memcpy(&context->buffer[index],input,partlen);
MD5Transform(context->state,context->buffer);
for(i = partlen;i+64 <= inputlen;i+=64)
output[j+3] = (input[i] >> 24) & 0xFF;
i++;
j+=4;
}
}
void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len)
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);
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);
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);
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;
if(context->count[0] < (inputlen << 3))
context->count[1]++;
context->count[1] += inputlen >> 29;
if(inputlen >= partlen)
#include <string.h>
#include "md5c.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,
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);
}
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;
{
unsigned int i = 0,index = 0,partlen = 0;
index = (context->count[0] >> 3) & 0x3F;
partlen = 64 - index;
context->count[0]MD5Transform(context->state,&input[i]);
index = 0;
}
else
{
i = 0;
}
memcpy(&context->buffer[index],&input[i],inputlen-i);
context->state[1] = 0xEFCDAB89;
context->state[2] = 0x98BADCFE;
context->state[3] = 0x10325476;
}
void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen)
padlen = (index < 56)?(56-index):(120-index);
MD5Encode(bits,context->count,8);
MD5Update(context,PADDING,padlen);
MD5Update(context,bits,8);
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);
(input[j+3] << 24);
i++;
j+=4;
}
}
void MD5Transform(unsigned int state[4],unsigned char block[64])
{
unsigned int a = state[0];
II(a, b, c, d, x[12], 6, 0x655b59c3);
{
unsigned int i = 0,j = 0;
while(j < len)
{
output[i] = (input[j]) |
(input[j+1] << 8) |
(input[j+2] << 16) |
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);