[代码实例][Linux系统编程]遍历目录并且输出目录下文件MD5值

对.dat文件进行MD5哈希计算 对.dat文件进行MD5哈希计算以及MD5哈希计算本身的含义就介绍到这里。总结来看,MD5哈希计算主要用于验证数据的完整性和一致性,保护信息不被篡改,并且在密码存储和数字签名等场合提高安全性。尽管MD5现如今已不再适用于那些需要高等级加密的场合,但在某些非安全敏感的场景中,它仍然因其计算速度快而被广泛使用。在Windows操作系统的命令提示符(CMD)下,使用命令来处理文件。文件进行MD5哈希计算,用于验证文件完整性或作为某种形式的数据审计。总的来说,图片中记录的是一系列的文件处理操作,特别是对。 阅读详情

main.c:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <errno.h>

#include <limits.h>
#include <dirent.h>


#define MIN(x,y)    (((x) < (y)) ? (x) : (y))

#define IS_APATH(p)  (*(p) == '/')
#define IS_RPATH(p)  (!(IS_APATH(p)))

char * md54file(const char * filename, char * md5str, bool isupper);

void calculate_files(const char * dir_path);

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

    if((argc == 2 && strcmp(argv[1], "--help") == 0)
        || argc != 2)
    {
        printf("Usage: %s <path>\n", argv[0]);
        return EXIT_SUCCESS;
    }

    if(strlen(argv[1]) >= PATH_MAX)
    {
        fprintf(stderr, "Path length is too long!\n");
        return EXIT_FAILURE;
    }

    if(IS_RPATH(argv[1]))
        realpath(argv[1], path);
    else
        strncpy(path, argv[1], PATH_MAX);

    calculate_files(path);

    return EXIT_SUCCESS;
}

void calculate_files(const char * dir_path)
{
    DIR * dirp;
    struct dirent * dp;
    bool is_root;
    char path[PATH_MAX] = {0};
    char md5str[33] = {0};

    is_root = strcmp(dir_path, "/") == 0;

    if((dirp = opendir(dir_path)) == NULL)
    {
        perror("opendir");
        return;
    }

    while(true)
    {
        errno = 0;
        if((dp = readdir(dirp)) == NULL)
            break;

        if(strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0)
            continue;


        snprintf(path, PATH_MAX, "%s/%s", (is_root ? "" : dir_path), dp->d_name);
        if(dp->d_type == DT_DIR)
            calculate_files(path);
        else if(dp->d_type == DT_REG)
        {
            if(md54file(path, md5str, false))
                printf("%s  %s\n", md5str, path);
        }
    }

    if(closedir(dirp) != 0)
    {
        perror("closedir");
        return;
    }
}

md54file.c:

#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);

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;
}

Makefile:

all: md54file

md54file: main.c md54file.c
    gcc $^ -o $@ -g -lm
