MD5校验及其c实现

那么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<co;j+=64)
        {
            x=(unsigned int *)(buf+j);
            // Save the values
            aa=*a; bb=*b; cc=*c; dd=*d;
            // Round 1
            FF (*a, *b, *c, *d, x[ 0], S11, 0xd76aa478); /* 1 */
            FF (*d, *a, *b, *c, x[ 1], S12, 0xe8c7b756); /* 2 */
            FF (*c, *d, *a, *b, x[ 2], S13, 0x242070db); /* 3 */
            FF (*b, *c, *d, *a, x[ 3], S14, 0xc1bdceee); /* 4 */
            FF (*a, *b, *c, *d, x[ 4], S11, 0xf57c0faf); /* 5 */
            FF (*d, *a, *b, *c, x[ 5], S12, 0x4787c62a); /* 6 */
            FF (*c, *d, *a, *b, x[ 6], S13, 0xa8304613); /* 7 */
            FF (*b, *c, *d, *a, x[ 7], S14, 0xfd469501); /* 8 */
            FF (*a, *b, *c, *d, x[ 8], S11, 0x698098d8); /* 9 */
            FF (*d, *a, *b, *c, x[ 9], S12, 0x8b44f7af); /* 10 */
            FF (*c, *d, *a, *b, x[10], S13, 0xffff5bb1); /* 11 */
            FF (*b, *c, *d, *a, x[11], S14, 0x895cd7be); /* 12 */
            FF (*a, *b, *c, *d, x[12], S11, 0x6b901122); /* 13 */
            FF (*d, *a, *b, *c, x[13], S12, 0xfd987193); /* 14 */
            FF (*c, *d, *a, *b, x[14], S13, 0xa679438e); /* 15 */
            FF (*b, *c, *d, *a, x[15], S14, 0x49b40821); /* 16 */
            // Round 2
            GG (*a, *b, *c, *d, x[ 1], S21, 0xf61e2562); /* 17 */
            GG (*d, *a, *b, *c, x[ 6], S22, 0xc040b340); /* 18 */
            GG (*c, *d, *a, *b, x[11], S23, 0x265e5a51); /* 19 */
            GG (*b, *c, *d, *a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
            GG (*a, *b, *c, *d, x[ 5], S21, 0xd62f105d); /* 21 */
            GG (*d, *a, *b, *c, x[10], S22,  0x2441453); /* 22 */
            GG (*c, *d, *a, *b, x[15], S23, 0xd8a1e681); /* 23 */
            GG (*b, *c, *d, *a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
            GG (*a, *b, *c, *d, x[ 9], S21, 0x21e1cde6); /* 25 */
            GG (*d, *a, *b, *c, x[14], S22, 0xc33707d6); /* 26 */
            GG (*c, *d, *a, *b, x[ 3], S23, 0xf4d50d87); /* 27 */
            GG (*b, *c, *d, *a, x[ 8], S24, 0x455a14ed); /* 28 */
            GG (*a, *b, *c, *d, x[13], S21, 0xa9e3e905); /* 29 */
            GG (*d, *a, *b, *c, x[ 2], S22, 0xfcefa3f8); /* 30 */
            GG (*c, *d, *a, *b, x[ 7], S23, 0x676f02d9); /* 31 */
            GG (*b, *c, *d, *a, x[12], S24, 0x8d2a4c8a); /* 32 */
            // Round 3
            HH (*a, *b, *c, *d, x[ 5], S31, 0xfffa3942); /* 33 */
            HH (*d, *a, *b, *c, x[ 8], S32, 0x8771f681); /* 34 */
            HH (*c, *d, *a, *b, x[11], S33, 0x6d9d6122); /* 35 */
            HH (*b, *c, *d, *a, x[14], S34, 0xfde5380c); /* 36 */
            HH (*a, *b, *c, *d, x[ 1], S31, 0xa4beea44); /* 37 */
            HH (*d, *a, *b, *c, x[ 4], S32, 0x4bdecfa9); /* 38 */
            HH (*c, *d, *a, *b, x[ 7], S33, 0xf6bb4b60); /* 39 */
            HH (*b, *c, *d, *a, x[10], S34, 0xbebfbc70); /* 40 */
            HH (*a, *b, *c, *d, x[13], S31, 0x289b7ec6); /* 41 */
            HH (*d, *a, *b, *c, x[ 0], S32, 0xeaa127fa); /* 42 */
            HH (*c, *d, *a, *b, x[ 3], S33, 0xd4ef3085); /* 43 */
            HH (*b, *c, *d, *a, x[ 6], S34,  0x4881d05); /* 44 */
            HH (*a, *b, *c, *d, x[ 9], S31, 0xd9d4d039); /* 45 */
            HH (*d, *a, *b, *c, x[12], S32, 0xe6db99e5); /* 46 */
            HH (*c, *d, *a, *b, x[15], S33, 0x1fa27cf8); /* 47 */
            HH (*b, *c, *d, *a, x[ 2], S34, 0xc4ac5665); /* 48 */
            // Round 4 */
            II (*a, *b, *c, *d, x[ 0], S41, 0xf4292244); /* 49 */
            II (*d, *a, *b, *c, x[ 7], S42, 0x432aff97); /* 50 */
            II (*c, *d, *a, *b, x[14], S43, 0xab9423a7); /* 51 */
            II (*b, *c, *d, *a, x[ 5], S44, 0xfc93a039); /* 52 */
            II (*a, *b, *c, *d, x[12], S41, 0x655b59c3); /* 53 */
            II (*d, *a, *b, *c, x[ 3], S42, 0x8f0ccc92); /* 54 */
            II (*c, *d, *a, *b, x[10], S43, 0xffeff47d); /* 55 */
            II (*b, *c, *d, *a, x[ 1], S44, 0x85845dd1); /* 56 */
            II (*a, *b, *c, *d, x[ 8], S41, 0x6fa87e4f); /* 57 */
            II (*d, *a, *b, *c, x[15], S42, 0xfe2ce6e0); /* 58 */
            II (*c, *d, *a, *b, x[ 6], S43, 0xa3014314); /* 59 */
            II (*b, *c, *d, *a, x[13], S44, 0x4e0811a1); /* 60 */
            II (*a, *b, *c, *d, x[ 4], S41, 0xf7537e82); /* 61 */
            II (*d, *a, *b, *c, x[11], S42, 0xbd3af235); /* 62 */
            II (*c, *d, *a, *b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
            II (*b, *c, *d, *a, x[ 9], S44, 0xeb86d391); /* 64 */
            // Add the original values
            *a+=aa;
            *b+=bb;
            *c+=cc;
            *d+=dd;
        }

    } while(count==BUFFER_SIZE);

    return val;
}

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

//Endian convert: big <-> little
unsigned 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;
}
时间: 2024-08-07 06:15:21

