速速收藏!纯C实现的MD5哈希校验算法~!

速速收藏!纯C实现的MD5哈希校验算法~!


只有一个函数:
void MD5(const void* buf, unsigned int len, unsigned char output[16]);

在线验证网站:https://www.sojson.com/md5/


头文件

/*** \file md5.h** \brief MD5 message digest algorithm (hash function)*/#ifndef MD5_H__
#define MD5_H__#ifdef __cplusplus
extern "C" {
#endifvoid MD5(const void* buf, unsigned int len, unsigned char output[16]);#ifdef __cplusplus
}
#endif#endif

源文件

/*** \file md5.c** \brief MD5 message digest algorithm (hash function)*/#include <stdio.h>
#include <stdint.h>
#include <string.h>#include "md5.h"typedef struct
{uint32_t total[2];          /*!< number of bytes processed  */uint32_t state[4];          /*!< intermediate digest state  */unsigned char buffer[64];   /*!< data block being processed */
}md5_context;/** 32-bit integer manipulation macros (little endian)*/#define GET_UINT32_LE(n,b,i)                            \
{                                                       \(n) = ( (uint32_t) (b)[(i)    ]       )             \| ( (uint32_t) (b)[(i) + 1] <<  8 )             \| ( (uint32_t) (b)[(i) + 2] << 16 )             \| ( (uint32_t) (b)[(i) + 3] << 24 );            \
}#define PUT_UINT32_LE(n,b,i)                                    \
{                                                               \(b)[(i)    ] = (unsigned char) ( ( (n)       ) & 0xFF );    \(b)[(i) + 1] = (unsigned char) ( ( (n) >>  8 ) & 0xFF );    \(b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF );    \(b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF );    \
}void md5_internal_process(md5_context *ctx, const unsigned char data[64])
{uint32_t X[16], A, B, C, D;GET_UINT32_LE( X[ 0], data,  0 );GET_UINT32_LE( X[ 1], data,  4 );GET_UINT32_LE( X[ 2], data,  8 );GET_UINT32_LE( X[ 3], data, 12 );GET_UINT32_LE( X[ 4], data, 16 );GET_UINT32_LE( X[ 5], data, 20 );GET_UINT32_LE( X[ 6], data, 24 );GET_UINT32_LE( X[ 7], data, 28 );GET_UINT32_LE( X[ 8], data, 32 );GET_UINT32_LE( X[ 9], data, 36 );GET_UINT32_LE( X[10], data, 40 );GET_UINT32_LE( X[11], data, 44 );GET_UINT32_LE( X[12], data, 48 );GET_UINT32_LE( X[13], data, 52 );GET_UINT32_LE( X[14], data, 56 );GET_UINT32_LE( X[15], data, 60 );#define S(x,n)                                                          \( ( (x) << (n) ) | ( ( (x) & 0xFFFFFFFF) >> ( 32 - (n) ) ) )#define P(a,b,c,d,k,s,t)                                        \do                                                          \{                                                           \(a) += F((b),(c),(d)) + X[(k)] + (t);                   \(a) = S((a),(s)) + (b);                                 \} while( 0 )A = ctx->state[0];B = ctx->state[1];C = ctx->state[2];D = ctx->state[3];#define F(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))P( A, B, C, D,  0,  7, 0xD76AA478 );P( D, A, B, C,  1, 12, 0xE8C7B756 );P( C, D, A, B,  2, 17, 0x242070DB );P( B, C, D, A,  3, 22, 0xC1BDCEEE );P( A, B, C, D,  4,  7, 0xF57C0FAF );P( D, A, B, C,  5, 12, 0x4787C62A );P( C, D, A, B,  6, 17, 0xA8304613 );P( B, C, D, A,  7, 22, 0xFD469501 );P( A, B, C, D,  8,  7, 0x698098D8 );P( D, A, B, C,  9, 12, 0x8B44F7AF );P( C, D, A, B, 10, 17, 0xFFFF5BB1 );P( B, C, D, A, 11, 22, 0x895CD7BE );P( A, B, C, D, 12,  7, 0x6B901122 );P( D, A, B, C, 13, 12, 0xFD987193 );P( C, D, A, B, 14, 17, 0xA679438E );P( B, C, D, A, 15, 22, 0x49B40821 );#undef F#define F(x,y,z) ((y) ^ ((z) & ((x) ^ (y))))P( A, B, C, D,  1,  5, 0xF61E2562 );P( D, A, B, C,  6,  9, 0xC040B340 );P( C, D, A, B, 11, 14, 0x265E5A51 );P( B, C, D, A,  0, 20, 0xE9B6C7AA );P( A, B, C, D,  5,  5, 0xD62F105D );P( D, A, B, C, 10,  9, 0x02441453 );P( C, D, A, B, 15, 14, 0xD8A1E681 );P( B, C, D, A,  4, 20, 0xE7D3FBC8 );P( A, B, C, D,  9,  5, 0x21E1CDE6 );P( D, A, B, C, 14,  9, 0xC33707D6 );P( C, D, A, B,  3, 14, 0xF4D50D87 );P( B, C, D, A,  8, 20, 0x455A14ED );P( A, B, C, D, 13,  5, 0xA9E3E905 );P( D, A, B, C,  2,  9, 0xFCEFA3F8 );P( C, D, A, B,  7, 14, 0x676F02D9 );P( B, C, D, A, 12, 20, 0x8D2A4C8A );#undef F#define F(x,y,z) ((x) ^ (y) ^ (z))P( A, B, C, D,  5,  4, 0xFFFA3942 );P( D, A, B, C,  8, 11, 0x8771F681 );P( C, D, A, B, 11, 16, 0x6D9D6122 );P( B, C, D, A, 14, 23, 0xFDE5380C );P( A, B, C, D,  1,  4, 0xA4BEEA44 );P( D, A, B, C,  4, 11, 0x4BDECFA9 );P( C, D, A, B,  7, 16, 0xF6BB4B60 );P( B, C, D, A, 10, 23, 0xBEBFBC70 );P( A, B, C, D, 13,  4, 0x289B7EC6 );P( D, A, B, C,  0, 11, 0xEAA127FA );P( C, D, A, B,  3, 16, 0xD4EF3085 );P( B, C, D, A,  6, 23, 0x04881D05 );P( A, B, C, D,  9,  4, 0xD9D4D039 );P( D, A, B, C, 12, 11, 0xE6DB99E5 );P( C, D, A, B, 15, 16, 0x1FA27CF8 );P( B, C, D, A,  2, 23, 0xC4AC5665 );#undef F#define F(x,y,z) ((y) ^ ((x) | ~(z)))P( A, B, C, D,  0,  6, 0xF4292244 );P( D, A, B, C,  7, 10, 0x432AFF97 );P( C, D, A, B, 14, 15, 0xAB9423A7 );P( B, C, D, A,  5, 21, 0xFC93A039 );P( A, B, C, D, 12,  6, 0x655B59C3 );P( D, A, B, C,  3, 10, 0x8F0CCC92 );P( C, D, A, B, 10, 15, 0xFFEFF47D );P( B, C, D, A,  1, 21, 0x85845DD1 );P( A, B, C, D,  8,  6, 0x6FA87E4F );P( D, A, B, C, 15, 10, 0xFE2CE6E0 );P( C, D, A, B,  6, 15, 0xA3014314 );P( B, C, D, A, 13, 21, 0x4E0811A1 );P( A, B, C, D,  4,  6, 0xF7537E82 );P( D, A, B, C, 11, 10, 0xBD3AF235 );P( C, D, A, B,  2, 15, 0x2AD7D2BB );P( B, C, D, A,  9, 21, 0xEB86D391 );#undef Fctx->state[0] += A;ctx->state[1] += B;ctx->state[2] += C;ctx->state[3] += D;
}/** MD5 process buffer*/
static void md5_update( md5_context *ctx, const unsigned char *input, size_t ilen)
{size_t fill;uint32_t left;if( ilen == 0 )return;left = ctx->total[0] & 0x3F;fill = 64 - left;ctx->total[0] += (uint32_t) ilen;ctx->total[0] &= 0xFFFFFFFF;if( ctx->total[0] < (uint32_t) ilen )ctx->total[1]++;if( left && ilen >= fill ){memcpy( (void *) (ctx->buffer + left), input, fill );md5_internal_process( ctx, ctx->buffer );input += fill;ilen  -= fill;left = 0;}while( ilen >= 64 ){md5_internal_process( ctx, input );input += 64;ilen  -= 64;}if( ilen > 0 ){memcpy( (void *) (ctx->buffer + left), input, ilen );}
}/** MD5 final digest*/
static void md5_finish( md5_context *ctx, unsigned char output[16])
{uint32_t used;uint32_t high, low;/** Add padding: 0x80 then 0x00 until 8 bytes remain for the length*/used = ctx->total[0] & 0x3F;ctx->buffer[used++] = 0x80;if( used <= 56 ){/* Enough room for padding + length in current block */memset( ctx->buffer + used, 0, 56 - used );}else{/* We'll need an extra block */memset( ctx->buffer + used, 0, 64 - used );md5_internal_process( ctx, ctx->buffer );memset( ctx->buffer, 0, 56 );}/** Add message length*/high = ( ctx->total[0] >> 29 )| ( ctx->total[1] <<  3 );low  = ( ctx->total[0] <<  3 );PUT_UINT32_LE( low,  ctx->buffer, 56 );PUT_UINT32_LE( high, ctx->buffer, 60 );md5_internal_process( ctx, ctx->buffer );/** Output final state*/PUT_UINT32_LE( ctx->state[0], output,  0 );PUT_UINT32_LE( ctx->state[1], output,  4 );PUT_UINT32_LE( ctx->state[2], output,  8 );PUT_UINT32_LE( ctx->state[3], output, 12 );
}void MD5(const void* buf, unsigned int len, unsigned char output[16])
{md5_context ctx = {0};ctx.total[0] = 0;ctx.total[1] = 0;ctx.state[0] = 0x67452301;ctx.state[1] = 0xEFCDAB89;ctx.state[2] = 0x98BADCFE;ctx.state[3] = 0x10325476;md5_update(&ctx, (unsigned char *)buf, len);md5_finish(&ctx, output);
}#if 0
#include <stdio.h>
#include <stdlib.h>
#include "md5.h"/*verify online: https://www.sojson.com/md5/testdata:helloworld1234567890
md5(hex):cee76d16b6c243c1cd7c7ecc677de87d*/int main(void)
{const char* testdata = "helloworld1234567890";uint8_t md5[16];MD5(testdata, strlen(testdata), md5);printf("testdata:%s\n", testdata);printf("md5(hex):");for(int i = 0; i < 16; i++){printf("%02x", md5[i]);}printf("\n");return 0;
}
#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软著项目推荐 深度学习手势识别算法实现 - opencv python

