Linux下C语言使用openssl库进行MD5校验

2023-11-12

作者:无脑仔的小明 
出处:http://www.cnblogs.com/wunaozai/ 

我们以一个字符串为例,新建一个文件filename.txt,在文件内写入hello ,然后在Linux下可以使用命令md5sum filename.txt计算md5值 ==> b1946ac92492d2347c6235b4d2611184  。虽然写入的是hello这5个字符,但是我们使用命令xxd filename.txt后可以看出文件结尾处会有个0x0a这个回车符。所以在下面的代码中才会有\n。

//打开/usr/include/openssl/md5.h这个文件我们可以看到一些函数
// 初始化 MD5 Contex, 成功返回1,失败返回0
int MD5_Init(MD5_CTX *c);
// 循环调用此函数,可以将不同的数据加在一起计算MD5,成功返回1,失败返回0
int MD5_Update(MD5_CTX *c, const void *data, size_t len);
// 输出MD5结果数据,成功返回1,失败返回0
int MD5_Final(unsigned char *md, MD5_CTX *c);
// MD5_Init,MD5_Update,MD5_Final三个函数的组合,直接计算出MD5的值
unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
// 内部函数,不需要调用
void MD5_Transform(MD5_CTX *c, const unsigned char *b);


新建一个cpp文件(C文件也可以)用于计算MD5值
#include <openssl/md5.h>
#include <string.h>
#include <stdio.h>

int main()
{
    MD5_CTX ctx;
    unsigned char outmd[16];
    int i=0;

    memset(outmd,0,sizeof(outmd));
    MD5_Init(&ctx);
    MD5_Update(&ctx,"hel",3);
    MD5_Update(&ctx,"lo\n",3);
    MD5_Final(outmd,&ctx);
    for(i=0;i<16;i<i++)
    {
        printf("%02X",outmd[i]);
    }
    printf("\n");
    return 0;
}

编译选项为: g++ MD5test.cpp -lssl -o MD5test(如果是C语言可以使用gcc MD5test.c -o  MD5test)

运行后的结果为: B1946AC92492D2347C6235B4D2611184

注意这里用到openssl库,可以自行根据网上教程安装。

下面这个代码是对文件进行MD5计算。

#include <openssl/md5.h>
#include <string.h>
#include <stdio.h>

int main()
{
    MD5_CTX ctx;
    unsigned char outmd[16];
    char buffer[1024];
    char filename[32];
    int len=0;
    int i;
    FILE * fp=NULL;
    memset(outmd,0,sizeof(outmd));
    memset(filename,0,sizeof(filename));
    memset(buffer,0,sizeof(buffer));
    printf("请输入文件名,用于计算MD5值:");
    scanf("%s",filename);
    fp=fopen(filename,"rb");
    if(fp==NULL)
    {
        printf("Can't open file\n");
        return 0;
    }

    MD5_Init(&ctx);
    while((len=fread(buffer,1,1024,fp))>0)
    {
        MD5_Update(&ctx,buffer,len);
        memset(buffer,0,sizeof(buffer));
    }
    MD5_Final(outmd,&ctx);

    for(i=0;i<16;i<i++)
    {
        printf("%02X",outmd[i]);
    }
    printf("\n");
    return 0;
}
运行得到结果后,我们可以使用md5sum命令进行验证。

