• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++ MD5的源码实例详解

C++ MD5的源码实例详解

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++ md5,md5加密算法c++实现,md5算法详解,md5详解,md5加密详解等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

C++ MD5源码:

md5.h:

#ifndef MD5_H 
#define MD5_H 
 
#include <string> 
#include <fstream> 
 
/* Type define */ 
typedef unsigned char byte; 
typedef unsigned int uint32; 
 
using std::string; 
using std::ifstream; 
 
/* MD5 declaration. */ 
class MD5 { 
public: 
 MD5(); 
 MD5(const void *input, size_t length); 
 MD5(const string &str); 
 MD5(ifstream &in); 
 void update(const void *input, size_t length); 
 void update(const string &str); 
 void update(ifstream &in); 
 const byte* digest(); 
 string toString(); 
 void reset(); 
private: 
 void update(const byte *input, size_t length); 
 void final(); 
 void transform(const byte block[64]); 
 void encode(const uint32 *input, byte *output, size_t length); 
 void decode(const byte *input, uint32 *output, size_t length); 
 string bytesToHexString(const byte *input, size_t length); 
 
 /* class uncopyable */ 
 MD5(const MD5&); 
 MD5& operator=(const MD5&); 
private: 
 uint32 _state[4]; /* state (ABCD) */ 
 uint32 _count[2]; /* number of bits, modulo 2^64 (low-order word first) */ 
 byte _buffer[64]; /* input buffer */ 
 byte _digest[16]; /* message digest */ 
 bool _finished; /* calculate finished ? */ 
 
 static const byte PADDING[64]; /* padding for calculate */ 
 static const char HEX[16]; 
 static const size_t BUFFER_SIZE = 1024; 
}; 
 
#endif/*MD5_H*/ 

</div>

md5.cpp:

#include "md5.h" 
 
using namespace std; 
 
/* Constants for MD5Transform routine. */ 
#define S11 7 
#define S12 12 
#define S13 17 
#define S14 22 
#define S21 5 
#define S22 9 
#define S23 14 
#define S24 20 
#define S31 4 
#define S32 11 
#define S33 16 
#define S34 23 
#define S41 6 
#define S42 10 
#define S43 15 
#define S44 21 
 
 
/* F, G, H and I are basic MD5 functions. 
*/ 
#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) 
#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) 
#define H(x, y, z) ((x) ^ (y) ^ (z)) 
#define I(x, y, z) ((y) ^ ((x) | (~z))) 
 
/* ROTATE_LEFT rotates x left n bits. 
*/ 
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) 
 
/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. 
Rotation is separate from addition to prevent recomputation. 
*/ 
#define FF(a, b, c, d, x, s, ac) { \ 
 (a) += F ((b), (c), (d)) + (x) + ac; \ 
 (a) = ROTATE_LEFT ((a), (s)); \ 
 (a) += (b); \ 
} 
#define GG(a, b, c, d, x, s, ac) { \ 
 (a) += G ((b), (c), (d)) + (x) + ac; \ 
 (a) = ROTATE_LEFT ((a), (s)); \ 
 (a) += (b); \ 
} 
#define HH(a, b, c, d, x, s, ac) { \ 
 (a) += H ((b), (c), (d)) + (x) + ac; \ 
 (a) = ROTATE_LEFT ((a), (s)); \ 
 (a) += (b); \ 
} 
#define II(a, b, c, d, x, s, ac) { \ 
 (a) += I ((b), (c), (d)) + (x) + ac; \ 
 (a) = ROTATE_LEFT ((a), (s)); \ 
 (a) += (b); \ 
} 
 
 
const byte MD5::PADDING[64] = { 0x80 }; 
const char MD5::HEX[16] = { 
 '0', '1', '2', '3', 
 '4', '5', '6', '7', 
 '8', '9', 'a', 'b', 
 'c', 'd', 'e', 'f' 
}; 
 
/* Default construct. */ 
MD5::MD5() { 
 reset(); 
} 
 
/* Construct a MD5 object with a input buffer. */ 
MD5::MD5(const void *input, size_t length) { 
 reset(); 
 update(input, length); 
} 
 
/* Construct a MD5 object with a string. */ 
MD5::MD5(const string &str) { 
 reset(); 
 update(str); 
} 
 
/* Construct a MD5 object with a file. */ 
MD5::MD5(ifstream &in) { 
 reset(); 
 update(in); 
} 
 
/* Return the message-digest */ 
const byte* MD5::digest() { 
 if (!_finished) { 
 _finished = true; 
 final(); 
 } 
 return _digest; 
} 
 
/* Reset the calculate state */ 
void MD5::reset() { 
 
 _finished = false; 
 /* reset number of bits. */ 
 _count[0] = _count[1] = 0; 
 /* Load magic initialization constants. */ 
 _state[0] = 0x67452301; 
 _state[1] = 0xefcdab89; 
 _state[2] = 0x98badcfe; 
 _state[3] = 0x10325476; 
} 
 
