c++ 生成檔案MD5
md5.h
#ifndef MD5_H #define MD5_H #include <string> #include <fstream> /* Type define */ typedef unsigned char byte; typedef unsigned long ulong; 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 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); /* class uncopyable */ MD5(const MD5&); MD5& operator=(const MD5&); private: ulong _state[4]; /* state (ABCD) */ ulong _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*/
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) { ulong i, index, partLen; _finished = false; /* Compute number of bytes mod 64 */ index = (ulong)((_count[0] >> 3) & 0x3f); /* update number of bits */ if ((_count[0] += ((ulong)length << 3)) < ((ulong)length << 3)) _count[1]++; _count[1] += ((ulong)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]; ulong oldState[4]; ulong oldCount[2]; ulong 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 = (ulong)((_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]) { ulong 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 */ 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; } /* Encodes input (ulong) into output (byte). Assumes length is a multiple of 4. */ 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); } } /* Decodes input (byte) into output (ulong). Assumes length is a multiple of 4. */ 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); } } /* Convert byte array to hex string. */ 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; } /* Convert digest to string value */ string MD5::toString() { return bytesToHexString(digest(), 16); }
使用方法:
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(); }
相關推薦
c++ 生成檔案MD5
md5.h #ifndef MD5_H #define MD5_H #include <string> #include <fstream> /* Type define */ typedef unsigned char byt
C++計算檔案MD5值
MD5ChecksumDefines.h //Magic initialization constants #define MD5_INIT_STATE_0 0x67452301 #define MD5_INIT_STATE_1 0xefcdab89 #define MD5
《21天學通C#生成XML檔案
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace 生成XML檔案{ /// <summary
C/C++生成的exe檔案如何傳引數到main中
Main函式引數argc,argv說明: C/C++語言中的main函式,經常帶有引數argc,argv,如下: int main(int argc, char** argv) int main(int argc, char
如何用c++生成html5檔案並進行程式設計
有時候根據專案需要,在一個c++專案裡面,需要對某些結果儲存為.htm或者.html檔案,並根據需要,在visual studio2013/2015的c++環境下對該.html檔案進行程式設計。這樣做,一方面為了輸出結果需要,一方面便於瀏覽器開啟。 首先 建立3個.html檔案,並設
C#從資料庫中讀取二進位制流並生成檔案
下面以圖片檔案為例加以說明。從資料庫表 “圖片儲存”中讀取ID為1的圖片資料並生成圖片檔案。 MySqlConnection conn = new MySqlConnection("Server=localhost;Database=test;charset=utf8;U
C#生成TXT檔案
要將資料結果儲存到TXT文字,首先要建立一個TXT文字,有三種方法: string result1 = @"F:\result1.txt" 1.writer=new StreamWriter(filename); 2.writer=File.CreateText(filename); 3.Filena
【轉】在VS2010上使用C#呼叫非託管C++生成的DLL檔案(圖文講解)
原文:http://www.cyqdata.com/cnblogs/article-detail-35876# 背景 在專案過程中,有時候你需要呼叫非C#編寫的DLL檔案,尤其在使用一些第三方通訊元件的時候,通過C#來開發應用軟體時,就需要利用
c++ dmp檔案生成與分析
目前做一個專案,利用mfc做框架生成執行程式,在本機及實驗室的機子裡都能正常執行,但運用到遠端的機器上就崩,而且好像不是程式演算法的問題,不能重現很難定位,所以考慮利用dmp檔案來分析。 1.dmp檔案生成實現程式碼 標頭檔案 #includ
C++ 基礎(五)使用vs2015封裝c++生成.dll檔案、.lib檔案、.h檔案後,給另一個工程使用:使用前,需配置標頭檔案(.h)靜態庫(.lib)和 動態庫(.dll )專案屬性
一、簡介 我是一個認真的人,要麼不寫,要麼我就把步驟、截圖、程式碼,一 一 附上,方便大家參考學習。 1、為什麼要生成DLL和lib? 就是為了給VS工程呼叫(比如C#呼叫、C++工程)。 2、C#為什麼要呼叫DLL和lib? C++寫的程
android studio編譯c生成.so檔案
今天練習了用studio編譯c生成.so檔案。 一、首先是配置NDK(以下是以我自己的路徑為例) 二、環境的搭建 設定ndk路徑 成功之後我們可以在local.properties檔案中看到:
C++生成exe檔案
// Test01.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) {
C語言計算檔案MD5
計算MD5這種很標準的東西,一般直接使用別人寫好的了就行,本文主要針對寫好的介面測試一下如何使用的問題。 下面是MD5的實現 md5.h #ifndef MD5_H #define MD5_H typedef struct
android studio 編譯C生成.so檔案出現java.lang.UnsatisfiedLinkError
參考文章:http://www.2cto.com/kf/201607/526887.html 這篇文章作者講得很好了,但是我照著做的時候還是不能正常執行程式,總是報java.lang.UnsatisfiedLinkError,其實就是couldn't find "libhuazict.so"
C#生成音訊檔案以及轉換成需要的格式
花了三天才做出來這麼個小東西,其中碰到了好多意向不到的問題與難題,直接看程式碼吧還是。其中需要DotNetSpeech.dll(生成因檔案)和lame_enc.dll(用於音訊格式的轉換)兩個類庫,還需要一個lame.exe執行程式,這個也是為了音訊格式的轉換。剛開始寫,寫
c#生成靜態html檔案,封裝類
由於這段時間比較輕鬆,於是想到很多的企業網站,新聞網站需要將頁面靜態化,於是寫了個封裝類來實現靜態檔案的生成,思路比較簡單,但未完善,網友可根據自己的思路將此類擴充套件,運用了簡單工廠模式(本來剛開始看設計模式,是個好書),好了,廢話不多說,先來看看靜態類的父類:StaticBase(抽象類)
C#生成MD5雜湊碼
MD5可以將輸入的值輸出為固定長度的雜湊值,常用作校驗用。 using System; using System.Data; using System.Security.Cryptography; p
C#建立傳輸檔案MD5驗證碼
由於Internet的開放性,任何檔案在傳輸過程中都可能受到篡改,而且傳輸過程的不確定性,使得我們缺乏有效的方法保證傳輸檔案的安全。為了避免上述情況,最普遍的做法是隨傳輸檔案提供一個驗證碼,即對傳輸的檔案產生一個MD5的值並記錄在案,使用者在收到檔案後,通過重新計算檔案驗證
c/c++生成的exe檔案,無法開啟
c/c++ 程式設計生成的.exe檔案無法開啟。 只能在編譯器上才可以開啟,一旦關了編譯器,自己編譯生成的exe檔案就打不開了。 自己編譯的程式有時運氣好的話。exe檔案可以開啟。但是大多數打不開(出現閃動一下黑視窗就沒反應了) 解決方
關於使用C#呼叫C++生成的動態連結庫(DLL檔案)
使用C++的開啟一張圖片,C++的程式。在C++新建專案的應用設定裡面選擇DLL,圖片如下 將顯示單張圖片的C++程式碼複製到建立檔案的.CPP檔案下面,然後除錯。 程式碼如下: // Cpp_cshape.cpp : 定義 D