MD5加密算法-c源代码

合集下载

微信小程序MD5加密登录密码详解及实例代码

微信小程序MD5加密登录密码详解及实例代码

微信⼩程序MD5加密登录密码详解及实例代码微信⼩程序 MD5加密在⼩程序中,页⾯的脚本逻辑是在JsCore中运⾏,JsCore是⼀个没有窗⼝对象的环境,所以不能在脚本中使⽤window,也⽆法在脚本中操作组件。

zepto/jquery 也⽆法使⽤,因为zepto/jquery 会使⽤到window对象和document对象。

所以在微信⼩程序中不能使⽤jquery.md5.js对密码进⾏加密。

下⾯我提供⼀种MD5.js加密实例,本实例先静态演⽰,后⾯再到⼩程序中演⽰。

md5.js程序如下:/** A JavaScript implementation of the RSA Data Security, Inc. MD5 Message* Digest Algorithm, as defined in RFC 1321.* Version 1.1 Copyright (C) Paul Johnston 1999 - 2002.* Code also contributed by Greg Holt* See /site/legal.html for details.*//** Add integers, wrapping at 2^32. This uses 16-bit operations internally* to work around bugs in some JS interpreters.*/function safe_add(x, y){var lsw = (x & 0xFFFF) + (y & 0xFFFF)var msw = (x >> 16) + (y >> 16) + (lsw >> 16)return (msw << 16) | (lsw & 0xFFFF)}/** Bitwise rotate a 32-bit number to the left.*/function rol(num, cnt){return (num << cnt) | (num >>> (32 - cnt))}/** These functions implement the four basic operations the algorithm uses.*/function cmn(q, a, b, x, s, t){return safe_add(rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b)}function ff(a, b, c, d, x, s, t){return cmn((b & c) | ((~b) & d), a, b, x, s, t)}function gg(a, b, c, d, x, s, t){return cmn((b & d) | (c & (~d)), a, b, x, s, t)}function hh(a, b, c, d, x, s, t){return cmn(b ^ c ^ d, a, b, x, s, t)}function ii(a, b, c, d, x, s, t){return cmn(c ^ (b | (~d)), a, b, x, s, t)}/** Calculate the MD5 of an array of little-endian words, producing an array* of little-endian words.*/function coreMD5(x){var a = 1732584193var b = -271733879var c = -1732584194var d = 271733878for(i = 0; i < x.length; i += 16)var olda = avar oldb = bvar oldc = cvar oldd = da = ff(a, b, c, d, x[i+ 0], 7 , -680876936)d = ff(d, a, b, c, x[i+ 1], 12, -389564586) c = ff(c, d, a, b, x[i+ 2], 17, 606105819)b = ff(b, c, d, a, x[i+ 3], 22, -1044525330) a = ff(a, b, c, d, x[i+ 4], 7 , -176418897)d = ff(d, a, b, c, x[i+ 5], 12, 1200080426) c = ff(c, d, a, b, x[i+ 6], 17, -1473231341) b = ff(b, c, d, a, x[i+ 7], 22, -45705983)a = ff(a, b, c, d, x[i+ 8], 7 , 1770035416) d = ff(d, a, b, c, x[i+ 9], 12, -1958414417) c = ff(c, d, a, b, x[i+10], 17, -42063)b = ff(b, c, d, a, x[i+11], 22, -1990404162) a = ff(a, b, c, d, x[i+12], 7 , 1804603682) d = ff(d, a, b, c, x[i+13], 12, -40341101)c = ff(c, d, a, b, x[i+14], 17, -1502002290) b = ff(b, c, d, a, x[i+15], 22, 1236535329) a = gg(a, b, c, d, x[i+ 1], 5 , -165796510)d = gg(d, a, b, c, x[i+ 6], 9 , -1069501632) c = gg(c, d, a, b, x[i+11], 14, 643717713) b = gg(b, c, d, a, x[i+ 0], 20, -373897302) a = gg(a, b, c, d, x[i+ 5], 5 , -701558691) d = gg(d, a, b, c, x[i+10], 9 , 38016083)c = gg(c, d, a, b, x[i+15], 14, -660478335) b = gg(b, c, d, a, x[i+ 4], 20, -405537848) a = gg(a, b, c, d, x[i+ 9], 5 , 568446438)d = gg(d, a, b, c, x[i+14], 9 , -1019803690) c = gg(c, d, a, b, x[i+ 3], 14, -187363961) b = gg(b, c, d, a, x[i+ 8], 20, 1163531501) a = gg(a, b, c, d, x[i+13], 5 , -1444681467) d = gg(d, a, b, c, x[i+ 2], 9 , -51403784)c = gg(c, d, a, b, x[i+ 7], 14, 1735328473) b = gg(b, c, d, a, x[i+12], 20, -1926607734) a = hh(a, b, c, d, x[i+ 5], 4 , -378558)d = hh(d, a, b, c, x[i+ 8], 11, -2022574463) c = hh(c, d, a, b, x[i+11], 16, 1839030562) b = hh(b, c, d, a, x[i+14], 23, -35309556) a = hh(a, b, c, d, x[i+ 1], 4 , -1530992060) d = hh(d, a, b, c, x[i+ 4], 11, 1272893353) c = hh(c, d, a, b, x[i+ 7], 16, -155497632) b = hh(b, c, d, a, x[i+10], 23, -1094730640) a = hh(a, b, c, d, x[i+13], 4 , 681279174) d = hh(d, a, b, c, x[i+ 0], 11, -358537222) c = hh(c, d, a, b, x[i+ 3], 16, -722521979) b = hh(b, c, d, a, x[i+ 6], 23, 76029189)a = hh(a, b, c, d, x[i+ 9], 4 , -640364487) d = hh(d, a, b, c, x[i+12], 11, -421815835) c = hh(c, d, a, b, x[i+15], 16, 530742520)b = hh(b, c, d, a, x[i+ 2], 23, -995338651) a = ii(a, b, c, d, x[i+ 0], 6 , -198630844)d = ii(d, a, b, c, x[i+ 7], 10, 1126891415) c = ii(c, d, a, b, x[i+14], 15, -1416354905) b = ii(b, c, d, a, x[i+ 5], 21, -57434055)a = ii(a, b, c, d, x[i+12], 6 , 1700485571) d = ii(d, a, b, c, x[i+ 3], 10, -1894986606) c = ii(c, d, a, b, x[i+10], 15, -1051523)b = ii(b, c, d, a, x[i+ 1], 21, -2054922799) a = ii(a, b, c, d, x[i+ 8], 6 , 1873313359) d = ii(d, a, b, c, x[i+15], 10, -30611744)c = ii(c, d, a, b, x[i+ 6], 15, -1560198380) b = ii(b, c, d, a, x[i+13], 21, 1309151649) a = ii(a, b, c, d, x[i+ 4], 6 , -145523070)d = ii(d, a, b, c, x[i+11], 10, -1120210379) c = ii(c, d, a, b, x[i+ 2], 15, 718787259)b = ii(b, c, d, a, x[i+ 9], 21, -343485551)a = safe_add(a, olda)b = safe_add(b, oldb)c = safe_add(c, oldc)d = safe_add(d, oldd)}return [a, b, c, d]}/** Convert an array of little-endian words to a hex string.*/function binl2hex(binarray){var hex_tab = "0123456789abcdef"var str = ""for(var i = 0; i < binarray.length * 4; i++){str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +hex_tab.charAt((binarray[i>>2] >> ((i%4)*8)) & 0xF)}return str}/** Convert an array of little-endian words to a base64 encoded string.*/function binl2b64(binarray){var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" var str = ""for(var i = 0; i < binarray.length * 32; i += 6){str += tab.charAt(((binarray[i>>5] << (i%32)) & 0x3F) |((binarray[i>>5+1] >> (32-i%32)) & 0x3F))}return str}/** Convert an 8-bit character string to a sequence of 16-word blocks, stored* as an array, and append appropriate padding for MD4/5 calculation.* If any of the characters are >255, the high byte is silently ignored.*/function str2binl(str){var nblk = ((str.length + 8) >> 6) + 1 // number of 16-word blocksvar blks = new Array(nblk * 16)for(var i = 0; i < nblk * 16; i++) blks[i] = 0for(var i = 0; i < str.length; i++)blks[i>>2] |= (str.charCodeAt(i) & 0xFF) << ((i%4) * 8)blks[i>>2] |= 0x80 << ((i%4) * 8)blks[nblk*16-2] = str.length * 8return blks}/** Convert a wide-character string to a sequence of 16-word blocks, stored as* an array, and append appropriate padding for MD4/5 calculation.*/function strw2binl(str){var nblk = ((str.length + 4) >> 5) + 1 // number of 16-word blocksvar blks = new Array(nblk * 16)for(var i = 0; i < nblk * 16; i++) blks[i] = 0for(var i = 0; i < str.length; i++)blks[i>>1] |= str.charCodeAt(i) << ((i%2) * 16)blks[i>>1] |= 0x80 << ((i%2) * 16)blks[nblk*16-2] = str.length * 16return blks}/** External interface*/function hexMD5 (str) { return binl2hex(coreMD5( str2binl(str))) }function hexMD5w(str) { return binl2hex(coreMD5(strw2binl(str))) }function b64MD5 (str) { return binl2b64(coreMD5( str2binl(str))) }function b64MD5w(str) { return binl2b64(coreMD5(strw2binl(str))) }/* Backward compatibility */function calcMD5(str) { return binl2hex(coreMD5( str2binl(str))) }md5.html页⾯程序如下:<html><head><script language='javascript' src='md5.js'></script><!--引⼊MD5加密--><script language="javascript"><!--function my_do()//通过js对数据进⾏加密{//var URL="http://127.0.0.1/index.jsp?";//var dqz_out="";var dqz_in=document.my_form1.my_in_1.value;document.my_form1.my_out_1.value=hexMD5(dqz_in);document.my_form1.my_out_2.value=hexMD5w(dqz_in);document.my_form1.my_out_3.value=b64MD5(dqz_in);document.my_form1.my_out_4.value=b64MD5w(dqz_in);//URL=URL+"in="+dqz_in+"&out="+dqz_out;//my_form1.action = URL;//window.open(URL,'','');//my_form1.submit();}//--></script></head><body><form name="my_form1" method="get" action=""><p>计算MD5加密结果的例⼦<br>请输⼊加密内容:<textarea name="my_in_1" cols="70" rows="10">1234567890</textarea><br>点击右边的⽂本框显⽰结果:<br><!--mouseup某个⿏标按键被松开,mouseout⿏标从某个元素移开-->hexMD5()= <input name="my_out_1" type="text" onChange="my_do()" onMouseUp="my_do()" onMouseOut="my_do()" size="50" maxlength="50"><br> hexMD5w()=<input name="my_out_2" type="text" onChange="my_do()" onMouseUp="my_do()" onMouseOut="my_do()" size="50" maxlength="50"><br> b64MD5()= <input name="my_out_3" type="text" onChange="my_do()" onMouseUp="my_do()" onMouseOut="my_do()" size="50" maxlength="50"><br> b64MD5w()=<input name="my_out_4" type="text" onChange="my_do()" onMouseUp="my_do()" onMouseOut="my_do()" size="50" maxlength="50"><br> <br></p></form></body></html>md5.js加密效果如图:下⾯介绍微信⼩程序如何加密——模块化我们可以将⼀些公共的代码抽离成为⼀个单独的 js ⽂件,作为⼀个模块。

常用加密算法MD5、SHA-2和AES源码分享(CC++)

常用加密算法MD5、SHA-2和AES源码分享(CC++)

常⽤加密算法MD5、SHA-2和AES源码分享(CC++) 最近了解了⼀些加密算法,学习整理⼀些⽬前⽐较常⽤的三种加密⽅式(散列、对称、⾮对称)的相关经典算法(MD5、SHA-2、AES、RSA),这次分享的是MD5、SHA-2和ASE的纯C源码,另外两个我找时间整理好后会在贴出来。

⼤概介绍下这三种算法,详细的相关内容可以在⽹上搜索。

MD5是⼀种散列算法可以将任何数据散列成128位,速度很快,⼀般感觉⽤于数据⽂件校验⽐较多(安全性相对较低⽽且散列位数128位还是有概率碰撞,虽然极低极低,所以也有了另外这个SHA-2散列算法)。

AES是⼀种⾮常安全的对称加密,数据传输加密都可以⽤,然后有128、192、256位密钥,当然密钥越长加密解密越慢,看情况使⽤。

三种算法的核⼼算法代码都是我在⽹上查找的: MD5是基于Ron Rivest(RSA的那个R..)的算法,实现是由Colin Plumb 在1993年实现的。

AES核⼼算法源码() SHA2核⼼算法源码() 我对其进⾏了整理和封装,最⼤程度⽅便使⽤ MD5因为不牵扯密钥和解密所以超简单,两个接⼝⼀个散列⽂件⼀个散列数据: void MD5File(const char *filename, unsigned char *digest); void MD5Data(const unsigned char *data, unsigned int len, unsigned char *digest); AES⾸先得确认密钥长度,我这个是256位测试的,我代码⾥已经定义好相关三个宏AES_128、AES_192、AES_256,⾃⾏替换代⼊,接⼝我分别封装了加密解密数据和⽂件⼀共四个接⼝: int aes_cipher_data(uint8_t *in, size_t in_len, uint8_t *out, uint8_t *key, size_t key_len); int aes_decipher_data(uint8_t *in, size_t in_len, uint8_t *out, size_t *out_len, uint8_t *key, size_t key_len); int aes_cipher_file(const char *in_filename, const char *out_filename, uint8_t *key, size_t key_len); int aes_decipher_file(const char *in_filename, const char *out_filename, uint8_t *key, size_t key_len); 因为aes加密需要进⾏补位之前没有做,我这次更新添加了PKCS5Padding补位⽅法,填充的原则是:数据长度除16,余数不为16,需要补满16个字节,填充(16-len)个(16-len),等于0额外填充16个16。

加密算法 c语言

加密算法 c语言

加密算法 c语言C语言是一种广泛应用于计算机科学领域的编程语言,它具有高效、灵活、可靠的特点。

在密码学中,加密算法是一种用于保护信息安全的重要工具。

本文将介绍一些常见的加密算法和在C语言中的实现。

一、对称加密算法对称加密算法是一种使用相同的密钥进行加密和解密的算法。

其中,最常见的对称加密算法是DES(Data Encryption Standard)和AES(Advanced Encryption Standard)。

1. DES算法DES算法是一种将64位明文加密为64位密文的块加密算法。

它使用56位的密钥和一系列的置换、替换和移位操作来进行加密。

C语言中可以使用openssl库中的函数来实现DES算法的加密和解密。

2. AES算法AES算法是一种使用128位、192位或256位密钥进行加密和解密的块加密算法。

它使用一系列的置换、替换和线性变换操作来进行加密。

C语言中可以使用openssl库中的函数来实现AES算法的加密和解密。

二、非对称加密算法非对称加密算法是一种使用不同的密钥进行加密和解密的算法。

其中,最常见的非对称加密算法是RSA(Rivest-Shamir-Adleman)算法。

1. RSA算法RSA算法是一种基于数论的非对称加密算法。

它使用一对公钥和私钥来进行加密和解密。

C语言中可以使用openssl库中的函数来实现RSA算法的加密和解密。

三、散列函数散列函数是一种将任意长度的输入映射为固定长度输出的算法。

其中,最常见的散列函数是MD5(Message Digest Algorithm 5)和SHA(Secure Hash Algorithm)系列算法。

1. MD5算法MD5算法是一种广泛使用的散列函数,它将任意长度的输入映射为128位的输出。

C语言中可以使用openssl库中的函数来实现MD5算法。

2. SHA算法SHA算法是一系列散列函数,其中最常见的是SHA-1、SHA-256和SHA-512。

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;}。