文章目录 1 前言2 项目背景3 任务描述4 环境搭配5 项目实现5.1 准备数据5.2 构建网络5.3 开始训练5.4 模型评估 6 识别效果7 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习手势识别算法实现 - opencv python 该项目较为新颖…

【数据库设计和SQL基础语法】--SQL语言概述--SQL的基本结构和语法规则(二)

一、数据控制语言&#xff08;DCL&#xff09; 1.1 授权&#xff08;GRANT&#xff09; 数据控制语言&#xff08;DCL&#xff09;是SQL的一个子集&#xff0c;用于控制数据库中的数据访问和权限。GRANT语句是DCL中的一种&#xff0c;用于向用户或角色授予特定的数据库操作权…

计算机网络 | 物理层下 传输媒介、信道复用技术,带宽接入技术

文章目录 3. 物理层下面的传输媒介3.1 导引型传输媒介3.2 非导引型传输媒介 4 信道复用技术5 数字传输系统5.1 旧的数字系统5.2 新数字系统 6 带宽接入技术6.1 DSL&#xff08;数字用户线&#xff09;6.2HFC 光纤同轴混合网6.2.1 接入 6.3 FTTx技术 3. 物理层下面的传输媒介 传…

层规范化(Layer Normalization)和正则化(Regularization)

