MD5消息摘要的C++实现

前言

计算MD5是进行apk分析的最基本操作之一,在MobSF中,由于python的第三方库十分丰富,要计算md5只需要导入hashlib这个库就可以了,但是在C++中,这个东西还得自己实现。
本文对github上的一个md5计算的项目进行扩展,使得其可以进行字符串md5计算的update操作和对文件的md5计算。

项目地址

原项目:https://github.com/JieweiWei/md5
我的项目地址:https://github.com/LeeHDsniper/md5
参考文章:http://www.cnblogs.com/flying_bat/archive/2007/09/25/905133.html

环境

  • Ubuntu16.04LTS
  • g++ 5.3.1

Note

网上有很多关于md5计算的资料,但是几乎都差不了多少,甚至代码都一样,例如github上的这个项目和那篇参考文章中项目,其实代码都一样,最多换了函数名称或者删掉了一些功能。
那篇参考文章中最后给出了源码,但是我编译后得出的md5竟然是错的……于是在github上找到了一个md5项目,尽管只能计算字符串的md5,而且不能追加,但是至少算出来是正确的。
接下来就是死磕源码…….这个过程是很痛苦的,但是不得不承认,这些代码写的很漂亮,逻辑清楚,复用性高(所以我才能进行扩展)。

Some skill

#define BIT_SET(a,b) ((a) |= (1<<(b)))
#define BIT_GET(a,b) (((a) & (1<<(b)))>0?1:0)
#define BIT_RST(a,b) ((a) &= ~(1<<(b))); 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MD5是一种广泛使用的散列算法,用于确保信息在传输过程中的完整性和一致性。MD5算法可以将任意长度的数据运算转化为一个固定长度的摘要。在C语言中,可以使用MD5算法来实现文件的完整性校验。 在Linux平台上,可以使用C语言编写一个基于MD5算法的文件完整性校验程序。该程序可以通过命令行参数进行不同的操作。例如,使用`./md5 -h`可以查看程序的帮助信息,使用`./md5 -t`可以打印程序的测试信息,使用`./md5 -c nankai.txt`可以计算并打印被测文件的MD5摘要。 下面是一个示例的C语言代码,用于实现MD5算法的文件完整性校验程序: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/md5.h> void calculate_md5(const char* filename) { FILE* file = fopen(filename, "rb"); if (file == NULL) { printf("Unable to open file: %s\n", filename); return; } MD5_CTX context; MD5_Init(&context); unsigned char buffer[1024]; int bytesRead; while ((bytesRead = fread(buffer, 1, sizeof(buffer), file)) != 0) { MD5_Update(&context, buffer, bytesRead); } unsigned char digest[MD5_DIGEST_LENGTH]; MD5_Final(digest, &context); fclose(file); printf("MD5 digest of file '%s': ", filename); for (int i = 0; i < MD5_DIGEST_LENGTH; i++) { printf("%02x", digest[i]); } printf("\n"); } int main(int argc, char* argv[]) { if (argc != 3) { printf("Usage: %s -c <filename>\n", argv[0]); return 1; } if (strcmp(argv[1], "-c") == 0) { calculate_md5(argv[2]); } else { printf("Invalid option: %s\n", argv[1]); } return 0; } ``` 这个示例程序使用了OpenSSL中的MD5相关函数来计算文件的MD5摘要。它通过打开文件、逐块读取数据并进行摘要计算,最后输出计算得到的摘要结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值