时间:2021-05-20
在网上找了份c++ MD5的代码,就简单保存一下:
首先md5.h
#ifndef MD5_H #define MD5_H #include <string> #include <fstream> typedef unsigned char byte; typedef unsigned long ulong; 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 ulong *input, byte *output, size_t length); void decode(const byte *input, ulong *output, size_t length); string bytesToHexString(const byte *input, size_t length); MD5(const MD5&); MD5& operator=(const MD5&); private: ulong _state[4]; ulong _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) { ulong i, index, partLen; _finished = false; index = (ulong)((_count[0] >> 3) & 0x3f); if((_count[0] += ((ulong)length << 3)) < ((ulong)length << 3)) _count[1]++; _count[1] += ((ulong)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]; ulong oldState[4]; ulong oldCount[2]; ulong index, padLen; memcpy(oldState, _state, 16); memcpy(oldCount, _count, 8); encode(_count, bits, 8); index = (ulong)((_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]) { ulong 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 ulong *input, byte *output, size_t length) { for(size_t i=0, j=0; j<length; i++, j+=4) { output[j]= (byte)(input[i] & 0xff); output[j+1] = (byte)((input[i] >> 8) & 0xff); output[j+2] = (byte)((input[i] >> 16) & 0xff); output[j+3] = (byte)((input[i] >> 24) & 0xff); } } void MD5::decode(const byte *input, ulong *output, size_t length) { for(size_t i=0, j=0; j<length; i++, j+=4) { output[i] = ((ulong)input[j]) | (((ulong)input[j+1]) << 8) | (((ulong)input[j+2]) << 16) | (((ulong)input[j+3]) << 24); } } string MD5::bytesToHexString(const byte *input, size_t length) { string str; str.reserve(length << 1); for(size_t i = 0; i < length; i++) { int t = input[i]; int a = t / 16; int b = t % 16; str.append(1, HEX[a]); str.append(1, HEX[b]); } return str; } string MD5::toString() { return bytesToHexString(digest(), 16); }//test.cpp
#include "md5.h" #include <iostream> 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 << FileDigest("D:\\staticDll.dll") << endl; return 0; }最后main函数中,一个是生成字符串的md5码,另外一个是读取文件生成md5码,然后和python生成的md5码一比较就可以判断文件有没有被修改。
因为需要校验文件,所以要使用md5算法,发现用python脚本生成文件的md5值不要太简单啊
#-*- coding:utf-8 –*- import os,sys from hashlib import md5 #文件的MD5校验码是根据文件的内容生成的信息摘要,方法如下, <span style="background-color: rgb(255, 0, 0);">def md5_file(name): m = md5() fd = open(name, 'rb') #需要使用二进制格式读取文件内容 m.update(fd.read()) fd.close() return m.hexdigest()</span> def usage(): print 'Usage:' print 'timestamp.py dllFilesFullPath md5Path' print '处理文件 dll文件夹路径 存储的文件路径(txt格式)' if(len(sys.argv)<3): #如果参数不对,给出提示 usage() sys.exit(0) dllFilePath = sys.argv[1] md5File = sys.argv[2] f = open(md5File, 'wb') listfile=os.listdir(dllFilePath) for name in listfile: <span style="white-space:pre"> </span>ext_name = name[-4:] <span style="white-space:pre"> </span>if ext_name =='.dll' or ext_name=='.exe': <span style="white-space:pre"> </span>dllName = '%s/%s' % (dllFilePath,name) <span style="white-space:pre"> </span>mdKey = md5_file(dllName) <span style="white-space:pre"> </span>f.write(name) <span style="white-space:pre"> </span>f.write('\n') <span style="white-space:pre"> </span>f.write(mdKey) <span style="white-space:pre"> </span>f.write('\n') f.close()几行代码搞定,还要算上打开文件的操作,最后txt中存放了dll或exe文件的名称与md5,为了简单奇数行是文件名称,偶数行是md5值
但是用c++来读取文件校验md5的值的话就好麻烦啊,吐槽一句:越来越不喜欢重度的语言了,越来越喜欢python了~~
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
java加密算法--MD5加密和哈希散列带秘钥加密算法源码最近学习加密算法的知识,利用MD5加密,百度一下网上资料很多,不是很详细,这里就整理下如何实现用MD5
基础:MessageDigest类的使用其实要在Java中完成MD5加密,MessageDigest类大部分都帮你实现好了,几行代码足矣:/***对字符串md5
本文实例讲述了php结合md5实现的加密解密方法。分享给大家供大家参考,具体如下:最近在整理代码发现了一个不错的东西,结合md5的加解密算法。网上关于php结合
加密算法如下:复制代码代码如下:functionencrypt($data,$key){$key=md5($key);$x=0;$len=strlen($dat
复制代码代码如下:functioncreateHashDir($sign){$md5=md5($sign);if(!is_dir(MB_CACHE))mkdir