文章为转载,略微改了几个字眼。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux下C语言使用openssl库进行MD5校验 的相关文章

  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • 无法加载 JavaHL 库。- linux/eclipse

    在尝试安装 Subversion 插件时 当 Eclipse 启动时出现此错误 Failed to load JavaHL Library These are the errors that were encountered no libs
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • Linux 中的无缓冲 I/O

    我正在写入大量的数据 这些数据数周内都不会再次读取 由于我的程序运行 机器上的可用内存量 显示为 空闲 或 顶部 很快下降 我的内存量应用程序使用量不会增加 其他进程使用的内存量也不会增加 这让我相信内存正在被文件系统缓存消耗 因为我不打算
  • 如何在bash中使用jq从变量中包含的json中提取值

    我正在编写一个 bash 脚本 其中存储了一个 json 值 现在我想使用 Jq 提取该 json 中的值 使用的代码是 json val code lyz1To6ZTWClDHSiaeXyxg redirect to http examp
  • 为什么内核需要虚拟寻址?

    在Linux中 每个进程都有其虚拟地址空间 例如 32位系统为4GB 其中3GB为进程保留 1GB为内核保留 这种虚拟寻址机制有助于隔离每个进程的地址空间 对于流程来说这是可以理解的 因为有很多流程 但既然我们只有 1 个内核 那么为什么我
  • 在 OpenSSL 中使用零填充?

    System Security Cryptography TripleDES 允许我使用零填充 如下所示 static TripleDES CreateTripleDES byte key byte iv TripleDES des new
  • Linux中的CONFIG_OF是什么?

    我看到它在很多地方被广泛使用 但不明白在什么场景下我需要使用它 What is 配置 OF OF 的全名是什么 打开固件 这是很久以前发明的 当时苹果公司正在生产基于 PowerPC CPU 的笔记本电脑 而 Sun Microsystem
  • 我可以从命令行打印 html 文件(带有图像、css)吗?

    我想从脚本中打印带有图像的样式化 html 页面 谁能建议一个开源解决方案 我使用的是 Linux Ubuntu 8 04 但也对其他操作系统的解决方案感兴趣 你可以给html2ps http user it uu se jan html2
  • fopen 不返回

    我在 C 程序中使用 fopen 以只读模式 r 打开文件 但就我而言 我观察到 fopen 调用没有返回 它不返回 NULL 或有效指针 执行在 fopen 调用时被阻止 文件补丁绝对正确 我已经验证过 并且不存在与权限相关的问题 任何人
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t

