亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

計算文件MD5 (C++)

2019-11-06 06:49:51
字體:
來源:轉載
供稿:網友

說明

md5算法詳見 rfc1321,其中包含了一個c的算法,這里略作整理,并加入了計算文件MD5的代碼。

實現

md5global.h, md5.h, md5.cpp 為rfc1321中提供的代碼

md5global.h:

/* GLOBAL.H - RSAREF types and constants*//* PROTOTYPES should be set to one if and only if the compiler supportsfunction argument prototyping.The following makes PROTOTYPES default to 0 if it has not alreadybeen defined with C compiler flags.*/#ifndef MD5_GLOBAL_H#define MD5_GLOBAL_H/* POINTER defines a generic pointer type */typedef unsigned char *POINTER;/* UINT2 defines a two byte Word */typedef unsigned short int UINT2;/* UINT4 defines a four byte word */typedef unsigned long int UINT4;#endif

md5.h:

/* MD5.H - header file for MD5C.C*//* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. Allrights reserved.License to copy and use this software is granted provided that itis identified as the "RSA Data Security, Inc. MD5 Message-DigestAlgorithm" in all material mentioning or referencing this softwareor this function.License is also granted to make and use derivative works providedthat such works are identified as "derived from the RSA DataSecurity, Inc. MD5 Message-Digest Algorithm" in all materialmentioning or referencing the derived work.RSA Data Security, Inc. makes no representations concerning eitherthe merchantability of this software or the suitability of thissoftware for any particular purpose. It is provided "as is"without express or implied warranty of any kind.These notices must be retained in any copies of any part of thisdocumentation and/or software.*/#ifndef MD5_H#define MD5_H/* MD5 context. */typedef struct { UINT4 state[4]; /* state (ABCD) */ UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */ unsigned char buffer[64]; /* input buffer */} MD5_CTX;void MD5Init(MD5_CTX *);void MD5Update(MD5_CTX *, unsigned char *, unsigned int);void MD5Final(unsigned char[16], MD5_CTX *);#endif

md5.cpp:

/* MD5.C - RSA Data Security, Inc., MD5 message-digest algorithm*//* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. Allrights reserved.License to copy and use this software is granted provided that itis identified as the "RSA Data Security, Inc. MD5 Message-DigestAlgorithm" in all material mentioning or referencing this softwareor this function.License is also granted to make and use derivative works providedthat such works are identified as "derived from the RSA DataSecurity, Inc. MD5 Message-Digest Algorithm" in all materialmentioning or referencing the derived work.RSA Data Security, Inc. makes no representations concerning eitherthe merchantability of this software or the suitability of thissoftware for any particular purpose. It is provided "as is"without express or implied warranty of any kind.These notices must be retained in any copies of any part of thisdocumentation and/or software.*/#include "md5global.h"#include "md5.h"/* 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 21static void MD5Transform(UINT4[4], unsigned char[64]);static void Encode(unsigned char *, UINT4 *, unsigned int);static void Decode(UINT4 *, unsigned char *, unsigned int);static void MD5_memcpy(POINTER, POINTER, unsigned int);static void MD5_memset(POINTER, int, unsigned int);static unsigned char 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};/* 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) + (UINT4)(ac); / (a) = ROTATE_LEFT ((a), (s)); /(a) += (b); /}#define GG(a, b, c, d, x, s, ac) { / (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); / (a) = ROTATE_LEFT ((a), (s)); / (a) += (b); / }#define HH(a, b, c, d, x, s, ac) { / (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); / (a) = ROTATE_LEFT ((a), (s)); / (a) += (b); / }#define II(a, b, c, d, x, s, ac) { / (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); / (a) = ROTATE_LEFT ((a), (s)); / (a) += (b); / }/* MD5 initialization. Begins an MD5 Operation, writing a new context.*/void MD5Init(MD5_CTX *context) /* context */{ context->count[0] = context->count[1] = 0; /* Load magic initialization constants. */ context->state[0] = 0x67452301; context->state[1] = 0xefcdab89; context->state[2] = 0x98badcfe; context->state[3] = 0x10325476;}/* MD5 block update operation. Continues an MD5 message-digestoperation, processing another message block, and updating thecontext.*/void MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputLen){ unsigned int i, index, partLen; /* Compute number of bytes mod 64 */ index = (unsigned int)((context->count[0] >> 3) & 0x3F); /* Update number of bits */ if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3)) context->count[1]++; context->count[1] += ((UINT4)inputLen >> 29); partLen = 64 - index; /* Transform as many times as possible. */ if (inputLen >= partLen) { MD5_memcpy ((POINTER)&context->buffer[index], (POINTER)input, partLen); MD5Transform(context->state, context->buffer); for (i = partLen; i + 63 < inputLen; i += 64) MD5Transform(context->state, &input[i]); index = 0; } else i = 0; /* Buffer remaining input */ MD5_memcpy ((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen - i);}/* MD5 finalization. Ends an MD5 message-digest operation, writing thethe message digest and zeroizing the context.*/void MD5Final(unsigned char digest[16], MD5_CTX *context){ unsigned char bits[8]; unsigned int index, padLen; /* Save number of bits */ Encode(bits, context->count, 8); /* Pad out to 56 mod 64. */ index = (unsigned int)((context->count[0] >> 3) & 0x3f); padLen = (index < 56) ? (56 - index) : (120 - index); MD5Update(context, PADDING, padLen); /* Append length (before padding) */ MD5Update(context, bits, 8); /* Store state in digest */ Encode(digest, context->state, 16); /* Zeroize sensitive information. */ MD5_memset((POINTER)context, 0, sizeof(*context));}/* MD5 basic transformation. Transforms state based on block.*/static void MD5Transform(UINT4 state[4], unsigned char block[64]){ UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; Decode(x, block, 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 */ GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */ GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */ GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */ GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */ GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ /* Round 3 */ HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */ HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */ HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */ HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */ HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */ HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */ HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */ HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */ HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */ HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */ /* Round 4 */ II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */ II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */ II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */ II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */ II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */ II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */ II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */ II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */ II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */ II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */ state[0] += a; state[1] += b; state[2] += c; state[3] += d; /* Zeroize sensitive information. */ MD5_memset((POINTER)x, 0, sizeof(x));}/* Encodes input (UINT4) into output (unsigned char). Assumes len isa multiple of 4.*/static void Encode(unsigned char *output, UINT4 *input, unsigned int len){ unsigned int i, j; for (i = 0, j = 0; j < len; i++, j += 4) { output[j] = (unsigned char)(input[i] & 0xff); output[j + 1] = (unsigned char)((input[i] >> 8) & 0xff); output[j + 2] = (unsigned char)((input[i] >> 16) & 0xff); output[j + 3] = (unsigned char)((input[i] >> 24) & 0xff); }}/* Decodes input (unsigned char) into output (UINT4). Assumes len isa multiple of 4.*/static void Decode(UINT4 *output, unsigned char *input, unsigned int len){ unsigned int i, j; for (i = 0, j = 0; j < len; i++, j += 4) output[i] = ((UINT4)input[j]) | (((UINT4)input[j + 1]) << 8) | (((UINT4)input[j + 2]) << 16) | (((UINT4)input[j + 3]) << 24);}/* Note: Replace "for loop" with standard memcpy if possible.*/static void MD5_memcpy(POINTER output, POINTER input, unsigned int len){ unsigned int i; for (i = 0; i < len; i++) output[i] = input[i];}/* Note: Replace "for loop" with standard memset if possible.*/static void MD5_memset(POINTER output, int value, unsigned int len){ unsigned int i; for (i = 0; i < len; i++) ((char *)output)[i] = (char)value;}

log.h 是用來簡單記錄日志的