C#中算法

C#中算法

C#使用MD5算法对密码进行加密对密码进行加密的算法有很多种,在C#中较常使用的是MD5加密算法。

它是一种用于产生数字签名的单项散列算法,具体代码如下:public string Encrypt(string strPwd){MD5 md5 = new MD5CryptoServiceProvider();byte[] data = System.Text.Encoding.Default.GetBytes(strPwd);//将字符编码为一个字节序列byte[] md5data = puteHash(data);//计算data字节数组的哈希值md5.Clear();string str = "";for (int i = 0; i <md5data.Length-1; i++){str += md5data[i].ToString("x").PadLeft(2,'0');}return str;}注意:在编码之前应先引入命名空间System.Security.Cryptography。

而且始用散列算法对原始密码加密后无法再恢复。

这也是MD5加密算法的一个蔽端。

C#实现二、八、十六进制数转十进制数的算法二进制换为十进制的方法,例如:二进制数:11001十进制数:1*24+1*23+0*22+0*21+1*20=25八进制换为十进制的方法,例如:八进制数:32007十进制数:3*84+2*83+0*82+0*81+7*80=13319十六进制换为十进制的方法,例如:十六进制数:a20f(由于十六进制数用a~f表示10~15之间的数,所以计算时将a~f用10~15表示)十进制数:10*83+2*82+0*81+15*80=41487通过以上二、八、十六进制数转十进制数的计算方法,可得出计算的代码为://参数Num为需要转换的数,n为该数的进制public string ToD(string Num, int n){char[] nums=Num.ToCharArray ();int d = 0;for (int i = 0; i <nums.Length ; i++){string number=nums [i].ToString ();if (n == 16){switch (number.ToUpper ()){case "A":number = "10";break;case "B":number = "11";break;case "C":number = "12";break;case "D":number = "13";break;case "E":number = "14";break;case "F":number = "15";break;}}Double power = Math.Pow(Convert.ToDouble (n),Convert.ToDouble ( nums.Length - (i +1)));d = d + Convert.ToInt32 (number) * Convert.ToInt32 (power);}return d.ToString ();}C#十进制数转十六进制数的算法十进数转换为十六进制数的方法与以上两种的转换方法相似,不同之处除了除数改为16外,还需要将余数为10~15的数改为A~F的形式。

md5加密算法的C(C )代码实现-3

md5加密算法的C(C  )代码实现-3

当你按照我上面所说的方法实现md5算法以后,你可以用以下几个信息对你做出来的程序作一个简单的测试,看看程序有没有错误。
md5 ("") = d41d8cd98f00b204e9800998ecf8427e md5 ("a") = 0cc175b9c0f1b6a831c399e269772661 md5 ("abc") = 900150983cd24fb0d6963f7d28e17f72 md5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0 md5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b md5 ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789") = d174ab98d277d9f5a5611c2c9f419d9f md5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = 57edf4a22be3c955ac49da2e2107b67a
第四轮
ii(a,b,c,d,m0,6,0xf4292244)
ii(d,a,b,c,m7,10,0x432aff97)
Байду номын сангаас
ii(c,d,a,b,m14,15,0xab9423a7)
ii(b,c,d,a,m5,21,0xfc93a039)

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算法的代码。

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("文件建立成功!");}}}========================================================================================================================================================。

字符串加密与解密(MD5)

字符串加密与解密(MD5)

字符串加密与解密(MD5)加密、解密字符串时,需要⽤到加密类和内存流,所以⾸先需要在命名控件中需要进⾏引⼊static string encryptKey = "Oyea"; //定义秘钥public string Encrypt(string str) //加密{DESCryptoServiceProvider descsp = new DESCryptoServiceProvider();//实例化加密对象byte[] key = Encoding.Unicode.GetBytes(encryptKey);//定义字节数组,⽤来存储秘钥byte[] data = Encoding.Unicode.GetBytes(str);//定义字节数组,⽤来要存储加密的字符串MemoryStream mStream = new MemoryStream();//实例化内存流对象//使⽤内存流实例化加密对象CryptoStream cStream = new CryptoStream(mStream, descsp.CreateEncryptor(key, key), CryptoStreamMode.Write); cStream.Write(data,0, data.Length);cStream.FlushFinalBlock();return Convert.ToBase64String( mStream.ToArray());}public string DesCrypr(string str){DESCryptoServiceProvider descsp = new DESCryptoServiceProvider();//定义加密类对象byte[] key = Encoding.Unicode.GetBytes(encryptKey);byte[] data = Convert.FromBase64String(str);MemoryStream mStram = new MemoryStream();//实例化内存流对象CryptoStream cStream = new CryptoStream(mStram, descsp.CreateDecryptor(key, key), CryptoStreamMode.Write); cStream.Write(data,0,data.Length);cStream.FlushFinalBlock();return Encoding.Unicode.GetString(mStram.ToArray());}//MD5加密不可逆public string GetMd5(string str) //加密⽅法{string strResult = string.Empty;//创建实例MD5 md5 = MD5.Create();byte[] strByte= Encoding.Default.GetBytes(str); //字符转换成字符数组byte[] md5Buffer= puteHash(strByte, 0, strByte.Length); //转换加密数组for (int i = 0; i < md5Buffer.Length; i++) //循环{strResult += md5Buffer[i].ToString("X2"); //⾃⼰转换成16进制}return strResult;}。

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加密函数并不复杂。

