资源简介
md5加密算法 C语言(经过测试验证完整版)
经过调试验证,与工具结果一致
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
经过调试验证,与工具结果一致
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
代码片段和文件信息
#include
#include “md5.h“
unsigned char PADDING[]={0x80000000000000000
0000000000000000
0000000000000000
0000000000000000};
void MD5Init(MD5_CTX *context)
{
context->count[0] = 0;
context->count[1] = 0;
context->state[0] = 0x67452301;
context->state[1] = 0xEFCDAB89;
context->state[2] = 0x98BADCFE;
context->state[3] = 0x10325476;
}
void MD5Update(MD5_CTX *contextunsigned char *inputunsigned int inputlen)
{
unsigned int i = 0index = 0partlen = 0;
index = (context->count[0] >> 3) & 0x3F;
partlen = 64 - index;
context->count[0] += inputlen << 3;
if(context->count[0] < (inputlen << 3))
context->count[1]++;
context->count[1] += inputlen >> 29;
if(inputlen >= partlen)
{
memcpy(&context->buffer[index]inputpartlen);
MD5Transform(context->statecontext->buffer);
for(i = partlen;i+64 <= inputlen;i+=64)
MD5Transform(context->state&input[i]);
index = 0;
}
else
{
i = 0;
}
memcpy(&context->buffer[index]&input[i]inputlen-i);
}
void MD5Final(MD5_CTX *contextunsigned char digest[16])
{
unsigned int index = 0padlen = 0;
unsigned char bits[8];
index = (context->count[0] >> 3) & 0x3F;
padlen = (index < 56)?(56-index):(120-index);
MD5Encode(bitscontext->count8);
MD5Update(contextPADDINGpadlen);
MD5Update(contextbits8);
MD5Encode(digestcontext->state16);
}
void MD5Encode(unsigned char *outputunsigned int *inputunsigned int len)
{
unsigned int i = 0j = 0;
while(j < len)
{
output[j] = input[i] & 0xFF;
output[j+1] = (input[i] >> 8) & 0xFF;
output[j+2] = (input[i] >> 16) & 0xFF;
output[j+3] = (input[i] >> 24) & 0xFF;
i++;
j+=4;
}
}
void MD5Decode(unsigned int *outputunsigned char *inputunsigned int len)
{
unsigned int i = 0j = 0;
while(j < len)
{
output[i] = (input[j]) |
(input[j+1] << 8) |
(input[j+2] << 16) |
(input[j+3] << 24);
i++;
j+=4;
}
}
void MD5Transform(unsigned int state[4]unsigned char block[64])
{
unsigned int a = state[0];
unsigned int b = state[1];
unsigned int c = state[2];
unsigned int d = state[3];
unsigned int x[64];
MD5Decode(xblock64);
FF(a b c d x[ 0] 7 0xd76aa478); /* 1 */
FF(d a b c x[ 1] 12 0xe8c7b756); /* 2 */
FF(c d a b x[ 2] 17 0x242070db); /* 3 */
FF(b c d a x[ 3] 22 0xc1bdceee); /* 4 */
FF(a b c d x[ 4] 7 0xf57c0faf); /* 5 */
FF(d a b c x[ 5] 12 0x4787c62a); /* 6 */
FF(c d a b x[ 6] 17 0xa8304613); /
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 5980 2014-02-23 23:04 src\md5.c
文件 1471 2016-11-15 20:38 src\md5.h
文件 599 2016-11-14 22:40 src\test.c
目录 0 2016-11-16 16:16 src
----------- --------- ---------- ----- ----
8050 4
- 上一篇:C++五子棋源码有AI,先手禁手
- 下一篇:c语言实现中缀表达式转后缀并求值
相关资源
- c语言实现中缀表达式转后缀并求值
- 非线性最小二乘法C语言代码
- C语言设计一元稀疏多项式课程设计
- c语言回溯法走迷宫的源码
- 数据结构之迷宫求解完整代码(C语言
- 单片机 C语言温度控制程序
- 51单片机-光立方-C语言
- 课程设计 c语言 学生选课系统
- C语言 人事管理系统
- c语言实现考试管理系统选择题
- 课程信息管理系统 C语言版本 C语言
- 中国大学MOOC-翁恺-C语言程序设计习题
- c语言多线程计算PI
- 东北大学课程设计—编译原理课程设
- 这是用C语言实现模糊控制的算法程序
- 滴水逆向 文件操作pe修改C语言源代码
- C语言:中缀算术表达式求值栈 附答案
- 用C语言实现DPSK数字信号调制
- 单片机电子琴设计用C语言编写
- 基于Linux消息队列的简易聊天室(C语
- C语言高级编程技术 很好的一本书
- C语言矩阵相乘动态数组,文件读写
- 步进伺服电机加减速控制C语言
- 模拟文件系统的c语言实现
- (严蔚敏)数据结构视频教程C语言版
- c语言车票管理系统
- C 经典100例 C语言的经典小程序,100个
- 编写C语言程序,模拟UNIX磁盘空间管理
- 基于C语言实现的网络爬虫
- 国密SM4的5中模式C语言实现,vs工程,
评论
共有 条评论