MD5校验及其c实现的相关文章

Hash(MD5校验工具)

本站提供md5校验工具下载.Hash(md5校验工具)是一款小巧好用的哈希计算器,Hash支持文件拖放,速度很快,可以计算文件的MD5.SHA1.CRC32 的值.在论坛上.软件发布时经常用Hash md5校验工具,是为了保证文件的正确性,防止一些人盗用程序,加些木马或者篡改版权,设计的一套验证系统.每个文件都可以用Hash验证程序算出一个固定的MD5码来. Hash md5是一款小巧好用的哈希计算器,也是一款md5校验工具.支持文件拖放,速度很快,可以计算文件的 MD5.SHA1.CRC32

python tkinter 文件MD5校验工具

使用Python 2.7.10 tkinter 进行编写的"文件md5校验工具".由于自己的水平问题,可能会存在一些错误,恳请大家指正,谢谢. 图形界面: 源码: #coding: UTF-8 #python tkinter 文件MD5校验 #环境 Python 2.7.10  import Tkinter as tk import hashlib import  os import tkFileDialog as tkf def view_md5():  #计算结果显示方法     

文件夹进行MD5校验的实现算法

每份相同数据(文件夹)都可以生成一份唯一的md5校验文件,我们可以通过直接校验整个数据文件夹的方法来确定数据是否有误. 1.针对整个文件夹生成md5校验文件方法: 以data文件夹为例,我们需要得到data整个文件夹中的文件的md5校验值,我们通过shell程序对整个data文件夹中的文件进行md5校验. 通过如下命令获得整个data文件夹的md5校验文件: 1 cd data 2 find ./ -type f -print0 | xargs md5sum > data_temp.md5 3

