[代码实例][C语言]计算文件的MD5值

C语言实现MD5计算 阅读详情
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>

#define BITS_PER_BYTE   8

#define GROUP_BITS      512
#define GROUP_SIZE      (GROUP_BITS / BITS_PER_BYTE)    // 64

#define SUBGROUPS_PER_GROUP 16
#define SUBGROUP_BITS       (GROUP_BITS / SUBGROUPS_PER_GROUP)  // 32
#define SUBGROUP_SIZE       (GROUP_SIZE / SUBGROUPS_PER_GROUP)  // 4

#define VAR_INPUT_LEN_SIZE  8

#define ROL(val,n)  (((val) << (n)) | ((val) >> (32 - (n))))
#define ABS(x)      ((x) >= 0 ? (x) : -(x))

#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 BUF_SIZE    1024
static unsigned char read_buf[BUF_SIZE + GROUP_SIZE] = {0};

static bool has_init_ti = false;

static unsigned int state_init[] = {
    0x67452301,
    0xEFCDAB89,
    0x98BADCFE,
    0x10325476
};

static unsigned int ti[64];
static unsigned int round_index[64];
static const unsigned int s[][4] = {
    {7, 12, 17, 22}, {7, 12, 17, 22}, {7, 12, 17, 22}, {7, 12, 17, 22}, 
    {5, 9, 14, 20}, {5, 9, 14, 20}, {5, 9, 14, 20}, {5, 9, 14, 20}, 
    {4, 11, 16, 23}, {4, 11, 16, 23}, {4, 11, 16, 23}, {4, 11, 16, 23}, 
    {6, 10, 15, 21}, {6, 10, 15, 21}, {6, 10, 15, 21}, {6, 10, 15, 21}
};

static int add_bits(unsigned char * buf, size_t src_len);
static void transform(unsigned char sub_group[SUBGROUPS_PER_GROUP][SUBGROUP_SIZE], unsigned int * state);
char * md54file(const char * filename, char * md5str, bool isupper);
static void md5init(void);

int main(int argc, char * argv[])
{
    char md5str[33] = {0};

    if(argc == 1)
    {
        printf("Usage: %s <filename>\n", argv[0]);
        return EXIT_SUCCESS;
    }

    for(int i = 1; i < argc; i++)
    {
        if(md54file(argv[i], md5str, false))
            printf("%s  %s\n", md5str, argv[i]);
    }

    return EXIT_SUCCESS;
}

static void md5init(void)
{
    if(!has_init_ti)
    {
        for(int i = 0; i < 64; i++)
            ti[i] = (1UL << 32) * ABS(sin(i + 1));
        has_init_ti = true;
    }

}

char * md54file(const char * filename, char * md5str, bool isupper)
{
    unsigned char * group_start = NULL;
    size_t dest_len = 0;
    unsigned char sub_group[SUBGROUPS_PER_GROUP][SUBGROUP_SIZE] = {0};
    unsigned int state[4] = {0};
    unsigned char * pstate = (unsigned char *)state;
    char * poutput = md5str;

    md5init();

    FILE * fp;
    size_t count;

    if((fp = fopen(filename, "r")) == NULL)
    {
        perror("fopen");
        return NULL;
    }

    memcpy(state, state_init, sizeof(int) * 4);

    memset(read_buf, 0, BUF_SIZE + GROUP_SIZE);
    while((count = fread(read_buf, 1, BUF_SIZE, fp)) > 0)
    {
        dest_len += count;
        group_start = read_buf;
        for(int i = 0;
            i < count / GROUP_SIZE;
            i++, group_start += GROUP_SIZE)
        {
            memcpy((unsigned char *)sub_group, group_start, GROUP_SIZE);
            transform(sub_group, state);
        }

        if(count % GROUP_SIZE != 0)
        {
            count %= GROUP_SIZE;
            break;
        }

        memset(read_buf, 0, BUF_SIZE);
    }
    if(ferror(fp))
    {
        perror("fread");
        return NULL;
    }
    else if(feof(fp))
    {
        int times = 0;
        if(count == 0)
        {
            memset(read_buf, 0, BUF_SIZE);
            group_start = read_buf;
        }
        else
            memset(group_start + count, 0, GROUP_SIZE - count);
        times = add_bits(group_start, dest_len);

        for(int i = 0; i < times; i++)
        {
            memcpy((unsigned char *)sub_group, group_start, GROUP_SIZE);
            transform(sub_group, state);
            group_start += GROUP_SIZE;
        }
    }

    if(fclose(fp) != 0)
    {
        perror("fclose");
        return NULL;
    }

    for(int i = 0; i < 16; i++)
    {
        if(isupper)
            snprintf(poutput, 3, "%02X", *pstate);
        else
            snprintf(poutput, 3, "%02x", *pstate);
        poutput += 2;
        pstate++;
    }

    return md5str;
}

