#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,通过gcc编译后,就可得到一个md5的二进制命令,通过该命令可以计算某文件或字符串的md5值。 命令格式为: md5 -E [Encode Type] -S [Encode Source] 如:md5 -E file -S “tmp/img.bin”” 二、md5.c源文件:
【MD5算法_C语言实现】
Message Digest Algorithm 消息摘要算法: 5表示第5版 算法的文件号为RFC 1321 本质: 算法不可逆 不同的数据可能会生成相同的一串 有破解之道,比如穷举法,暴力破解。 根据生成的数据串,在数据库中找生成他的数据数据库是在时时刻刻的收集枚举各种数据组合。 应用:比如登录密码 本地注册时填入密码,本地将密码转成md5串,传输给服务器,服务器存的密码就是md5串。中途被坏人劫走的密码,劫走的只是md5串,而不是密码本身,这也是一种保护。 很多验证都应用的md5 ...
MD5之C语言源代码
带密钥的md5算法库md5lib.h共有下列函数: char* MDString (char *);/*输入任意一个字符串,经过md5算法处理后,返回结果:一个定长(32个字符)字符串 */char* MDFile (char *);/*输入任意一个文件名,文件内容经过md5算法处理后,返回结果:一个定长(32个字符)字符串 */char* hmac_md5(char* text, char*
大文件MD5计算 C语言 (从OpenSSL库中分离算法:三)
从OpenSSL库中分离算法-MD5算法-大文件MD5计算 续上述博客 小文件计算MD5时,可以把文件数据一次性都读到内存中计算,但当文件很大时,将文件一次性读到内存中是不可行的,此时,需要对文件数据分块进行MD5计算。具体方法如下: 跳转到实操视频 C语言计算大文件MD5 #include <iostream> #include "md5/md5.h" #define B
易语言实现获取文件MD5值的源码教程
易语言以其简洁的中文关键字、结构化的编程方式和对常用API的封装,在中文编程社区中占据了一席之地。自2000年推出以来,它不断迭代更新,提供了丰富的模块支持,包括但不限于图形用户界面(GUI)设计、网络编程、文件操作等。易语言最显著的特点是它对中文的支持,这降低了初学者接触编程的门槛,使得中文用户可以快速上手。同时,易语言也支持面向对象编程、事件驱动等现代编程范式,让开发者可以构建结构更加复杂的应用程序。
易语言实现文件MD5值计算完整例程
易语言是一款专为中文用户设计的可视化编程语言,以其简单易懂的语法和强大的界面控件库,成为众多编程初学者的理想入门工具。其集成开发环境(IDE)提供了拖放式控件布局、事件驱动编程模型,极大降低了编程门槛。本章将从零开始,介绍易语言的开发环境搭建流程、基本语法结构以及常用控件的使用方法。通过简单的示例程序演示,帮助读者熟悉编程逻辑与界面设计,为后续实现文件MD5值计算功能打下坚实基础。MD5算法处理数据的过程分为以下几个步骤:填充消息。
MD5算法的C语言实现
算法原理概述 MD5信息摘要算法,( Message-Digest Algorithm 5),是一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值,用于确保信息传输完整一致。 MD5算法使用little-endian(小端模式,即低位字节存在内存低地址),输入任意不定长度信息,算法都首先将其以512-bit进行分组(不足补位),每个512-bit的分组都和四个32-bit的数...
AstrBot插件开发全攻略:从零编写一个天气查询插件(Python实战)
本文提供了一份详细的AstrBot插件开发实战指南,手把手教你使用Python从零编写一个智能天气查询插件。内容涵盖插件系统核心设计、开发环境搭建、API调用与数据处理、自然语言交互实现以及插件打包发布全流程,帮助你快速掌握基于AstrBot框架的聊天机器人功能扩展技能。
C语言实例_获取文件MD5值
MD5(Message Digest Algorithm 5)是一种常用的哈希函数算法。将任意长度的数据作为输入,并生成一个唯一的、固定长度(通常是128位)的哈希值,称为MD5值。MD5算法以其高度可靠性和广泛应用而闻名。
Blender软件导出地形到Gazebo中
Blender软件导出地形到Gazebo中,并配置纹理、刚度、高度。
IPD流程中CBB管理的5个致命误区,第3个坑了80%的团队
本文深入剖析了IPD流程中CBB管理的五个致命误区,尤其指出缺乏有效的度量与激励机制是影响80%团队的核心陷阱。文章强调CBB的核心在于前瞻性设计,而非简单归档,并需平衡通用性与产品竞争力,同时建立持续运营机制,确保CBB与市场需求对齐,从而真正实现缩短开发周期、降低成本的目标。
基于C语言实现的MD5算法
MD5 是标准的哈希算法。首先对数据进行分块:每 512 位(64 字节)为一个块,并对最后一个块进行填充,并最后再存储数据长度 K(位)。分块完成后对每个 512 位块Yi和上一个块的 128 位计算结果CVi−1计算HMD5压缩函数的 128 位函数值CVi。最后的CVl即为该数据的 MD5 哈希值。HMD5压缩函数从 $CV_i $ 输入128 位,执行 4 轮操作,每轮选用不同的生成函数FGHI,结合指定的常数表T。
Unity3D 2022版如何一键安装Newtonsoft.Json?最新Package Manager教程
本文详细介绍了在Unity3D 2022及以上版本中,如何通过Package Manager一键安装和配置Newtonsoft.Json(Json.NET)。教程涵盖了从打开Package Manager、搜索并安装正确包源,到验证安装和基础使用的完整流程,旨在帮助开发者以现代化、可靠的方式集成这一强大的JSON处理框架,提升开发效率并规避手动导入的常见问题。
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...
MATLAB使用贝叶斯网络bnt工具箱:使用手册详解
MATLAB使用贝叶斯bnt网络工具箱:使用手册详解
在Allegro设计界面中如何修改封装焊盘
在高密度板的情况下,SUIPLA(支持内层没有的焊盘摘掉)打勾,在高密度板的情况下,内层没有的焊盘摘掉可以增加走线的空间。3、修改完焊盘后,选择File→Update to Design(更新到设计)。然后关闭焊盘修改对话框即可。,将会定期不定期更新技术文章,互相学习交流。或者点击Options选项卡下要修改的焊盘,然后点击Edit修改。在Allegro PCB设计界面中修改封装焊盘的方法。2、然后点击封装上要修改的焊盘,右击选择Edit。修改完成后如下图所示。
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
成本中心(CO)和利润中心(PCA)是管理会计模块的核心组件
SAP中成本中心(CO)和利润中心(PCA)凭证处理存在差异:①外部交易(如费用支付、销售)会生成FI借贷凭证;②内部成本分摊和转移仅产生CO/PCA管理凭证,通过次级成本要素或利润中心转移科目记录,不涉及FI模块。核心区别在于是否涉及企业实际收支:实际收支触发FI凭证,内部核算仅生成管理会计凭证。系统通过这种机制实现财务会计与管理会计的集成与分离。
C语言获取文件MD5值
C语言获取文件MD5值 D5(Message Digest Algorithm 5)是一种常用的哈希函数算法。将任意长度的数据作为输入,并生成一个唯一的、固定长度(通常是128位)的哈希值,称为MD5值。MD5算法以其高度可靠性和广泛应用而闻名。 MD5算法主要具备以下特点: (1)不可逆性:给定MD5值无法通过逆运算得到原始数据。 (2)唯一性:不同的输入数据会生成不同的MD5值。 (3)高效性:对于给定的数据,计算其MD5值是非常快速的。
Python 爬虫实战:爬取国家统计局公开数据
国家统计局作为权威的宏观经济数据发布机构,汇聚了人口、GDP、就业、产业经济等多维度的核心统计数据,是开展经济研究、政策分析、行业洞察的重要数据支撑。相较于商业数据平台,国家统计局的公开数据具备权威性、全面性和时效性等特点,但部分数据分散在不同栏目且缺乏结构化下载渠道。本文基于 Python 爬虫技术,系统讲解国家统计局公开数据的爬取方法,重点解决静态表格解析、分页数据抓取、数据结构化转换等问题,同时严格遵循政府网站数据使用规范,为科研、教学等场景提供合规的数据获取方案。本文以国家统计局官网(
蓝牙模块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)...
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, ...
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 值
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位的原始数据
Linux下C语言计算文件的md5值(长度32)
google了好久都没有找到合适的,其实我只需要一个函数,能计算文件的 md5 值就好, 后来找到了 md5.h 和 md5.c 的源文件,仿照别人的封装了个函数(他那个有问题,和 md5sum 计算出来的都不一样)。 废话少说,直接贴代码: (再废一句话,如果只想计算字符串的md5值,把字符串传给 MD5Update 函数一次就好) #include "md5.h" #include
4993



被折叠的 条评论
为什么被折叠?