随机推荐

  • 【Python库系列】超详细的NumPy入门

    目录 一 数组的创建 1 1 创建数组 1 2 数组的性质 二 数组的存载 2 1 numpy 自身的 npy 格式 2 2 文本 txt 格式 2 3 文本 csv 格式 三 数组的获取 3 1 正规索引 3 2 布尔索引 3 3 花式索
  • 多类隶属度的模糊支持向量机(FSVM)

    模糊支持向量机 FSVM 多类隶属度分析 1 传统FSVM 隶属度分析 2 改进的FSVM 隶属度分析 3 FSVM多类隶属度分析 4 评估分类效果 不定期遴选一些高质量期刊论文 进行介绍 内容不详加解释 重在学习文章的思路 模糊隶属度来描
  • EMC基础知识

    一 概述 传导实验为测试被测设备对外界的骚扰的强度的实验 测试的频谱为150K 30MHz 充分理解实验数据 对设计整改会起到关键性作用 以下对实验波形及数据 设计整改方向进行简要说明 二 测试频域图解读 以上2张波形 是测试中经常看到的2
  • 如何用vue实现文本的编辑

    文章数据是通过后台返回html数据 之后前端通过遍历生成一个大的html 然后渲染到页面上 我如果我想要给这个文章新添加一个编辑功能应该怎么实现 文章内容不便展示 只通过文字描述完成本功能 一般的话 编辑文本可以才用富文本编辑器或者采用wo
  • java 基础重学(二)-基础知识

    1 基本数据类型 2 自动拆装箱 3 String 4 关键字 5 集合类 6 枚举 7 IO 8 反射 9 动态代理 10 序列化 11 注解 12 JMS 13 JMX 14 泛型 15 单元测试 16 正则表达式 17 异常 18 时
  • 2021年最推荐的十大进销存管理软件排名

    2021年过去一半了 相信不少商家都要准备开始在忙着盘点自己库存 对账 整理数据报表 有的人选对了店铺管理软件 只需动动手指就能快速搞定自己需要的数据 然而有的人每天晚上加班加点计算盘点 到头来数据还是一团糟 只因为没有选对店铺管理软件或者
  • RabbitMQ第三个实操小案例——发布者/订阅者(Publish/Subscribe)、广播交换器(FanoutExchange)

    文章目录 RabbitMQ第三个实操小案例 发布者 订阅者 Publish Subscribe 广播交换器 FanoutExchange 写法一 配置类配置方式 写法二 注解方式 RabbitListener RabbitMQ第三个实操小案
  • 【蓝桥杯python】给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200

    问题描述 给定一个长度为n的数列 将这个数列按从小到大的顺序排列 1 lt n lt 200 输入格式 第一行为一个整数n 第二行包含n个整数 为待排序的数 每个整数的绝对值小于10000 输出格式 输出一行 按从小到大的顺序输出排序后的数
  • Qt学习笔记(四):Qt 的内存回收机制

    在 Qt 中 QObject 是顶层对象 当 Qt 程序关闭的时候 QObject 对象会被自动释放掉 我们知道 C 中指针对象在使用的时候 需要手动分配空间 new 否则会出现 段错误 当指针对象不再使用的时候 需要手动释放空间 dele
  • C++药名整理题——教你首字符串升序排序

    某题库中 有这样一道题 题目名称 药名整理 医生在书写药品名的时候无法关注到格式问题 不注意大小写 格式比较混乱等现象时有发生 你能否写一个程序 将医生书写混乱的药品名整理成统一规范的格式 即药品名的第一个字符如果 是字母要大写 其他字母小
  • 【菜鸟教程笔记】beautifulsoup高级用法

    静觅的博客进行了很详细的讲解 博客网址为 https cuiqingcai com 1319 html 官方教学网页源码 p align center This is paragraph b one b p p align left Thi
  • 【javascript】全选按钮

    当点击全选按钮时 与之相关的所有选项都会被自动框选 效果 代码
  • 43黑马QT笔记之Qt下Tcp/Udp通信过程

    43黑马QT笔记之Qt下Tcp Udp通信过程 前提 Qt下的网络通信需要加上 QT newwork 模块 1 Qt下Tcp的通信过程 1 共有三个套接字 客户端有一个QTcpServer监听套接字 服务端有两个 分别是QTcpServer
  • vlookup匹配 匹配结果错误_明明有数据,为什么我的VLOOKUP总是匹配不出来?

    经常用vlookup函数匹配数据的小伙伴们经常会遇到表格中明明有数据 却总是匹配不到的情况 下面盘点下那些年匹配时遇到的坑 单元格中存在空白 下图中A B两列分别存放着员工姓名和员工得分数据 现在要求提取员工H及员工D的得分情况 大家都知道
  • 太方便了,钉钉上就可完成代码发布审批啦!

    如今 不少企业的发布流程要求代码发布到生产环境前需要经过审批 这种发布审批流程 对企业的的CI CD工具提出了新要求 CI CD步骤里需要支持人工卡点审批 并在人工卡点审批通过后能自动触发后续的部署工作 云效流水线Flow发布审批示例 如上
  • 10道海量数据处理

    1 海量日志数据 提取出某日访问百度次数最多的那个IP 此题 在我之前的一篇文章算法里头有所提到 当时给出的方案是 IP的数目还是有限的 最多2 32个 所以可以考虑使用hash将ip直接存入内存 然后进行统计 再详细介绍下此方案 首先是这
  • pycharm中pip升级失败问题

    pycharm中pip升级失败问题 在使用部分第三方库时会使用更高版本的pip 例如TensorFlow需要18 x版本的pip 但是pycharm中进行pip升级时会出现各种问题 甚至显示升级成功 其实并没有 笔者阅读了一些博客上的文章发
  • 十大最佳虚拟化软件

    正如该术语在计算术语中暗示的那样 虚拟化涉及到创建虚拟操作系统 网络平台和存储设备 当今世界 需要复杂的计算机系统来帮助管理大型企业 虚拟化帮助计算机系统和网络管理员使用相同的硬件运行并行操作系统进程 这意味着硬件和软件集成的有效使用 它还
  • centos 查看内核 版本

    查看系统内核版本 方法一 root multiview cat proc version Linux version 3 10 0 693 el7 x86 64 builder kbuilder dev centos org gcc ver
  • Linux下C语言使用openssl库进行MD5校验

    作者 无脑仔的小明 出处 http www cnblogs com wunaozai 我们以一个字符串为例 新建一个文件filename txt 在文件内写入hello 然后在Linux下可以使用命令md5sum filename txt计