基于51单片机扫地机器人(全套Proteus仿真+原理图+程序+说明书) (内含源程序代码,原理图,仿真,讲解视频,元件清单等,【精品】值得推荐!!!扫地机器人是以单片机为主控制器。通过单片机控制小车行驶、除尘、蜂鸣。扫地机器人使用双电机驱动,以提高整车运动的平稳性;在智能车进驶过程中,采用双超声波模块实现避障。 阅读详情

相关推荐

国产FPGA开发实战:紫光同创编程软件中的约束文件详解与常见问题

本文详细解析了紫光同创FPGA编程软件中约束文件的关键配置技巧与常见问题。通过基础架构解析、时钟约束实践、物理约束调控及典型问题排查指南,帮助开发者高效掌握国产FPGA开发中的约束文件应用,提升开发效率与设计稳定性。

gin88的博客 909

【MD5算法_C语言实现】

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

Sugar_wolf的博客 6227

开发基于GDL235KBQ6开发板的IAP升级程序(HEX协议+串口空闲中断 + DMA接收数据)

使用GDL235kB开发板,实现串口iap升级程序的bootloader代码编写,app为led灯闪烁,并完成通信c代码

zhaozijuncc的博客 645

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

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

逆光倾城的博客 3041

五子棋AI算法第一篇-我对谷歌Alphago的看法

最近Google宣布他们的围棋AI以5:0的战绩打败欧洲围棋三冠王。我一直对人工智能比较感兴趣,正好趁年前空闲的几天用JS写了一个五子棋的AI。其实很久以前就用自创的算法写过一个JAVA版的五子棋AI,不过棋力很不理想。这次用的是JS写的,所以无论任何平台上只要能打开网页的都可以玩。google爆出这个新闻之后,很多人觉得这是不是意味着电脑智商已经在人类之上了,围棋已经没有意义了之类的。甚至觉得这是

言川的博客 2万+

【100%通过率】华为OD机试真题 JavaScript【数字最低位排序】【最低位排序】

2023华为OD机试真题 JavaScript【数字最低位排序】【最低位排序】 给定一个非空数组(列表) 起元素数据类型为整型 请按照数组元素十进制最低位从小到大进行排序 十进制最低位相同的元素,相对位置保持不变 当数组元素为负值时,十进制最低为等同于去除符号位后对应十进制值最低位

MISAYAONE的博客 587

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

此算法有个BUG#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_

火云的专栏 3491

C#中通过Mapster实现轻量级高效对象映射器:从零到精通

本文介绍了.NET生态中高性能对象映射库Mapster的完整使用指南。从基础安装(通过NuGet包)到快速入门示例,展示了如何实现简单对象映射。进一步讲解了自定义映射规则、命名不一致属性的处理方式,以及如何在ASP.NET Core中集成Mapster服务。针对复杂场景,详细解析了嵌套对象映射的配置技巧,并提供了性能优化方案(如预编译映射器)和调试技巧(启用调试模式、捕获映射异常)。通过完整的代码实践,帮助开发者高效解决从基础到高级的对象映射需求。

墨夶的博客 742

MD5算法的C语言实现

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

White3zz的博客 2868

Buck电源设计常见的一些问题(一)半桥栅极驱动芯片共性失效问题

半桥驱动芯片主要用在器件可应用于电信,数据通信,便携式存储或更低电压系统中的电源转换器,半桥、全桥、推挽、同步降压,正激变换器和同步整流器等方面。当然难免会遇到不少问题。基本上我们在产品开发的过程中都遇到过栅极驱动芯片坏掉的情况,所以找了一些资料,学习学习。也查找查找原因。

小幽余生不加糖 2369

【红外技术】DDE算法:HE在红外图像可视化上的应用(附源码)

并且数据一般是以 8 的整数倍的位宽在电子系统中应用,因此大多数的显示器的显示位宽为 8bit,共 256 个灰阶。为了使红外图像可视化,因此需要一种“数据压缩”技术,还需要既可能的不丢失原始图像信息。HE后的图像直方图分布比较均匀离散,图像对比度好。但是HE算法只是适用某些图像,它是将灰度集中区域进行拉伸得到,也会放大该集中区域的噪声,它是一种“不公平”的映射。以下是红外细节增强算法的演示,很明显右边的图像,展现了更多的图像细节,对于小目标的观测非常友好。文章已于2019-12-02修改。

sunwindl91181的博客 911

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

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

3450

VTK 显示大量点云数据及交互(点云拾取、着色、测量等)功能

VTK (Visualization Toolkit) 是一个强大的开源可视化库,非常适合处理点云数据。下面将介绍如何使用 VTK 显示大量点云数据,并实现点云拾取、着色、测量等功能。

深之JohnChen的专栏 1996

获得文件MD5——校验完整性 & window 和 Linux下操作

1.Windows 10 自带了一个命令行程序 certutil可以 获取文件的 MD5 值; 2.Linux下md5sum命令获得文件MD5值;

Arya的博客,专注后端领域 4万+

SAP B1中文培訓教材_SDK

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Linux杂项:遍历指定目录计算文件的md5并输出到文件

随着自己工作的进行,接触到的技术栈也越来越多。给我一个很直观的感受就是,某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了,只有经常会用到的东西才有可能真正记下来。存在很多在特殊情况下有一点用处的技巧,用的不多的技巧可能一个星期就忘了。想了很久想通过一些手段把这些事情记录下来。也尝试过在书上记笔记,这也只是一时的,书不在手边的时候那些笔记就和没记一样,不是很方便。

嵌入山脊的博客 2815

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

linux 生成文件的md5,Linux下计算文件的MD5值

#!/usr/bin/perluse Digest::MD5;use File::Find;# 2012-11-24 22:41 Leo chanyipiaomiao@163.com# Blog:http://linux5588.blog.51cto.com#用法提示$usage = "Usage: scriptname -p | Directory1 ... | File1 ... | -c M...

weixin_29997937的博客 1030

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

shell脚本-批量获取目录下所有文件的md5值、大小、inode值

MD5的全称是Message-Digest Algorithm 5,它一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5值等同于文件的ID,它的值是唯一的。如果文件已被修改,其MD5值将发生变化。

我希望你能在这找到对你有帮助的东西,这可不仅仅是一个博客呢~ 4139

linux程序计算文件md5,Linux下计算文件的MD5值

脚本功能脚本使用Perl编写,计算文件的MD5值脚本用途服务器在安装完操作系统后,计算PATH变量里面所有的二进制文件的MD5、计算单个文件MD5值、计算某个目录(包括子目录)下所有的文件的MD5值记录到文件,等日后再生成一份,然后2份文件进行对比,即可知道这些文件是否又被改动过.脚本用法(5种用法)脚本名 -p [ > 输出的文件名] ← 该功能是计算...

weixin_39877166的博客 458

linux计算路径名md5,Linux下计算文件的MD5值

#!/usr/bin/perluse Digest::MD5;use File::Find;# 2012-11-24 22:41 Leo chanyipiaomiao@163.com# Blog:http://linux5588.blog.51cto.com#用法提示$usage="Usage:scriptname-p|Directory1...|File1...|-cM...

weixin_30110807的博客 339

Linux命令之校验目录md5deep

`md5deep` 命令比 `md5sum` 功能更加丰富,可以递归检查整个目录树。即计算每一个目录中的文件,为每个子目录中的每个文件生成 MD5 值。

二木成林 2439

文件 md5去重 linux,对比文件md5值实现去重文件

python检测文件的MD5值MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2、MD3和MD4发展而来。MD5算法的使用不需要支付任何版权费用。每个文件都会有一个MD5的加密值,这个值来唯一标识这个文件,它常用来辨别文件的真伪,例如下载系统安装镜像,旁边会附带一个长长的字符乱码,这就是这个镜像的MD5值。文件被修改后其MD5值也会改变,...

weixin_29332623的博客 571

Linux生成目录下md5,linux下使用md5sum递归生成整个目录的md5 [原创]

linux下使用md5sum递归生成整个目录的md5今天要用md5sum操作目录,递归生成目录下所有文件的md5值,结果发现它不支持递归操作于是写了个php脚本处理下代码:$path ='/data/www/bbs/source';$outfile = 'file.md5';get_file_md5($path, $outfile);function get_file_md5($path, $ou...

weixin_28888459的博客 567

linux获取文件的md5,linux shell 获取文件md5的命令linux操作系统 -电脑资料

下面我给各位朋友总结一下在linux中利用shell命令来获取文件md5及遍历目录下所有文件的md5的例子,希望此例子对各位同学会有所帮助,获取文件的MD5值:$ md5sum linuxmint-12-gnome-dvd-32bit.iso|cut -d ' ' -f1得到的MD5值:ee3d6e2ca498bc7685b7f17cdb5f2eea使用MD5校验iso文件:$ md5sum li...

weixin_30240263的博客 866

【linux】md5文件相似校验介绍与实战示例

文章摘要: 本文介绍Linux中MD5校验的多种方法及实用脚本。核心内容包括: 基础命令:使用md5sum或openssl生成文件MD5值,支持提取纯哈希或比对文件一致性。 实用脚本: 校验文件与预期MD5是否匹配; 比对两个文件内容是否相同; 批量生成目录文件的MD5清单并校验完整性。 集成工具:提供交互式菜单脚本md5tool.sh,支持生成清单、单文件校验、文件比对及批量校验功能。适用于文件防篡改、备份验证等场景,提升操作效率与安全性。 (字数:148)

qq_41604569的博客 810

Linux生成目录下md5,Linux系统递归生成目录中文件的md5的方法

$path ='/data/www/bbs/source';$outfile = 'file.md5';get_file_md5($path, $outfile);function get_file_md5($path, $outfile){$path = rtrim($path, '/');if(function_exists('scandir')){$files = scandir($path...

weixin_32469089的博客 266

Linux计算文件md5值脚本-多种命令结合使用记录

Linux计算文件md5值脚本-多种命令结合使用记录脚本内容 脚本内容 #!/bin/bash echo "[-] 计算 rpm 软件包 md5 值写入文件中... 目录: ${1:-未指定}" FILE_DIR=${1:?'[x] 请输入需要检车md5值的文件所在的目录'} MD5_FILE=md5file #FILE_LIST=`find ${FILE_DIR} -type f` #for file in $FILE_LIST; do # echo `md5sum $file`|awk ' #{ #

离风的博客 876
上一篇: [系统操作][Linux]修改当前Ubuntu的启动方式
下一篇: [系统操作][Linux]配置git
cloudblaze
博客等级 码龄17年 81粉丝 125原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值