栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ MD5的源码实例详解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ MD5的源码实例详解

C++ MD5源码:

md5.h:

#ifndef MD5_H 
#define MD5_H 
 
#include  
#include  
 
 
typedef unsigned char byte; 
typedef unsigned int uint32; 
 
using std::string; 
using std::ifstream; 
 
 
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); 
 
  
 MD5(const MD5&); 
 MD5& operator=(const MD5&); 
private: 
 uint32 _state[4];  
 uint32 _count[2];  
 byte _buffer[64];  
 byte _digest[16];  
 bool _finished;  
 
 static const byte PADDING[64];  
 static const char HEX[16]; 
 static const size_t BUFFER_SIZE = 1024; 
}; 
 
#endif 

md5.cpp:

#include "md5.h" 
 
using namespace std; 
 
 
#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 
 
 
 
#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))) 
 
 
#define ROTATE_LEFt(x, n) (((x) << (n)) | ((x) >> (32-(n)))) 
 
 
#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' 
}; 
 
 
MD5::MD5() { 
 reset(); 
} 
 
 
MD5::MD5(const void *input, size_t length) { 
 reset(); 
 update(input, length); 
} 
 
 
MD5::MD5(const string &str) { 
 reset(); 
 update(str); 
} 
 
 
MD5::MD5(ifstream &in) { 
 reset(); 
 update(in); 
} 
 
 
const byte* MD5::digest() { 
 if (!_finished) { 
 _finished = true; 
 final(); 
 } 
 return _digest; 
} 
 
 
void MD5::reset() { 
 
 _finished = false; 
  
 _count[0] = _count[1] = 0; 
  
 _state[0] = 0x67452301; 
 _state[1] = 0xefcdab89; 
 _state[2] = 0x98badcfe; 
 _state[3] = 0x10325476; 
} 
 
 
void MD5::update(const void *input, size_t length) { 
 update((const byte*)input, length); 
} 
 
 
void MD5::update(const string &str) { 
 update((const byte*)str.c_str(), str.length()); 
} 
 
 
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(); 
} 
 
 
void MD5::update(const byte *input, size_t length) { 
 
 uint32 i, index, partLen; 
 
 _finished = false; 
 
  
 index = (uint32)((_count[0] >> 3) & 0x3f); 
 
  
 if((_count[0] += ((uint32)length << 3)) < ((uint32)length << 3)) 
 _count[1]++; 
 _count[1] += ((uint32)length >> 29); 
 
 partLen = 64 - index; 
 
  
 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; 
 } 
 
  
 memcpy(&_buffer[index], &input[i], length-i); 
} 
 
 
void MD5::final() { 
 
 byte bits[8]; 
 uint32 oldState[4]; 
 uint32 oldCount[2]; 
 uint32 index, padLen; 
 
  
 memcpy(oldState, _state, 16); 
 memcpy(oldCount, _count, 8); 
 
  
 encode(_count, bits, 8); 
 
  
 index = (uint32)((_count[0] >> 3) & 0x3f); 
 padLen = (index < 56) ? (56 - index) : (120 - index); 
 update(PADDING, padLen); 
 
  
 update(bits, 8); 
 
  
 encode(_state, _digest, 16); 
 
  
 memcpy(_state, oldState, 16); 
 memcpy(_count, oldCount, 8); 
} 
 
 
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); 
 
  
 FF (a, b, c, d, x[ 0], S11, 0xd76aa478);  
 FF (d, a, b, c, x[ 1], S12, 0xe8c7b756);  
 FF (c, d, a, b, x[ 2], S13, 0x242070db);  
 FF (b, c, d, a, x[ 3], S14, 0xc1bdceee);  
 FF (a, b, c, d, x[ 4], S11, 0xf57c0faf);  
 FF (d, a, b, c, x[ 5], S12, 0x4787c62a);  
 FF (c, d, a, b, x[ 6], S13, 0xa8304613);  
 FF (b, c, d, a, x[ 7], S14, 0xfd469501);  
 FF (a, b, c, d, x[ 8], S11, 0x698098d8);  
 FF (d, a, b, c, x[ 9], S12, 0x8b44f7af);  
 FF (c, d, a, b, x[10], S13, 0xffff5bb1);  
 FF (b, c, d, a, x[11], S14, 0x895cd7be);  
 FF (a, b, c, d, x[12], S11, 0x6b901122);  
 FF (d, a, b, c, x[13], S12, 0xfd987193);  
 FF (c, d, a, b, x[14], S13, 0xa679438e);  
 FF (b, c, d, a, x[15], S14, 0x49b40821);  
 
  
 GG (a, b, c, d, x[ 1], S21, 0xf61e2562);  
 GG (d, a, b, c, x[ 6], S22, 0xc040b340);  
 GG (c, d, a, b, x[11], S23, 0x265e5a51);  
 GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa);  
 GG (a, b, c, d, x[ 5], S21, 0xd62f105d);  
 GG (d, a, b, c, x[10], S22, 0x2441453);  
 GG (c, d, a, b, x[15], S23, 0xd8a1e681);  
 GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8);  
 GG (a, b, c, d, x[ 9], S21, 0x21e1cde6);  
 GG (d, a, b, c, x[14], S22, 0xc33707d6);  
 GG (c, d, a, b, x[ 3], S23, 0xf4d50d87);  
 GG (b, c, d, a, x[ 8], S24, 0x455a14ed);  
 GG (a, b, c, d, x[13], S21, 0xa9e3e905);  
 GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8);  
 GG (c, d, a, b, x[ 7], S23, 0x676f02d9);  
 GG (b, c, d, a, x[12], S24, 0x8d2a4c8a);  
 
  
 HH (a, b, c, d, x[ 5], S31, 0xfffa3942);  
 HH (d, a, b, c, x[ 8], S32, 0x8771f681);  
 HH (c, d, a, b, x[11], S33, 0x6d9d6122);  
 HH (b, c, d, a, x[14], S34, 0xfde5380c);  
 HH (a, b, c, d, x[ 1], S31, 0xa4beea44);  
 HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9);  
 HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60);  
 HH (b, c, d, a, x[10], S34, 0xbebfbc70);  
 HH (a, b, c, d, x[13], S31, 0x289b7ec6);  
 HH (d, a, b, c, x[ 0], S32, 0xeaa127fa);  
 HH (c, d, a, b, x[ 3], S33, 0xd4ef3085);  
 HH (b, c, d, a, x[ 6], S34, 0x4881d05);  
 HH (a, b, c, d, x[ 9], S31, 0xd9d4d039);  
 HH (d, a, b, c, x[12], S32, 0xe6db99e5);  
 HH (c, d, a, b, x[15], S33, 0x1fa27cf8);  
 HH (b, c, d, a, x[ 2], S34, 0xc4ac5665);  
 
  
 II (a, b, c, d, x[ 0], S41, 0xf4292244);  
 II (d, a, b, c, x[ 7], S42, 0x432aff97);  
 II (c, d, a, b, x[14], S43, 0xab9423a7);  
 II (b, c, d, a, x[ 5], S44, 0xfc93a039);  
 II (a, b, c, d, x[12], S41, 0x655b59c3);  
 II (d, a, b, c, x[ 3], S42, 0x8f0ccc92);  
 II (c, d, a, b, x[10], S43, 0xffeff47d);  
 II (b, c, d, a, x[ 1], S44, 0x85845dd1);  
 II (a, b, c, d, x[ 8], S41, 0x6fa87e4f);  
 II (d, a, b, c, x[15], S42, 0xfe2ce6e0);  
 II (c, d, a, b, x[ 6], S43, 0xa3014314);  
 II (b, c, d, a, x[13], S44, 0x4e0811a1);  
 II (a, b, c, d, x[ 4], S41, 0xf7537e82);  
 II (d, a, b, c, x[11], S42, 0xbd3af235);  
 II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb);  
 II (b, c, d, a, x[ 9], S44, 0xeb86d391);  
 
 _state[0] += a; 
 _state[1] += b; 
 _state[2] += c; 
 _state[3] += d; 
} 
 
 
void MD5::encode(const uint32 *input, byte *output, size_t length) { 
 
 for(size_t i=0, j=0; j> 8) & 0xff); 
 output[j+2] = (byte)((input[i] >> 16) & 0xff); 
 output[j+3] = (byte)((input[i] >> 24) & 0xff); 
 } 
} 
 
 
void MD5::decode(const byte *input, uint32 *output, size_t length) { 
 
 for(size_t i=0, j=0; j

测试文件test.cpp:

#include "md5.h" 
#include  
 
using namespace std; 
 
void PrintMD5(const string &str, MD5 &md5) { 
 cout << "MD5("" << str << "") = " << md5.toString() << endl; 
} 
 
string FileDigest(const string &file) { 
 
 ifstream in(file.c_str(), ios::binary); 
 if (!in) 
 return ""; 
 
 MD5 md5; 
 std::streamsize length; 
 char buffer[1024]; 
 while (!in.eof()) { 
 in.read(buffer, 1024); 
 length = in.gcount(); 
 if (length > 0) 
  md5.update(buffer, length); 
 } 
 in.close(); 
 return md5.toString(); 
} 
 
int main() { 
 
 cout << MD5("abc").toString() << endl; 
 cout << MD5(ifstream("D:\test.txt")).toString() << endl; 
 cout << MD5(ifstream("D:\test.exe", ios::binary)).toString() << endl; 
 cout << FileDigest("D:\test.exe") << endl; 
 
 MD5 md5; 
 md5.update(""); 
 PrintMD5("", md5); 
 
 md5.update("a"); 
 PrintMD5("a", md5); 
 
 md5.update("bc"); 
 PrintMD5("abc", md5); 
 
 md5.update("defghijklmnopqrstuvwxyz"); 
 PrintMD5("abcdefghijklmnopqrstuvwxyz", md5); 
 
 md5.reset(); 
 md5.update("message digest"); 
 PrintMD5("message digest", md5); 
 
 md5.reset(); 
 md5.update(ifstream("D:\test.txt")); 
 PrintMD5("D:\test.txt", md5); 
 return 0; 
} 

类MD5封装了与MD5相关的操作,其有

4个构造函数:

MD5();   //默认构造函数
MD5(const void *input, size_t length);   //输入内存地址与长度信息的构造函数
MD5(const string &str);      //输入字符串的构造函数
MD5(ifstream &in);//输入流的构造函数
3个Update函数:
void update(const void *input, size_t length); //往MD5对象内添加内存块
void update(const string &str);    //添加字符串
void update(ifstream &in);     //添加流

const byte* digest();//计算MD5码,并返回指向它的指针
string toString();//计算MD5,并返回其对应的字符串
void reset(); //重置,



test.cpp文件内的main函数描述了MD5类的用法。

相关文章:

C++ MD5源码:https://www.jb51.net/article/103113.htm

C语言 MD5源码:https://www.jb51.net/article/103108.htm

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/63899.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号