层规范化&#xff08;Layer Normalization&#xff09;和正则化&#xff08;Regularization&#xff09;是两个不同的概念&#xff0c;尽管它们都在机器学习和深度学习中非常重要&#xff0c;但它们的目的和应用方式有所不同。 层规范化&#xff08;Layer Normalization&#x…

KALI LINUX攻击与渗透测试

预计更新 第一章 入门 1.1 什么是Kali Linux&#xff1f; 1.2 安装Kali Linux 1.3 Kali Linux桌面环境介绍 1.4 基本命令和工具 第二章 信息收集 1.1 网络扫描 1.2 端口扫描 1.3 漏洞扫描 1.4 社交工程学 第三章 攻击和渗透测试 1.1 密码破解 1.2 暴力破解 1.3 漏洞利用 1.4 …

嵌入式软件开发常用的关键字和运算符

目录 1、volatile关键字 2、const关键字 3、static关键字 4、struct与union 5、预定义标识符 6、#与## 7、void 与 void*关键字 8、weak关键字 1、volatile关键字 volatile是一个特征修饰符&#xff0c;提醒编译器它后面所定义的变量随时都有可能改变&#xff0c;因此…

FL Studio 21.2.1.3859中文破解激活版2024免费下载安装图文教程

FL Studio 21.2.1.3859中文破解激活版是我见过更新迭代最快的宿主软件&#xff0c;没有之一。FL Studio12、FL Studio20、FL Studio21等等。有时甚至我刚刚下载好了最新版本&#xff0c;熟悉了新版本一些好用的操作&#xff0c;Fl Studio就又推出了更新的版本&#xff0c;而且F…

WebGL笔记:矩阵平移的数学原理和实现

矩阵平移的数学原理 让向量OA位移 x方向&#xff0c;txy方向&#xff0c;tyz方向&#xff0c;tz 最终得到向量OB 矩阵平移的应用 再比如我要让顶点的x移动0.1&#xff0c;y移动0.2&#xff0c;z移动0.3 1 &#xff09;顶点着色器核心代码 <script id"vertexShader&…

