⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 md5.cpp

📁 一个简单的求取文件MD5值的实现文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "MD5.h"
#include "iostream.h"
#include "string.h"
using   namespace   std;
//---------------------------------------------------------------------------
/******************************************************************************
*     Copyright   (C)   2000   by   Robert   Hubley.                                                                             *
*     All   rights   reserved.                                                                                                             *
*                                                                                                                                                         *
*     This   software   is   provided   ``AS   IS''   and   any   express   or   implied                         *
*     warranties,   including,   but   not   limited   to,   the   implied   warranties   of             *
*     merchantability   and   fitness   for   a   particular   purpose,   are   disclaimed.           *
*     In   no   event   shall   the   authors   be   liable   for   any   direct,   indirect,                   *
*     incidental,   special,   exemplary,   or   consequential   damages   (including,   but     *
*     not   limited   to,   procurement   of   substitute   goods   or   services;   loss   of   use,   *
*     data,   or   profits;   or   business   interruption)   however   caused   and   on   any           *
*     theory   of   liability,   whether   in   contract,   strict   liability,   or   tort               *
*     (including   negligence   or   otherwise)   arising   in   any   way   out   of   the   use   of     *
*     this   software,   even   if   advised   of   the   possibility   of   such   damage.                   *
*                                                                                                                                                         *
******************************************************************************

MD5C.C   -   RSA   Data   Security,   Inc.,   MD5   message-digest   algorithm

Port   to   Win32   DLL   by   Robert   Hubley   1/5/2000
   
Original   Copyright:  
   
Copyright   (C)   1991-2,   RSA   Data   Security,   Inc.   Created   1991.   All  
rights   reserved.  
   
License   to   copy   and   use   this   software   is   granted   provided   that   it  
is   identified   as   the   "RSA   Data   Security,   Inc.   MD5   Message-Digest  
Algorithm"   in   all   material   mentioning   or   referencing   this   software  
or   this   function.  
       
License   is   also   granted   to   make   and   use   derivative   works   provided  
that   such   works   are   identified   as   "derived   from   the   RSA   Data  
Security,   Inc.   MD5   Message-Digest   Algorithm"   in   all   material  
mentioning   or   referencing   the   derived   work.  
   
RSA   Data   Security,   Inc.   makes   no   representations   concerning   either  
the   merchantability   of   this   software   or   the   suitability   of   this  
software   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   this  
documentation   and/or   software.  
*/  
   
/*   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)   +   (unsigned   long   int)(ac);   (a)   =   ROTATE_LEFT   ((a),   (s));   (a)   +=   (b);   }  
#define   GG(a,   b,   c,   d,   x,   s,   ac)   {   (a)   +=   G   ((b),   (c),   (d))   +   (x)   +   (unsigned   long   int)(ac);   (a)   =   ROTATE_LEFT   ((a),   (s));   (a)   +=   (b);   }  
#define   HH(a,   b,   c,   d,   x,   s,   ac)   {   (a)   +=   H   ((b),   (c),   (d))   +   (x)   +   (unsigned   long   int)(ac);   (a)   =   ROTATE_LEFT   ((a),   (s));   (a)   +=   (b);   }  
#define   II(a,   b,   c,   d,   x,   s,   ac)   {   (a)   +=   I   ((b),   (c),   (d))   +   (x)   +   (unsigned   long   int)(ac);   (a)   =   ROTATE_LEFT   ((a),   (s));   (a)   +=   (b);   }  
   
   
/*   MD5   initialization.   Begins   an   MD5   operation,   writing   a   new   context.  
*/  
   
MD5_CTX::MD5_CTX()  
{  
MD5Init   ();  
}  
   
MD5_CTX::~MD5_CTX()  
{  
}  
   
void   MD5_CTX::MD5Init   ()  
{  
this->count[0]   =   this->count[1]   =   0;  
/*   Load   magic   initialization   constants.*/
this->state[0]   =   0x67452301;  
this->state[1]   =   0xefcdab89;  
this->state[2]   =   0x98badcfe;  
this->state[3]   =   0x10325476;  
/*   Add   by   Liguangyi   */  
MD5_memset(PADDING,   0,   sizeof(PADDING));  
*PADDING=0x80;  
//PADDING   =   {  
// 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 };  
}  
   
/*   MD5   block   update   operation.   Continues   an   MD5   message-digest  
operation,   processing   another   message   block,   and   updating   the  
context.  
*/  
void   MD5_CTX::MD5Update   (unsigned   char   *input,unsigned   int   inputLen)
{  
unsigned   int   i,   index,   partLen;  
   
/*   Compute   number   of   bytes   mod   64   */  
index   =   (unsigned   int)((this->count[0]   >>   3)   &   0x3F);  
   
/*   Update   number   of   bits   */  
if   ((this->count[0]   +=   ((unsigned   long   int)inputLen   <<   3))  
<   ((unsigned   long   int)inputLen   <<   3))  
this->count[1]++;  
this->count[1]   +=   ((unsigned   long   int)inputLen   >>   29);  
   
partLen   =   64   -   index;
   
/*   Transform   as   many   times   as   possible.  
*/  
if   (inputLen   >=   partLen)   {  
MD5_memcpy((unsigned   char*)&this->buffer[index],    
(unsigned   char*)input,   partLen);  
MD5Transform   (this->state,   this->buffer);  
   
for   (i   =   partLen;   i   +   63   <   inputLen;   i   +=   64)  
MD5Transform   (this->state,   &input[i]);  
   
index   =   0;  
}  
else  
i   =   0;  
   
/*   Buffer   remaining   input   */  
MD5_memcpy   ((unsigned   char*)&this->buffer[index],   (unsigned   char*)&input[i],   inputLen-i);  
}  

/*   MD5   finalization.   Ends   an   MD5   message-digest   operation,   writing   the  
the   message   digest   and   zeroizing   the   context.  
*/  
void   MD5_CTX::MD5Final   (unsigned   char   digest[16])
{  
unsigned   char   bits[8];  
unsigned   int   index,   padLen;  
   
/*   Save   number   of   bits   */  
Encode   (bits,   this->count,   8);  

/*   Pad   out   to   56   mod   64.  
*/  
index   =   (unsigned   int)((this->count[0]   >>   3)   &   0x3f);  
padLen   =   (index   <   56)   ?   (56   -   index)   :   (120   -   index);  
MD5Update   (   PADDING,   padLen);  
   
/*   Append   length   (before   padding)   */
MD5Update   (bits,   8);  
/*   Store   state   in   digest   */  
Encode   (digest,   this->state,   16);  
   
/*   Zeroize   sensitive   information.  
*/  
MD5_memset   ((unsigned   char*)this,   0,   sizeof   (*this));  
this->MD5Init();  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -