C语言实现MD5加密,竟如此简单( 三 )

五、MD5加密实例MD5加密步骤如下:

  1. 定义
MD5_CTX md5c; 
  1. 初始化
/********************************************************* 名    称: MD5Init()* 功    能: 初始化MD5结构体* 入口参数:    context:要初始化的MD5结构体 * 出口参数: 无*********************************************************/MD5Init(MD5_CTX *context);
  1. MD5值计算
实现MD5值的计算及结构体的更新:
/********************************************************** 名    称: MD5Update()* 功    能: 将要加密的信息传递给初始化过的MD5结构体,无返回值* 入口参数:    context:初始化过了的MD5结构体     input:需要加密的信息,可以任意长度    inputLen:指定input的长度* 出口参数: 无*********************************************************/MD5Update(MD5_CTX *context,(unsigned char *)input,inputLen); 
  1. 输出转换
/********************************************************** 名    称: MD5Update()* 功    能: 将加密结果存储到,无返回值* 入口参数:    context:初始化过了的MD5结构体     digest :加密过的结果* 出口参数: 无*********************************************************/MD5Final(MD5_CTX *context,unsigned char digest[16]);
  1. 格式整理
转换成32位的16进制字符串 。
实例1 字符串加密对字符串进行加密:
  1 #include <stdio.h>  2 #include <stdlib.h>  3 #include "md5.h"  4 #include <sys/types.h>  5 #include <sys/stat.h>  6 #include <fcntl.h>  7 #include <string.h>  8   9 void main( void )  10 {  11     int read_len; 12     int i ; 13     char temp[8]={0}; 14     unsigned char digest[16]; //存放结果  15     char hexbuf[128]="12334567"; 16     unsigned char decrypt[16]={0};   17     unsigned char decrypt32[64]={0};     18  19     MD5_CTX md5c;  20  21     MD5Init(&md5c); //初始化 22     read_len = strlen(hexbuf); 23     MD5Update(&md5c,(unsigned char *)hexbuf,read_len);   24  25     MD5Final(&md5c,decrypt);  26     strcpy((char *)decrypt32,""); 27  28     for(i=0;i<16;i++) 29     { 30         sprintf(temp,"%02x",decrypt[i]); 31         strcat((char *)decrypt32,temp); 32     } 33     printf("md5:%sn",decrypt32); 34      35     return; 36 }执行结果如下:
C语言实现MD5加密,竟如此简单

文章插图
 
本例对字符串12334567进行加密,结果和在线加密结果一致 。
实例2 文件加密对文件进行加密
#include <stdio.h>#include <stdlib.h>#include "md5.h"#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <string.h>#define FORword_FW "123.c"int calc_md5(char*filename,char*dest){ int i; int filelen = 0; int read_len; char temp[8]={0};  char hexbuf[128]={0}; unsigned char decrypt[16]={0};   unsigned char decrypt32[64]={0}; MD5_CTX md5; char fw_path[128]; int fdf;  fdf = open(filename,O_RDWR); if(fdf<0) {  printf("%s not existn",FORWORD_FW);  return -1; }  MD5Init(&md5);   while(1) {  read_len = read(fdf, hexbuf,sizeof(hexbuf));   if (read_len <0) {     close(fdf);      return -1;  }  if(read_len==0)  {   break;  }  filelen += read_len;  MD5Update(&md5,(unsigned char *)hexbuf,read_len);  }  MD5Final(&md5,decrypt);  strcpy((char *)decrypt32,"");  for(i=0;i<16;i++) {  sprintf(temp,"%02x",decrypt[i]);  strcat((char *)decrypt32,temp); } strcpy(dest,decrypt32); printf("md5:%s len=%dn",dest,filelen); close(fdf); return filelen;}int main(int argc, char *argv[]){ int ret; int filelen; char md5_str[64]={0}; char cmd[256]={0};  filelen = calc_md5(FORWORD_FW,md5_str); if(filelen<0) {  printf("calc_md5 failn");  return -1; } return 0;}


推荐阅读