md5加密算法的C(C++)代码实现(完整)

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算法的加密后结果是唯一的——既没有重复。

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算法及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值在这个字典中检索。

C语言实现md5函数代码

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 版权协议,转载请附上原⽂出处链接及本声明。

MD5-加密算法以及原理-delphi版

MD5-加密算法以及原理-delphi版

1.MD5算法说明一、补位二、补数据长度三、初始化MD5参数四、处理位操作函数五、主要变换过程六、输出结果补位:MD5算法先对输入的数据进行补位,使得数据位长度LEN对512求余的结果是448。

即数据扩展至K*512+448位。

即K*64+56个字节,K为整数。

具体补位操作:补一个1,然后补0至满足上述要求。

补数据长度:用一个64位的数字表示数据的原始长度B,把B用两个32位数表示。

这时,数据就被填补成长度为512位的倍数。

初始化MD5参数:四个32位整数(A,B,C,D) 用来计算信息摘要,初始化使用的是十六进制表示的数字A=0X01234567B=0X89abcdefC=0Xfedcba98D=0X76543210处理位操作函数:X,Y,Z为32位整数。

F(X,Y,Z) = X&Y|NOT(X)&ZG(X,Y,Z) = X&Z|Y?(Z)H(X,Y,Z) = X xor Y xor ZI(X,Y,Z) = Y xor (X|not(Z))主要变换过程:使用常数组T[1 ... 64],T[i]为32位整数用16进制表示,数据用16个32位的整数数组M[]表示。

