博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MD5校验及其c实现
阅读量:6214 次
发布时间:2019-06-21

本文共 2138 字,大约阅读时间需要 7 分钟。

那么MD5校验是什么?

    一般软件或者说文件都有自己的固定文件格式或者架构信息,说简单一点就是。”世界上没有完全相同的2片叶子” ,因为MD5是一种不可逆的加密算法。

     那么对于某些网上公开下载的软件,视频,尤其是镜像文件。如果被修改了可能会导致用不了或者其他的问题,发布者镜像MD5算法计算一组数值。让下载的用户 进行MD5数值对比,也就是MD5校验啦。由于MD5加密不可逆算,如果数值一样,那就表示文件没有被修改的。反之,则被修改了。

 

1. 计算MD5:

//MD5文件摘要MD5VAL md5File(FILE * fpin){    if(!Buffer)        Buffer=(char*) malloc(sizeof(char)*(BUFFER_SIZE+64));    char * buf=Buffer;    MD5VAL val={
0x67452301,0xefcdab89,0x98badcfe,0x10325476}; unsigned int *a=&(val.a), *b=&(val.b), *c=&(val.c), *d=&(val.d); unsigned int aa,bb,cc,dd; unsigned int i,j,count,co; unsigned int * x; i=0; do { count=fread(buf,1,BUFFER_SIZE,fpin); i+=count; if(count==BUFFER_SIZE) co=BUFFER_SIZE; else { j=count; buf[j++]=0x80; for(j;j%64!=56;j++) buf[j]=0x00; *(unsigned int *)(buf+j)=i<<3; j+=4; *(unsigned int *)(buf+j)=i>>29; j+=4; co=j; } for(j=0;j

 

应用: 校验从网上下载的文件是否完整、是否被篡改【是否和源文件提供的校验码相同】。

//Endian convert: big <-> littleunsigned int conv(unsigned int a){    unsigned int b=0;    b|=(a<<24)&0xff000000;    b|=(a<<8)&0x00ff0000;    b|=(a>>8)&0x0000ff00;    b|=(a>>24)&0x000000ff;    return b;}//比较校验码 //m_md5是供应方提供的校验码 //fp是本地文件指针int CheckUpdateFileMD5(const MD5VAL *m_md5, FILE * fp){    MD5VAL val;    if(fp == NULL || m_md5 == NULL)    {        printf("CheckUpdateFileMD5 fp is NULL\r\n");        return -1;    }    val = md5File(fp);    if(m_md5[0] == conv(val.a) &&        m_md5[1] == conv(val.b) &&        m_md5[2] == conv(val.c) &&        m_md5[3] == conv(val.d) )    {        return 0;    }        return -1;} //计算并比较文件的校验码 //m_md5是供应方提供的校验码 //file_name是本地文件路径static int check_download_file( const char* file_name, const MD5VAL *m_md5 ){    FILE* fp = NULL;        fp = fopen( file_name, "rb" );    if( fp != NULL )    {        if( CheckUpdateFileMD5(m_md5, fp) < 0 )        {            fclose(fp);            return RFAILED;        }        else        {            fclose(fp);            return ROK;        }    }    printf("ru_check_download_file: open file failed!\n");        return RFAILED;}

 

转载地址:http://izpja.baihongyu.com/

你可能感兴趣的文章
java中的多态案例
查看>>
javaIO流实现文件拷贝
查看>>
2015爱奇艺暑期实习生面试
查看>>
关于android屏幕适配的问题(drawable-xxxxxxxx,dp,sp,px等等),偶尔看到了android源代码,关于dpi的区分的值...
查看>>
Linux下安装过程中编译PHP时报错:configure: error: libjpeg.(a|so) not found
查看>>
苹果的编程语言--Swift
查看>>
js原生offsetParent解析
查看>>
Redis源代码分析(二十二)--- networking网络协议传输
查看>>
sql server 行转列解决方案
查看>>
装饰器原理与递归
查看>>
配置yum软件仓库(redhat 7.0)
查看>>
CTF 字符统计2
查看>>
UICollectionView详解
查看>>
Android学习笔记之Android Studio下创建menu布局文件
查看>>
ES集群安装
查看>>
fetch知识点汇总
查看>>
SuperSpider(简书爬虫JAVA版)
查看>>
c/c++中保留两位有效数字
查看>>
Solr工作原理
查看>>
JS_prettyBanner[说给自己听]
查看>>