首页
关于
联系我们
本站友链
站点统计
站点留言
更多
本站壁纸
Search
1
cc攻击脚本加教程
92 阅读
2
植物大战僵尸杂交版秒杀包
69 阅读
3
子比搭建教程
64 阅读
4
黑客入侵黑页html源码
46 阅读
5
查看摄像头实时画面
45 阅读
默认分类
网络安全
个人笔记
网站源码
ctf
web
红蓝功防
应急响应
密码学
kali
linux
网安故事
日常
登录
/
注册
Search
标签搜索
ctf
网络安全
技术分享
工具
lucky博士
累计撰写
34
篇文章
累计收到
46
条评论
首页
栏目
默认分类
网络安全
个人笔记
网站源码
ctf
web
红蓝功防
应急响应
密码学
kali
linux
网安故事
日常
页面
关于
联系我们
本站友链
站点统计
站点留言
本站壁纸
搜索到
1
篇与
密码学
的结果
2024-10-26
哈希函数-MD5算法
{mtitle title="哈希函数-MD5算法"/}什么是哈希函数? 百度百科给出的定义是:Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。 散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes,hash sums,或hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。什么是md5? md5是一种信息摘要算法,一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值,用来确保信息传输完整一致性。数据填充与分组对消息进行数据填充,使消息的长度对512取模得448,设消息长度为X,即满足X mod 512=448。根据此公式得出需要填充的数据长度。填充方法:在消息后面进行填充,填充第一位为1,其余为0。初始化散列值用64位来存储填充前信息长度。这64位加在第一步结果的后面,这样信息长度就变为N512+448+64=(N+1)512位。记录信息长度标准的幻数(物理顺序)是(A=(01234567)16,B=(89ABCDEF)16。C=(FEDCBA98)16,D=(76543210)16)。假设在程序中定义应该是(A=0X67452301L,B=0XEFCDAB89L。C=0X98BADCFEL,D=0X10325476L)。有点晕哈。事实上想一想就明确了。四轮循环运算循环的次数是分组的个数(N+1)1)将每一512字节细分成16个小组,每一个小组64位(8个字节)2)先认识四个线性函数(&是与,|是或,~是非,是异或)F(X,Y,Z)=(X&Y)|((~X)&Z)G(X,Y,Z)=(X&Z)|(Y&(~Z))H(X,Y,Z)=XYZI(X,Y,Z)=Y(X|(~Z))3)设Mj表示消息的第j个子分组(从0到15)。<<<s表示循环左移s位,则四种操作为: FF(a,b,c,d,Mj,s,ti)表示a=b+((a+F(b,c,d)+Mj+ti)<<<s) GG(a,b,c,d,Mj,s,ti)表示a=b+((a+G(b,c,d)+Mj+ti)<<<s) HH(a,b,c,d,Mj,s,ti)表示a=b+((a+H(b,c,d)+Mj+ti)<<<s) II(a,b,c,d,Mj,s,ti)表示a=b+((a+I(b,c,d)+Mj+ti)<<<s) #include #include #include "md5.h" #include #include #include #include #define FORWORD_FW "123.c" int calc_md5(char*filename,char*dest) { int i; int filelen = 0; int read_len; char temp[8]={0}; char hexbuf[128]={0}; unsigned char decrypt[16]={0}; unsigned char decrypt32[64]={0}; MD5_CTX md5; char fw_path[128]; int fdf; fdf = open(filename,O_RDWR); if(fdf<0) { printf("%s not exist\n",FORWORD_FW); return -1; } MD5Init(&md5); while(1) { read_len = read(fdf, hexbuf,sizeof(hexbuf)); if (read_len <0) { close(fdf); return -1; } if(read_len==0) { break; } filelen += read_len; MD5Update(&md5,(unsigned char *)hexbuf,read_len); } MD5Final(&md5,decrypt); strcpy((char *)decrypt32,""); for(i=0;i<16;i++) { sprintf(temp,"%02x",decrypt[i]); strcat((char *)decrypt32,temp); } strcpy(dest,decrypt32); printf("md5:%s len=%d\n",dest,filelen); close(fdf); return filelen; } int main(int argc, char *argv[]) { int ret; int filelen; char md5_str[64]={0}; char cmd[256]={0}; filelen = calc_md5(FORWORD_FW,md5_str); if(filelen<0) { printf("calc_md5 fail\n"); return -1; } return 0; }
2024年10月26日
12 阅读
0 评论
2 点赞