/* Updating the context with a input buffer. */ 
void MD5::update(const void *input, size_t length) { 
 update((const byte*)input, length); 
} 
 
/* Updating the context with a string. */ 
void MD5::update(const string &str) { 
 update((const byte*)str.c_str(), str.length()); 
} 
 
/* Updating the context with a file. */ 
void MD5::update(ifstream &in) { 
 
 if (!in) 
 return; 
 
 std::streamsize length; 
 char buffer[BUFFER_SIZE]; 
 while (!in.eof()) { 
 in.read(buffer, BUFFER_SIZE); 
 length = in.gcount(); 
 if (length > 0) 
  update(buffer, length); 
 } 
 in.close(); 
} 
 
/* MD5 block update operation. Continues an MD5 message-digest 
operation, processing another message block, and updating the 
context. 
*/ 
void MD5::update(const byte *input, size_t length) { 
 
 uint32 i, index, partLen; 
 
 _finished = false; 
 
 /* Compute number of bytes mod 64 */ 
 index = (uint32)((_count[0] >> 3) & 0x3f); 
 
 /* update number of bits */ 
 if((_count[0] += ((uint32)length << 3)) < ((uint32)length << 3)) 
 _count[1]++; 
 _count[1] += ((uint32)length >> 29); 
 
 partLen = 64 - index; 
 
 /* transform as many times as possible. */ 
 if(length >= partLen) { 
 
 memcpy(&_buffer[index], input, partLen); 
 transform(_buffer); 
 
 for (i = partLen; i + 63 < length; i += 64) 
  transform(&input[i]); 
 index = 0; 
 
 } else { 
 i = 0; 
 } 
 
 /* Buffer remaining input */ 
 memcpy(&_buffer[index], &input[i], length-i); 
} 
 
/* MD5 finalization. Ends an MD5 message-_digest operation, writing the 
the message _digest and zeroizing the context. 
*/ 
void MD5::final() { 
 
 byte bits[8]; 
 uint32 oldState[4]; 
 uint32 oldCount[2]; 
 uint32 index, padLen; 
 
 /* Save current state and count. */ 
 memcpy(oldState, _state, 16); 
 memcpy(oldCount, _count, 8); 
 
 /* Save number of bits */ 
 encode(_count, bits, 8); 
 
 /* Pad out to 56 mod 64. */ 
 index = (uint32)((_count[0] >> 3) & 0x3f); 
 padLen = (index < 56) ? (56 - index) : (120 - index); 
 update(PADDING, padLen); 
 
 /* Append length (before padding) */ 
 update(bits, 8); 
 
 /* Store state in digest */ 
 encode(_state, _digest, 16); 
 
 /* Restore current state and count. */ 
 memcpy(_state, oldState, 16); 
 memcpy(_count, oldCount, 8); 
} 
 
/* MD5 basic transformation. Transforms _state based on block. */ 
void MD5::transform(const byte block[64]) { 
 
 uint32 a = _state[0], b = _state[1], c = _state[2], d = _state[3], x[16]; 
 
 decode(block, x, 64); 
 
 /* Round 1 */ 
 FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ 
 FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ 
 FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ 
 FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ 
 FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ 
 FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ 
 FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ 
 FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ 
 FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ 
 FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ 
 FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ 
 FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ 
 FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ 
 FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ 
 FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ 
 FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ 
 
 /* Round 2 */ 
 GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ 
 GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ 
 GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ 
 GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ 
 GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ 
 GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ 
 GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ 
 GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ 
 GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ 
 G



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++ MD5的源码实例详解
  • c++实现MD5算法实现代码

相关文章

  • 2017-05-28C语言中进制知识汇总
  • 2017-05-28linux C++ 获取文件绝对路径的实例代码
  • 2017-05-28C语言二叉树的非递归遍历实例分析
  • 2017-05-28MFC对话框中添加状态栏的方法
  • 2022-04-30C语言fgetc和fputc函数用法详解(以字符形式读写文件)
  • 2017-05-28关闭显示器软件代码分享
  • 2017-05-28C/C++的浮点数在内存中的存储方式分析及实例
  • 2017-05-28指针操作数组的两种方法(总结)
  • 2017-05-28C++11新特性中auto 和 decltype 区别和联系
  • 2017-05-28C++中拷贝构造函数的应用详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 如何利用tinyxml操纵xml及注意问题
    • Linux网络编程之基于UDP实现可靠的文件传输示例
    • 浅析直接插入排序与折半插入排序
    • Visual C++中Tab View的多种实现方法
    • C语言中打印特殊图案的实现代码
    • 浅谈哈希表存储效率一般不超过50%的原因
    • 哈夫曼算法构造代码
    • C/C++实现矩阵的转置(示例代码)
    • Linux环境下段错误的产生原因及调试方法小结
    • C++设计类不能被继承的方法实例讲解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有