具体过程如下:For i = 0 to N/16-1 doFor j = 0 to 15 doSet X[j] to M[i*16+j].end /结束对J的循环AA = ABB = BCC = CDD = D[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4][ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8][ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12][ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16][ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20][ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24][ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28][ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32][ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36][ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40][ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44][ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48][ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51][BCDA 5 21 52][ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55][BCDA 1 21 56][ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59][BCDA 13 21 60][ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63][BCDA 9 21 64]A = A + AAB = B + BBC = C + CCD = D + DDend输出结果。

利用OPENSSL实现MD5加密。

利用OPENSSL实现MD5加密。

unsigned char inBuffer[200]; unsigned char OutBuffer[200];
char c=' '; int i=0,outLen=0;
cout<<"请输入需要加密的明文,以*作为结束符:"; while(c!='*') { c=getchar(); inBuffer[i++]=c; } cout<<endl; do_encrypt(inBuffer,i-1,OutBuffer,&outLen);
unsigned int tmplen; EVP_MD_CTX ctx;
EVP_MD_CTX_init(&ctx);//step1
EVP_DigestInit(&ctx,EVP_md5());//step2
if(!EVP_DigestUpdate(&ctx,inBuffer,inLen))//step3 {
void print_hex(unsigned char *buf,unsigned int len) {
for(int i=0;i<len;i++) printf("%0.2x",buf[i]);
}
环境的配置在前面的文章已经讲过。
cout<<"使用MD进行加密,生成的密文为:"; print_hex(OutBuffer,outLen); cout<<endl<<endl;
system("pause"); }
bool do_encrypt(unsigned char *inBuffer,int inLen,unsigned char *outBuffer,int *pOutLen) {

python计算文件md5值

python计算文件md5值

python计算⽂件md5值 md5是⼀种常见不可逆加密算法,使⽤简单,计算速度快,在很多场景下都会⽤到,⽐如:给⽤户上传的⽂件命名,数据库中保存的⽤户密码,下载⽂件后检验⽂件是否正确等。

下⾯讲解在python中如何使⽤md5算法。

⼀、计算字符串的md5值#!/usr/bin/env python# -*- coding: utf-8 -*-import sysimport hashlibreload(sys)sys.setdefaultencoding('utf-8')if__name__ == '__main__':content = "hello"md5hash = hashlib.md5(content)md5 = md5hash.hexdigest()print(md5)运⾏上述代码,输出:5d41402abc4b2a76b9719d911017c592⽤PHP⾃带的md5函数计算同⼀个字符串,验证下hello的md5是否正确。

<?php$content = "hello";$md5 = md5($content);var_dump($md5); // 输出 5d41402abc4b2a76b9719d911017c592可见python下计算字符串的md5也是⾮常⽅便,使⽤hashlib库即可。

⽹上有⽂章介绍python2.x下可以使⽤md5库,该库在python3.x不能使⽤,因此不推荐使⽤该库。

字符串的md5计算⽐较简单,下⾯看下如何计算⽂件的md5值。

⼆、计算⽂件的md5值#!/usr/bin/env python# -*- coding: utf-8 -*-import sysimport hashlibreload(sys)sys.setdefaultencoding('utf-8')if__name__ == '__main__':file_name = "3383430480_51_01.jpg"with open(file_name, 'rb') as fp:data = fp.read()file_md5= hashlib.md5(data).hexdigest()print(file_md5) # ac3ee699961c58ef80a78c2434efe0d0⽂件md5计算跟字符串计算是⼀样,直接使⽤hashlib的md5⽅法,然后hexdigests就好了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
else
i = 0;
/* Buffer remaining input */
/*将输入缓冲区中的不足填充满512bits的剩余内容填充到context->buffer中,留待以后再作处理*/
R_memcpy((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen-i);
index = (unsigned int)((context->count[0] >> 3) & 0x3F);
/* Update number of bits *//*更新已有信息的bits长度*/
if((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3))
转换结果保存到context->state中
*/
for(i = partLen; i + 63 < inputLen; i += 64)/*把i+63<inputlen改为i+64<=inputlen更容易理解*/
MD5Transform(context->state, &input[i]);
index = 0;
}
/* MD5 finalization. Ends an MD5 message-digest operation, writing the
the message digest and zeroizing the context. */
#define S33 16
#define S34 23
#define S41 6
#define S42 10
#define S43 15
#define S44 21
static void MD5Transform(UINT4 [4], unsigned char [64]);
static void Encode(unsigned char *, UINT4 *, unsigned int);
typedef unsigned char *POINTER;
/* MD5 context. */
typedef struct {
/* state (ABCD) */
/*四个32bits数,用于存放最终计算得到的消息摘要。当消息长度〉512bits时,也用于存放每个512bits的中间结果*/
UINT4 state[4];
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define II(a, b, c, d, x, s, ac) { \
(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
unsigned char buffer[64];
} MD5_CTX;
void MD5Init(MD5_CTX *);
void MD5Update(MD5_CTX *, unsigned char *, unsigned int);
void MD5Final(unsigned char [16], MD5_CTX *);
#endif /* _MD5_H_ */
///////////////////////////////////////////////////////////////////////////
/* md5.cpp */
#include "stdafx.h"
/* Constants for MD5Transform routine. */
*/
#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.
(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define HH(a, b, c, d, x, s, ac) { \
(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
md5的介绍的文章网上很多,关于md5的来历,用途什么的这里就不再介绍了。这里主要介绍代码。代码明白了就什么都明白了。
////////////////////////////////////////////////////////////////////
/* md5.h */
#ifndef _MD5_H_
(a) += (b); \
}
/* MD5 initialization. Begins an MD5 operation, writing a new context. */
/*初始化md5的结构*/
void MD5Init (MD5_CTX *context)
{
/*将当前的有效信息的长度设成0,这个很简单,还没有有效信息,长度当然是0了*/
{
unsigned int i, index, partLen;
/* Compute number of bytes mod 64 */
/*计算已有信息的bits长度的字节数的模64, 64bytes=512bits。
用于判断已有信息加上当前传过来的信息的总长度能不能达到512bits,
如果能够达到则对凑够的512bits进行一次处理*/
/*用基本函数对填充满的512bits(已经保存到context->buffer中)做一次转换,转换结果保存到context->state中*/
MD5Transform(context->state, context->buffer);
/*
对当前输入的剩余字节做转换(如果剩余的字节<在输入的input缓冲区中>大于512bits的话),
*/
#define FF(a, b, c, d, x, s, ac) { \
(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define GG(a, b, c, d, x, s, ac) { \
context->count[1]++;
context->count[1] += ((UINT4)inputLen >> 29);
/*计算已有的字节数长度还差多少字节可以凑成64的整倍数*/
partLen = 64 - index;
/* Transform as many times as possible.
md5加密算法c实现
七分注释收藏
经常到csdn来是查资料,每次都会有所收获。总是看别人的感觉很不好意思,于是决定自己也写一点东西贡献出来。于是就有了这篇md5七分注释。希望对用到的朋友有所帮助。
记得当初自己刚开始学习md5的时候,从网上搜了很多关于算法的原理和文字性的描述的东西,但是看了很久一直没有搞懂,搜c的源代码又很少。直到后来学习rsa算法的时候,从网上下了1991年的欧洲的什么组织写的关于rsa、des、md5算法的c源代码(各部分代码混在一块的,比如rsa用到的随机大素数就是用机器的随机时间的md5哈希值获得的)。我才彻底把md5弄明白了。这里的代码就是我从那里面分离出来的,代码的效率和可重用性都是很高的。整理了一下希望对需要的朋友能够有帮助。
context->state[2] = 0x98badcfe;
context->state[3] = 0x10325476;
}
/* MD5 block update operation. Continues an MD5 message-digest
operation, prock, and updating the
*/
/*如果当前输入的字节数大于已有字节数长度补足64字节整倍数所差的字节数*/
if(inputLen >= partLen)
{
/*用当前输入的内容把context->buffer的内容补足512bits*/
R_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen);
};
/*
接下来的这几个宏定义是md5算法规定的,就是对信息进行md5加密都要做的运算。
据说有经验的高手跟踪程序时根据这几个特殊的操作就可以断定是不是用的md5
*/
/* F, G, H and I are basic MD5 functions.
*/
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
context->count[0] = context->count[1] = 0;
相关文档
最新文档