C实现md5功能
md5在线验证:
在线MD5计算_ip33.com
代码如下:
#include "md5.h"
#include <string.h>
#include "stdio.h"/** 32-bit integer manipulation macros (little endian)*/
#ifndef GET_ULONG_LE
#define GET_ULONG_LE(n,b,i) \
{ \(n) = ( (unsigned long) (b)[(i) ] ) \| ( (unsigned long) (b)[(i) + 1] << 8 ) \| ( (unsigned long) (b)[(i) + 2] << 16 ) \| ( (unsigned long) (b)[(i) + 3] << 24 ); \
}
#endif#ifndef PUT_ULONG_LE
#define PUT_ULONG_LE(n,b,i) \
{ \(b)[(i) ] = (unsigned char) ( (n) ); \(b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \(b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \(b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
}
#endif/** MD5 context setup*/
void md5_starts(md5_context* ctx)
{ctx->total[0] = 0;ctx->total[1] = 0;ctx->state[0] = 0x67452301;ctx->state[1] = 0xEFCDAB89;ctx->state[2] = 0x98BADCFE;ctx->state[3] = 0x10325476;
}static void md5_process(md5_context* ctx, const unsigned char data[64])
{unsigned long X[16], A, B, C, D;GET_ULONG_LE(X[0], data, 0);GET_ULONG_LE(X[1], data, 4);GET_ULONG_LE(X[2], data, 8);GET_ULONG_LE(X[3], data, 12);GET_ULONG_LE(X[4], data, 16);GET_ULONG_LE(X[5], data, 20);GET_ULONG_LE(X[6], data, 24);GET_ULONG_LE(X[7], data, 28);GET_ULONG_LE(X[8], data, 32);GET_ULONG_LE(X[9], data, 36);GET_ULONG_LE(X[10], data, 40);GET_ULONG_LE(X[11], data, 44);GET_ULONG_LE(X[12], data, 48);GET_ULONG_LE(X[13], data, 52);GET_ULONG_LE(X[14], data, 56);GET_ULONG_LE(X[15], data, 60);#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
#define P(a,b,c,d,k,s,t) \
{ \a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \
}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*/
void md5_update(md5_context* ctx, const unsigned char* input, int ilen)
{int fill;unsigned long left;if (ilen <= 0)return;left = ctx->total[0] & 0x3F;fill = 64 - left;ctx->total[0] += ilen;ctx->total[0] &= 0xFFFFFFFF;if (ctx->total[0] < (unsigned long)ilen)ctx->total[1]++;if (left && ilen >= fill){memcpy((void*)(ctx->buffer + left),input, fill);md5_process(ctx, ctx->buffer);input += fill;ilen -= fill;left = 0;}while (ilen >= 64){md5_process(ctx, input);input += 64;ilen -= 64;}if (ilen > 0){memcpy((void*)(ctx->buffer + left),input, ilen);}
}static const unsigned char md5_padding[64] =
{0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};/** MD5 final digest*/
void md5_finish(md5_context* ctx, unsigned char output[16])
{unsigned long last, padn;unsigned long high, low;unsigned char msglen[8];high = (ctx->total[0] >> 29)| (ctx->total[1] << 3);low = (ctx->total[0] << 3);PUT_ULONG_LE(low, msglen, 0);PUT_ULONG_LE(high, msglen, 4);last = ctx->total[0] & 0x3F;padn = (last < 56) ? (56 - last) : (120 - last);md5_update(ctx, md5_padding, padn);md5_update(ctx, msglen, 8);PUT_ULONG_LE(ctx->state[0], output, 0);PUT_ULONG_LE(ctx->state[1], output, 4);PUT_ULONG_LE(ctx->state[2], output, 8);PUT_ULONG_LE(ctx->state[3], output, 12);
}/** output = MD5( input buffer )*/
void md5(unsigned char* input, int ilen, unsigned char output[16])
{md5_context ctx;memset(&ctx, 0, sizeof(md5_context));md5_starts(&ctx);md5_update(&ctx, input, ilen);md5_finish(&ctx, output);
}
#ifndef __MD5_H__
#define __MD5_H__/*** \brief MD5 context structure*/
typedef struct
{unsigned long total[2]; /*!< number of bytes processed */unsigned long state[4]; /*!< intermediate digest state */unsigned char buffer[64]; /*!< data block being processed */
}
md5_context;/*** \brief MD5 context setup** \param ctx context to be initialized*/void md5_starts(md5_context* ctx);/*** \brief MD5 process buffer** \param ctx MD5 context* \param input buffer holding the data* \param ilen length of the input data*/void md5_update(md5_context* ctx, const unsigned char* input, int ilen);/*** \brief MD5 final digest** \param ctx MD5 context* \param output MD5 checksum result*/void md5_finish(md5_context* ctx, unsigned char output[16]);/*** \brief Output = MD5( input buffer )** \param input buffer holding the data* \param ilen length of the input data* \param output MD5 checksum result*/void md5(unsigned char* input, int ilen, unsigned char output[16]);
#endif
相关文章:
C实现md5功能
md5在线验证: 在线MD5计算_ip33.com 代码如下: #include "md5.h" #include <string.h> #include "stdio.h"/** 32-bit integer manipulation macros (little endian)*/ #ifndef GET_ULONG_LE #define GET_ULONG_LE(n,b,i) …...
FFmpeg+Nginx+VLC打造M3U8直播
一、视频直播的技术原理和架构方案 直播模型一般包括三个模块:主播方、服务器端和播放端 主播放创造视频,加美颜、水印、特效、采集后推送给直播服务器 播放端: 直播服务器端:收集主播端的视频推流,将其放大后推送给…...
在 Debian 10.x 安装和配置 Samba
1. 更新系统 sudo apt update sudo apt upgrade -y2. 安装 Samba sudo apt install samba -y3. 配置 Samba 备份默认配置文件 sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak编辑配置文件 sudo nano /etc/samba/smb.conf示例配置(共享目录) …...
基础(测试用例:介绍,测试用例格式,案例)
目录 测试用例介绍 测试用例编写格式 案例 测试用例介绍 用例:用户使用软件的案例场景 测试用例:是为测试项目而设计的测试执行文档 测试用例的作用: 防止漏测是实施测试的标准可以作为测试工作量的评估 测试用例编写格式 用例编号 用例…...
C++学习:六个月从基础到就业——内存管理:RAII原则
C学习:六个月从基础到就业——内存管理:RAII原则 本文是我C学习之旅系列的第十九篇技术文章,也是第二阶段"C进阶特性"的第四篇,主要介绍C中的RAII原则及其在资源管理中的应用。查看完整系列目录了解更多内容。 引言 在…...
Windows串口通信
Windows串口通信相比较Android串口通信,在开发上面相对方便一些。原理都是一样,需要仔细阅读厂商设备的串口通信协议。结合串口调试助手进行测试,测试通过后,编写代码实现。 比如近期就接触到了一款天平,其最大测量值为100g,测量精度0.001g。 拿到手之后我就先阅读串口通…...
bert项目解析
数据预处理 读取csv数据集 def read_file(file_path):data []label []with open(file_path, "r", encoding"utf-8") as file:reader csv.reader(file)next(reader) # 跳过标题行# row每一行用英文逗号分割成列表[标签,文本] 所以标签和文本用英文逗…...
Linux `init` 相关命令的完整使用指南
Linux init 相关命令的完整使用指南—目录 一、init 系统简介二、运行级别(Runlevel)详解三、常用 init 命令及使用方法1. 切换运行级别2. 查看当前运行级别3. 服务管理4. 紧急模式(Rescue Mode) 四、不同 Init 系统的兼容性1. Sy…...
【开源项目】Excel手撕AI算法深入理解(三):时序(RNN、mamba、Long Short Term Memory (LSTM)、xLSTM)
项目源码地址:https://github.com/ImagineAILab/ai-by-hand-excel.git 一、RNN 1. RNN 的核心思想 RNN 的设计初衷是处理序列数据(如时间序列、文本、语音),其核心特点是: 隐藏状态(Hidden Stateÿ…...
嵌入式音视频开发指南:从MPP框架到QT实战全解析
嵌入式音视频开发指南:从MPP框架到QT实战全解析 一、音视频技术全景概述 1.1 技术演进里程碑 2003-2010年:标清时代(H.264/AVC + RTMP)2011-2018年:高清时代(H.265/HEVC + WebRTC)2019-至今:智能时代(AV1 + AI编解码 + 低延迟传输)1.2 现代音视频技术栈 #mermaid-s…...
构建专业金融图表系统的高效路径——QtitanChart在金融行业的应用价值
QtitanChart是一个C 库,它代表一组控件,这些控件使您可以快速轻松地为应用程序提供漂亮而丰富的图表。QtitanChart在Qt.C 上实现,并且支持所有主要的桌面操作系统 - Windows、Linux和Mac OSX。要将QtitanChart添加到您的程序中,只…...
如何通过window端来ssh连接本地虚拟机的ubuntu
首先在 Ubuntu 虚拟机上安装和配置 SSH 服务: # 安装 SSH 服务器 sudo apt update sudo apt install openssh-server# 检查 SSH 服务状态 sudo systemctl status ssh# 如果没有启动,则启动 SSH 服务 sudo systemctl start ssh# 设置开机自启动 sudo sys…...
问题:el-tree点击某节点的复选框由半选状态更改为全选状态以后,点击该节点展开,懒加载出来子节点数据以后,该节点又变为半选状态
具体问题场景: 用户点击父节点复选框将其从半选变为全选(此时子节点尚未加载)。 点击节点展开触发懒加载,加载子节点。 子节点加载后,组件重新计算父节点状态,发现并非所有子节点被选中,因此父节…...
【Rust 精进之路之第8篇-工具赋能】深入 Cargo:依赖管理、构建配置与工作空间 (Workspace)
系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025-04-20 引言:超越构建,Cargo 是 Rust 生态的引擎 在我们的 Rust 学习之旅初期(第二篇),我们已经与 Cargo 有过初步的接触。我们学会了使用 cargo new 创建项目骨架,用 cargo build 编…...
多模态大语言模型arxiv论文略读(二十六)
Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ➡️ 论文标题:Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ➡️ 论文作者:Xinpeng Ding,…...
Java虚拟机(JVM)平台无关?相关?
计算机的概念模型 计算机实际上就是实现了一个图灵机模型。即,输入参数,根据程序计算,输出结果。图灵机模型如图。 Tape是输入数据,Program是针对这些数据进行计算的程序,中间横着的方块表示的是机器的状态。 目前使…...
Ubuntu 安装 Docker 教程(官方推荐方式)
✅ 步骤 1:卸载旧版本(如果有) for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done---### ✅ 步骤 2:更新 APT 索引并安装依赖项bash sudo a…...
Win10 C盘空间不足清理方法
当Windows 10系统的C盘空间不足时,可以采取以下方法进行清理: 1. 清理临时文件 打开“设置” > “系统” > “存储”。 点击“临时文件”,勾选要删除的临时文件、系统缓存等,然后点击“删除文件”。 2. 使用磁盘清理工具…...
cloudstudio学习笔记之openwebui
代码获取 git clone 参考资料 openwebui官网 https://docs.openwebui.com/getting-started/advanced-topics/development 后端启动 cd backend pip install -r requirements.txt -U sh dev.sh后端启动成功后的界面 在cloudstudio提供的vscode弹出的提示中打开浏览器并在末…...
7.QT-常用控件-QWidget|font|toolTip|focusPolicy|styleSheet(C++)
font API说明font()获取当前widget的字体信息.返回QFont对象.setFont(const QFont& font)设置当前widget的字体信息. 属性说明family字体家族.⽐如"楷体",“宋体”,"微软雅⿊"等.pointSize字体⼤⼩weight字体粗细.以数值⽅式表⽰粗细程度取值范围为[…...
机器学习核心算法全解析:从基础到进阶的 18 大算法模型
在机器学习领域,算法模型是解决实际问题的核心工具。 不同的算法适用于不同的数据场景和任务需求,理解它们的原理与应用是掌握机器学习的关键。 以下将详细解析 18 个核心算法模型,涵盖监督学习、无监督学习、集成学习和深度学习等多个领域…...
线性代数 | 知识点整理 Ref 1
注:本文为 “线性代数 | 知识点整理” 相关文章合辑。 因 csdn 篇幅合并超限分篇连载,本篇为 Ref 1。 略作重排,未整理去重。 图片清晰度限于引文原状。 如有内容异常,请看原文。 线性代数知识汇总 Arrow 于 2016-11-27 16:27:5…...
【深度学习入门_NLP自然语言处理】序章
本部分开始深度学习第二大部分NLP章节学习,找了好多资料,终于明确NLP的学习目标了,介于工作之余学习综合考量,还是决定以视频学习为主后期自主实践为主吧。 分享一个总图,其实在定位的时候很迷茫,单各章节…...
Windows常用维护命令
系统信息查询 systeminfo:查看系统详细信息,如操作系统版本、处理器信息、内存配置等。hostname:显示计算机名称。ver:显示 Windows 版本。 网络诊断 ipconfig:查看 IP 配置,如 IP 地址、子网掩码、网关等。…...
Java 2025:解锁未来5大技术趋势,Kotlin融合AI新篇
各位Java开发者们好!🚀 2025年的Java世界正在经历一场前所未有的技术变革。作为深耕Java领域多年的技术博主,今天我将带大家深入探索Java生态即将迎来的5大技术趋势,特别是Kotlin的深度融合和AI技术的新篇章。准备好了吗ÿ…...
IcePlayer音乐播放器项目分析及学习指南
IcePlayer音乐播放器项目分析及学习指南 项目概述 IcePlayer是一个基于Qt5框架开发的音乐播放器应用程序,使用Visual Studio 2013作为开发环境。该项目实现了音乐播放、歌词显示、专辑图片获取等功能,展现了桌面应用程序开发的核心技术和设计思想。 技…...
蓝桥杯 二进制问题 刷题笔记
8.二进制问题 - 蓝桥云课 存入N的二进制每一位作为基准数组 算出方案数 从高位往低位用dfs枚举每一位是放1还是放0 #include<iostream> #include<vector> #define ll long long using namespace std;ll dp[65][65]; ll num; ll k; vector<ll> vec;ll cal(l…...
20. git diff
基本概述 git diff的作用是:比较代码差异 基本用法 1.工作区 VS 暂存区 git diff [file]2.暂存区 VS 最新提交 git diff --staged [file] # 或 git diff --cached [file]3.工作区 VS 最新提交 git diff HEAD [file]高级用法 1.比较两个提交间的差异 git dif…...
深入剖析 MySQL 中用户授权机制及操作
在数据库管理的庞大体系中,MySQL 作为一款广泛应用的开源关系型数据库管理系统,其用户授权机制对于保障数据安全、确保数据库稳定运行以及满足多样化的业务需求起着举足轻重的作用。当我们遭遇 “Access denied for user icoolkj% to database icoolkj-a…...
mapbox基础,加载视频到地图
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️raster 栅格图层 api二、🍀加载视频到…...