static int add_bits(unsigned char * buf, size_t src_len)
{
    size_t current_len;
    size_t rest_len;
    size_t dest_len;
    unsigned char * dest;
    int times = 1;

    current_len = src_len % GROUP_SIZE;
    if(current_len == 0)
        dest_len = GROUP_SIZE;
    else
        dest_len = (current_len + GROUP_SIZE - 1) / GROUP_SIZE * GROUP_SIZE;
    rest_len = GROUP_SIZE - current_len % GROUP_SIZE;

    if(rest_len <= VAR_INPUT_LEN_SIZE)
    {
        dest_len += GROUP_SIZE;
        memset(read_buf + BUF_SIZE, 0, GROUP_SIZE);
        times++;
    }

    buf[current_len] = 0x80;
    *(unsigned long long *)(buf + dest_len - VAR_INPUT_LEN_SIZE) = (unsigned long long)src_len * BITS_PER_BYTE;

    return times;
}

/*
 * transform: 转换分组
 */
static void transform(unsigned char sub_group[SUBGROUPS_PER_GROUP][SUBGROUP_SIZE], unsigned int * state)
{
    unsigned int a;
    unsigned int b;
    unsigned int c;
    unsigned int d;
    unsigned int tmp;

    unsigned int result, index;

    a = state[0];
    b = state[1];
    c = state[2];
    d = state[3];

    for(int i = 0; i < 64; i++)
    {
        if(i < 16)
        {
            result = F(b, c, d);
            index = i;
        }
        else if(i < 32)
        {
            result = G(b, c, d);
            index = (5 * i + 1) % 16;
        }
        else if(i < 48)
        {
            result = H(b, c, d);
            index = (3 * i + 5) % 16;
        }
        else
        {
            result = I(b, c, d);
            index = (7 * i) % 16;
        }

        tmp = d;
        d = c;
        c = b;
        b = b + ROL(
                    a + result + *(unsigned int *)&sub_group[index] + ti[i],
                    *((const unsigned int *)s + i));
        a = tmp;
    }

    state[0] += a;
    state[1] += b;
    state[2] += c;
    state[3] += d;
}
c 获取文件 MD5 值 网上有 md5.c , md5.h, 但是里面只有 MD5Init(), MD5Update(), MD5Final() 三个函数,  只可以直接对字符进行操作, 而没有直接求文件md5的接口. 以下是我的实现, 可计算32位和16位的md5值. /*********************************************************************** 阅读详情

相关推荐

C语言实现计算文件和字符串md5值

一、命令介绍         下面的源码md5.c,通过gcc编译后,就可得到一个md5的二进制命令,通过该命令可以计算某文件或字符串的md5值。         命令格式为:         md5 -E [Encode Type] -S [Encode Source]         如:md5 -E file -S  “tmp/img.bin”” 二、md5.c源文件:

u013485792的专栏 4993

【MD5算法_C语言实现】

Message Digest Algorithm 消息摘要算法: 5表示第5版 算法的文件号为RFC 1321 本质: 算法不可逆 不同的数据可能会生成相同的一串 有破解之道,比如穷举法,暴力破解。 根据生成的数据串,在数据库中找生成他的数据数据库是在时时刻刻的收集枚举各种数据组合。 应用:比如登录密码 本地注册时填入密码,本地将密码转成md5串,传输给服务器,服务器存的密码就是md5串。中途被坏人劫走的密码,劫走的只是md5串,而不是密码本身,这也是一种保护。 很多验证都应用的md5 ...

Sugar_wolf的博客 6226

MD5之C语言源代码

带密钥的md5算法库md5lib.h共有下列函数: char* MDString  (char *);/*输入任意一个字符串,经过md5算法处理后,返回结果:一个定长(32个字符)字符串 */char* MDFile  (char *);/*输入任意一个文件名,文件内容经过md5算法处理后,返回结果:一个定长(32个字符)字符串 */char* hmac_md5(char* text, char*

二氧化鬼的专栏 3246

大文件MD5计算 C语言 (从OpenSSL库中分离算法:三)

从OpenSSL库中分离算法-MD5算法-大文件MD5计算 续上述博客 小文件计算MD5时,可以把文件数据一次性都读到内存中计算,但当文件很大时,将文件一次性读到内存中是不可行的,此时,需要对文件数据分块进行MD5计算。具体方法如下: 跳转到实操视频 C语言计算大文件MD5 #include <iostream> #include "md5/md5.h" #define B

逆光倾城的博客 3041

易语言实现获取文件MD5值的源码教程

易语言以其简洁的中文关键字、结构化的编程方式和对常用API的封装,在中文编程社区中占据了一席之地。自2000年推出以来,它不断迭代更新,提供了丰富的模块支持,包括但不限于图形用户界面(GUI)设计、网络编程、文件操作等。易语言最显著的特点是它对中文的支持,这降低了初学者接触编程的门槛,使得中文用户可以快速上手。同时,易语言也支持面向对象编程、事件驱动等现代编程范式,让开发者可以构建结构更加复杂的应用程序。

weixin_28913879的博客 971

易语言实现文件MD5值计算完整例程

易语言是一款专为中文用户设计的可视化编程语言,以其简单易懂的语法和强大的界面控件库,成为众多编程初学者的理想入门工具。其集成开发环境(IDE)提供了拖放式控件布局、事件驱动编程模型,极大降低了编程门槛。本章将从零开始,介绍易语言的开发环境搭建流程、基本语法结构以及常用控件的使用方法。通过简单的示例程序演示,帮助读者熟悉编程逻辑与界面设计,为后续实现文件MD5值计算功能打下坚实基础。MD5算法处理数据的过程分为以下几个步骤:填充消息。

weixin_36149538的博客 1230

MD5算法的C语言实现

算法原理概述 MD5信息摘要算法,( Message-Digest Algorithm 5),是一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值,用于确保信息传输完整一致。 MD5算法使用little-endian(小端模式,即低位字节存在内存低地址),输入任意不定长度信息,算法都首先将其以512-bit进行分组(不足补位),每个512-bit的分组都和四个32-bit的数...

White3zz的博客 2867

AstrBot插件开发全攻略:从零编写一个天气查询插件(Python实战)

本文提供了一份详细的AstrBot插件开发实战指南,手把手教你使用Python从零编写一个智能天气查询插件。内容涵盖插件系统核心设计、开发环境搭建、API调用与数据处理、自然语言交互实现以及插件打包发布全流程,帮助你快速掌握基于AstrBot框架的聊天机器人功能扩展技能。

weixin_29212867的博客 1083

C语言实例_获取文件MD5值

MD5(Message Digest Algorithm 5)是一种常用的哈希函数算法。将任意长度的数据作为输入,并生成一个唯一的、固定长度(通常是128位)的哈希值,称为MD5值。MD5算法以其高度可靠性和广泛应用而闻名。

3450

Blender软件导出地形到Gazebo中

Blender软件导出地形到Gazebo中,并配置纹理、刚度、高度。

m0_70652514的博客 3376

IPD流程中CBB管理的5个致命误区,第3个坑了80%的团队

本文深入剖析了IPD流程中CBB管理的五个致命误区,尤其指出缺乏有效的度量与激励机制是影响80%团队的核心陷阱。文章强调CBB的核心在于前瞻性设计,而非简单归档,并需平衡通用性与产品竞争力,同时建立持续运营机制,确保CBB与市场需求对齐,从而真正实现缩短开发周期、降低成本的目标。

weixin_29234423的博客 569

基于C语言实现的MD5算法

MD5 是标准的哈希算法。首先对数据进行分块:每 512 位(64 字节)为一个块,并对最后一个块进行填充,并最后再存储数据长度 K(位)。分块完成后对每个 512 位块Yi​和上一个块的 128 位计算结果CVi−1​计算HMD5​压缩函数的 128 位函数值CVi​。最后的CVl​即为该数据的 MD5 哈希值。HMD5​压缩函数从 $CV_i $ 输入128 位,执行 4 轮操作,每轮选用不同的生成函数FGHI,结合指定的常数表T。

毕业作品网站 3343

Unity3D 2022版如何一键安装Newtonsoft.Json?最新Package Manager教程

本文详细介绍了在Unity3D 2022及以上版本中,如何通过Package Manager一键安装和配置Newtonsoft.Json(Json.NET)。教程涵盖了从打开Package Manager、搜索并安装正确包源,到验证安装和基础使用的完整流程,旨在帮助开发者以现代化、可靠的方式集成这一强大的JSON处理框架,提升开发效率并规避手动导入的常见问题。

lg888的博客 921

md5c语言程序代码,[代码实例][C语言]计算文件的MD5值

#include #include #include #include #include #define BITS_PER_BYTE 8#define GROUP_BITS 512#define GROUP_SIZE (GROUP_BITS / BITS_PER_BYTE) // 64#define SUBGROUPS_PER_GROUP 16#define SUBGROUP_BITS (GROU...

weixin_42309773的博客 221

MATLAB使用贝叶斯网络bnt工具箱:使用手册详解

MATLAB使用贝叶斯bnt网络工具箱:使用手册详解

WW、forever的博客 2676

在Allegro设计界面中如何修改封装焊盘

在高密度板的情况下,SUIPLA(支持内层没有的焊盘摘掉)打勾,在高密度板的情况下,内层没有的焊盘摘掉可以增加走线的空间。3、修改完焊盘后,选择File→Update to Design(更新到设计)。然后关闭焊盘修改对话框即可。,将会定期不定期更新技术文章,互相学习交流。或者点击Options选项卡下要修改的焊盘,然后点击Edit修改。在Allegro PCB设计界面中修改封装焊盘的方法。2、然后点击封装上要修改的焊盘,右击选择Edit。修改完成后如下图所示。

bhxc809751502的博客 7806

pwnable-collision

question Daddy told me about cool MD5 hash collision today. I wanna do something like that too! ssh col@pwnable.kr -p2222 (pw:guest) solution 连上ssh后,查看根目录文件发现存在col.c,col,flag三个文件,显然flag是需要获取的内容 通过ls -la查看文件权限 发现当前用户没有权限查看flag文件 分析col.c文件 #include <stdi

perye 654

成本中心(CO)和利润中心(PCA)是管理会计模块的核心组件

SAP中成本中心(CO)和利润中心(PCA)凭证处理存在差异:①外部交易(如费用支付、销售)会生成FI借贷凭证;②内部成本分摊和转移仅产生CO/PCA管理凭证,通过次级成本要素或利润中心转移科目记录,不涉及FI模块。核心区别在于是否涉及企业实际收支:实际收支触发FI凭证,内部核算仅生成管理会计凭证。系统通过这种机制实现财务会计与管理会计的集成与分离。

金牌架构师 1127

C语言获取文件MD5值

C语言获取文件MD5值 D5(Message Digest Algorithm 5)是一种常用的哈希函数算法。将任意长度的数据作为输入,并生成一个唯一的、固定长度(通常是128位)的哈希值,称为MD5值。MD5算法以其高度可靠性和广泛应用而闻名。 MD5算法主要具备以下特点: (1)不可逆性:给定MD5值无法通过逆运算得到原始数据。 (2)唯一性:不同的输入数据会生成不同的MD5值。 (3)高效性:对于给定的数据,计算其MD5值是非常快速的。

热土程序园,利他愉己~ 1944

Python 爬虫实战:爬取国家统计局公开数据

国家统计局作为权威的宏观经济数据发布机构,汇聚了人口、GDP、就业、产业经济等多维度的核心统计数据,是开展经济研究、政策分析、行业洞察的重要数据支撑。相较于商业数据平台,国家统计局的公开数据具备权威性、全面性和时效性等特点,但部分数据分散在不同栏目且缺乏结构化下载渠道。本文基于 Python 爬虫技术,系统讲解国家统计局公开数据的爬取方法,重点解决静态表格解析、分页数据抓取、数据结构化转换等问题,同时严格遵循政府网站数据使用规范,为科研、教学等场景提供合规的数据获取方案。本文以国家统计局官网(

2503_91057718的博客 1818

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C计算文件的MD5值

filemd5.c文件 ​ #include<stdio.h> #include<string.h> #include<stdlib.h> #define F(x, y, z) (((x) & (y)) | ((~x) & (z))) #define G(x, y, z) (((x) & (z)) | ((y) & (~z)...

Cloudy_cn的专栏 2745

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C语言 计算文件md5值

#include<stdio.h> #include<string.h> #include<stdlib.h> #define F(x, y, z) (((x) & (y)) | ((~x) & (z))) #define G(x, y, z) (((x) & (z)) | ((y) & (~z))) #define H(x, ...

qq_42577465的博客 1082

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C语言求 MD5 值

C语言求 MD5 值

hinewcc的博客 2776

MD5加密算法(C语言实现,已编译,亲试可用~)

C语言实现MD5加密算法 本文有部分内容参考引用百度百科-MD5 。 MD5 MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。 MD5将任意长度的“字节串”变换成128位(4个32位)的大整数,它是一个不可逆的数据转换过程。 MD5算法步骤 步骤1:补位 将原始数据转换为2进制看,先在末尾补一个1,再补0,再补一个64位的原始数据

小肥丸 1万+

Linux下C语言计算文件的md5值(长度32)

google了好久都没有找到合适的,其实我只需要一个函数,能计算文件的 md5 值就好, 后来找到了 md5.h 和 md5.c 的源文件,仿照别人的封装了个函数(他那个有问题,和 md5sum 计算出来的都不一样)。 废话少说,直接贴代码: (再废一句话,如果只想计算字符串的md5值,把字符串传给 MD5Update 函数一次就好) #include "md5.h" #include

阿然的专栏 2万+
上一篇: [代码实例][Linux系统编程]遍历目录
下一篇: [系统操作][Linux]初始化当前Ubuntu为可开发环境
cloudblaze
博客等级 码龄17年 81粉丝 125原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值