// log.h#ifndef LOG_H#define LOG_H#include <fstream>#include <iostream>#include <atltime.h>#include <atlstr.h>#include <ShlObj.h>extern std::string logFile;#define __FILENAME__ (strrchr(__FILE__, '//') ? (strrchr(__FILE__, '//') + 1) : __FILE__)#define LOG(msg) / do / {/ std::ofstream fout(logFile.c_str(), std::ios::out | std::ios::app);/ if (fout)/ {/ CTime curTime = CTime::GetCurrentTime();/ CStringA str = curTime.Format(TEXT("[%Y-%m-%d %H:%M:%S] "));/ DWORD dwThreadId = GetCurrentThreadId();/ fout << str.GetBuffer() << dwThreadId << " " << __FILENAME__ << "(" << __LINE__ << ") " << msg << std::endl;/ std::cout << str.GetBuffer() << dwThreadId << " " << __FILENAME__ << "(" << __LINE__ << ") " << msg << std::endl;/ fout.close();/ }/ } while (false)#endif

md5file.h 計算文件md5頭文件

#ifndef MD5FILE_H#define MD5FILE_H#include <string>std::string getFileMD5(const std::string& filename);#endif

md5file.cpp 計算文件md5實現

#include "md5file.h"#include "md5global.h"#include "md5.h"#include "log.h"#include <fstream>#include <iostream>#include <sstream>#include <memory>#include <iomanip>#include <exception>std::string getFileMD5(const std::string& filename){ std::ifstream fin(filename.c_str(), std::ifstream::in | std::ifstream::binary); if (fin) { // get length of file: fin.seekg(0, fin.end); unsigned int length = static_cast<int>(fin.tellg()); fin.seekg(0, fin.beg); std::unique_ptr<unsigned char[]> buffer{ new unsigned char[length] {} }; fin.read(reinterpret_cast<char*>(buffer.get()), length); if (!fin) { LOG(filename << " can't be read"); fin.close(); std::ostringstream oss; oss << "FATAL ERROR: " << filename << " can't be read" << std::ends; throw std::runtime_error(oss.str()); } fin.close(); MD5_CTX context; MD5Init(&context); MD5Update(&context, buffer.get(), length); unsigned char digest[16]; MD5Final(digest, &context); std::ostringstream oss; for (int i = 0; i < 16; ++i) { oss << std::hex << std::setw(2) << std::setfill('0') << static_cast<unsigned int>(digest[i]); } oss << std::endl; return std::move(oss.str()); } else { LOG(filename << " can't be opened"); std::ostringstream oss; oss << "FATAL ERROR: " << filename << " can't be opened" << std::ends; throw std::runtime_error(oss.str()); }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品色婷婷视频| 亚洲国产精品高清久久久| 精品久久久视频| 一夜七次郎国产精品亚洲| 欧美一区视频在线| 欧美在线视频网站| 亚洲欧洲免费视频| 久久久久五月天| 国产在线高清精品| 狠狠干狠狠久久| 日本精品性网站在线观看| 亚洲国产精品久久久久久| 欧美乱大交做爰xxxⅹ性3| 日韩在线免费观看视频| 精品国产电影一区| 一区二区日韩精品| 亚洲国产精品va在看黑人| 亚洲国产精品专区久久| 在线观看日韩www视频免费| 北条麻妃一区二区三区中文字幕| 欧美中文字幕在线视频| 亚洲一区亚洲二区亚洲三区| 欧美激情女人20p| 九九久久久久99精品| 夜夜狂射影院欧美极品| 久久久免费精品| 久久久久国色av免费观看性色| 久久av红桃一区二区小说| 日韩美女中文字幕| 国产精品扒开腿爽爽爽视频| 久久精品视频在线观看| 国产成人综合av| 国产97在线|亚洲| 久久久久五月天| 国产一区欧美二区三区| 一区二区三区四区在线观看视频| 91tv亚洲精品香蕉国产一区7ujn| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美寡妇偷汉性猛交| 自拍偷拍免费精品| 亚洲欧美中文日韩在线v日本| 欧美性videos高清精品| 久久成人综合视频| 亚洲在线免费视频| 亚洲www在线| 久久久91精品国产| 久久激情视频久久| 国产精品揄拍一区二区| 亚洲精品资源美女情侣酒店| 这里只有精品视频| 欧美成人精品激情在线观看| 国产精品麻豆va在线播放| 欧美放荡办公室videos4k| 成人激情春色网| 日韩美女av在线| 亚洲最大成人免费视频| 欧美午夜影院在线视频| 欧美精品999| 亚洲福利小视频| 国产精品久在线观看| 国产91色在线免费| 国产成人综合亚洲| 91久久精品国产91久久性色| 国产日韩欧美黄色| 法国裸体一区二区| 成人日韩av在线| 欧美激情视频给我| 欧美极品少妇xxxxⅹ免费视频| 亚洲奶大毛多的老太婆| 日韩亚洲欧美成人| 日韩欧美黄色动漫| 伊人久久精品视频| 欧美刺激性大交免费视频| 欧美视频中文在线看| 精品国产31久久久久久| www.久久久久| 欧美激情欧美狂野欧美精品| 中文字幕日本精品| 日本国产一区二区三区| 日本久久久久亚洲中字幕| 亚洲欧美激情另类校园| 在线观看欧美日韩| 欧美中文字幕在线播放| 91在线视频导航| 久久综合免费视频影院| 久久久久日韩精品久久久男男| 欧美激情第三页| 国产成人鲁鲁免费视频a| www日韩中文字幕在线看| 欧洲一区二区视频| 日韩免费av一区二区| 成人免费看片视频| 国产成人短视频| 4444欧美成人kkkk| 成人黄色在线免费| 亚洲精品国产精品国产自| 少妇激情综合网| 欧美性极品少妇精品网站| 日韩电影免费在线观看| 美女啪啪无遮挡免费久久网站| 色小说视频一区| 亚洲综合日韩中文字幕v在线| 日韩在线免费高清视频| 国产精品亚洲一区二区三区| 国产成人精品在线播放| 午夜精品视频在线| 亚洲偷熟乱区亚洲香蕉av| 国产精品国语对白| 国外成人性视频| 激情av一区二区| 色诱女教师一区二区三区| 国产成人啪精品视频免费网| 欧美黑人xxxⅹ高潮交| 久久色在线播放| 韩国国内大量揄拍精品视频| 国产精品男人爽免费视频1| 欧美激情精品久久久久久黑人| 久久99亚洲热视| 国产精品日韩欧美综合| 欧美专区第一页| 亚洲女人被黑人巨大进入| 中文字幕综合在线| 久久久久久成人精品| 色久欧美在线视频观看| 欧美俄罗斯乱妇| 亚洲已满18点击进入在线看片| 亚洲国产精品成人一区二区| 在线播放日韩欧美| 国产精品wwwwww| 欧美高清在线播放| 精品久久中文字幕久久av| 成人欧美一区二区三区在线| 色av吧综合网| 国产精品a久久久久久| 亚洲精品视频中文字幕| 亚洲综合日韩中文字幕v在线| 欧美日韩中文字幕日韩欧美| 日本一区二区在线免费播放| 国产69精品久久久| 精品免费在线观看| 久久97久久97精品免视看| 亚洲欧洲在线看| 日韩av在线免费播放| 欧美日韩激情小视频| 91久久国产综合久久91精品网站| 夜夜躁日日躁狠狠久久88av| 欧美性极品xxxx娇小| 国产美女精品视频| 91国偷自产一区二区三区的观看方式| 欧美激情第一页xxx| 国内外成人免费激情在线视频| 欧美插天视频在线播放| 日韩av在线网站| 亚洲欧美国产高清va在线播| 欧美视频在线观看免费网址| 国产一区二区精品丝袜| 亚洲男人天堂2023| 亚洲人成亚洲人成在线观看| 欧美肥婆姓交大片| 国产自产女人91一区在线观看| 亚洲精品98久久久久久中文字幕| 亚洲电影av在线| 欧美综合激情网| 久久亚洲国产精品成人av秋霞|