CentOS服务器网页版Rstudio-server及R包批量安装最佳实践

CentOS服务器安装网页版Rstudio-server及R包批量安装 以下为CentOS 7/8的Rstudio-server安装、配置和R包安装操作 1. 软件包安装 Centos 7安装 # 下载安装包,大小115.14 MB wget -c https://download2.rstudio.org/server/centos7/x86_64/rstudio-server-rhel-2023.09.1-…

聊聊logback的ThrowableProxyConverter

序 本文主要研究一下logback的ThrowableProxyConverter ThrowableHandlingConverter ch/qos/logback/classic/pattern/ThrowableHandlingConverter.java /*** Converter which handle throwables should be derived from this class.**/ public abstract class ThrowableHa…

面试官:说说Vue中Proxy与Object.defineProperty的用法与区别

前言 面试时&#xff0c;我们说完Vue响应式原理&#xff0c;或者Vue2和Vue3的区别时&#xff0c;通常会引出Vue3使用了Proxy来优化响应式&#xff0c;而面试官会继续深挖&#xff1a;说说Proxy与Object.defineProperty的区别。 我们不能只说Proxy直接代理一个对象&#xff0c…

带头双向循环链表:一种高效的数据结构

&#x1f493; 博客主页&#xff1a;江池俊的博客⏩ 收录专栏&#xff1a;数据结构探索&#x1f449;专栏推荐&#xff1a;✅cpolar ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f525;编译环境&#xff1a;Visual Studio 2022&#x1f389;欢迎大…

基于maobox-gl 纯前端绘制全球色斑图

基于maobox-gl.js、turf.js 绘制全球色斑图绘制 1、准备全球的某一类的点位数据&#xff0c;可以使用turf.js 随机生成点&#xff0c;并点数据赋properties属性 let points turf.randomPoint(30, { bbox: [-180, -90, 180, 90]}); let interpolateOptions {gridType: "…

Linux下Python调用C语言

一&#xff1a;Python调用C语言场景 1&#xff0c;已经写好的C语言代码&#xff0c;不容易用Python实现&#xff0c;想直接通过Python调用写好的C语言代码 2&#xff0c;C比Python快&#xff08;只是从语言层面&#xff0c;不能绝对说C程序就是比Python快&#xff09; 3&…

某音订单接口在电商行业中的重要性及实践应用

一、引言 随着移动互联网的快速发展&#xff0c;短视频平台抖音已经成为人们日常生活中不可或缺的一部分。越来越多的商家开始利用抖音平台推广和销售商品&#xff0c;从而实现商业变现。在这个过程中&#xff0c;抖音订单接口起到了至关重要的作用。本文将详细探讨抖音订单接…

希尔排序(Java)

目录 希尔排序的步骤&#xff1a; Java实现希尔排序&#xff1a; 希尔排序&#xff08;Shell Sort&#xff09;是一种插入排序的改进算法&#xff0c;它通过比较距离较远的元素交换位置&#xff0c;从而实现数据局部的较小规模排序&#xff0c;逐渐减小元素之间的间隔&#x…

遥感方向期刊总结

开眼看期刊~ 期刊分区信息搜索网址中国科学院文献情报中心期刊分区表升级版科研通期刊查询&#xff1a; 遥感领域常见期刊Nature CommunicationsRemote Sensing of EnvironmentProceedings of the National Academy of Sciences &#xff08;PNAS&#xff09;ISPRS Journal of …

C++ day50 买卖股票最佳时机

题目1&#xff1a;123 买卖股票的最佳时机Ⅲ 题目链接&#xff1a;买卖股票的最佳时机Ⅲ 对题目的理解 prices[i]表示股票在第i天的价格&#xff0c;最多可以完成两笔交易&#xff0c;不能同时进行多笔交易 可以买卖一次&#xff0c;两次&#xff0c;也可以不买卖 动态规划…

[字符串操作] 分割乘积

​ 分割乘积 题目描述 给定一个整数&#xff0c;求插入两个乘号将该整数分割成三个数之后&#xff0c;三个数的的最大乘积。 关于输入 只有一行&#xff0c;一个整数。 关于输出 所求出的最大乘积。 例子输入 4242例子输出 336提示信息 整数有正有负&#xff0c;注意&…

yolov5 7.0版本部署手机端。通过pnnx导出ncnn。

yolov5 7.0版本部署手机端。通过pnnx导出ncnn。 流程配置ncnn android yolov5导出自己模型的ncnn修改yolo.py文件导出TorchScript文件pnnx转torchscript为ncnn 安卓运行权重路径输入输出anchors 大小类别名generate_proposals方法修改 结果 流程 网络yolov5 的部署已经有很多了…