Java 获取 文件md5校验码

讯雷下载的核心思想是校验文件的md5值,两个文件若md5相同则为同一文件. 当得到用户下载某个文件的请求后它根据数据库中保留的文件md5比对出拥有此文件的url, 将用户请求挂接到此url上并仿造一个虚假的断点续传请求,从若干url上将一个正常文件拼接出来. 查了下资料,java也可以实现文件md5校验码获取,代码如下: import java.io.File;import java.io.FileInputStream;import java.io.IOException;import jav

Java 自带MD5 校验文件

http://www.iteye.com/topic/1127319 前天第一次发表博客到论坛,关于Java文件监控一文,帖子地址在:http://www.iteye.com/topic/1127281 评论的朋友很多,下载代码的朋友很不少,感谢在论坛上看我帖子的朋友,还有回复评论的朋友,给我提供建议的朋友. 从这些建议中,虽然语言简短,但是却有的是一语中的,这里说一下一下关于帖子的代码中HashFile中的MD5文件校验算法, 该算法是使用Java自带的MessageDigest类,测试结果,

自动校验文件夹及其内容shell程序(md5 校验文件夹中所有数据)

一.问题的来源有时候copy一些重要的数据,得到之后需要与原数据进行核对是否数据一致.这就需要进行校验. 二.问题的分析校验数据有多种方法,最简单的是使用文件的md5码进行校验.但是文件很多,手动的每个文件进行md5校验显然不合适,这就需要编写shell程序解决. 三.问题的解决通过shell程序解决文件校验问题1.通过命令得到文件md5值比如得到的数据文件夹为 data 文件夹则在data 文件夹中输入以下命令 find  ./ -type f  -print | xargs md5sum  

Shell 对整个文件夹中的文件进行MD5校验 [转]

查看本地文件的 MD5 命令:md5sum FileName查看home目录下所有文件的 MD5 码:cd ~find /home -type f -print0 | xargs -0 md5sum | sort >md5.txt查看当前目录下所有文件的 MD5 码:find ./ -type f -print0 | xargs -0 md5sum | sort >md5.txt 通过上述方法对 home 文件夹里数据生成一份 md5 校验文件这个 md5 文件就这可作为这个 home 文件夹

阿里云自定义监控-系统文件MD5校验

1.文件md5校验hashlib模块 hashlib.md5() 2.文件比对模块filecmp模块 filecmp.cmp('md5File', 'md5File_new'): ##文件一直返回True 不一致返回False 3.打开文件操作with open ..... as f: ##不用close关闭文件 4.格式化字符串输出tring = "%s %s\n" % (md5.hexdigest(),line.strip()) 脚本示例: #!/usr/bin/python #

java生成MD5校验码

在Java中,java.security.MessageDigest (rt.jar中)已经定义了 MD5 的计算,所以我们只需要简单地调用即可得到 MD5 的128 位整数.然后将此 128 位计 16 个字节转换成 16 进制表示即可. 下面是一个可生成字符串或文件MD5校验码的例子,测试过,可当做工具类直接使用,其中最主要的是getMD5String(String s)和getFileMD5String(File file)两个方法,分别用于生成字符串的md5校验值和生成文件的md5校验值