/******************************************************************************
* 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.
*/
#include "stdafx.h"
#include "md5.h"
#include <iostream>
#include <fstream>
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) + (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);
}
/*compute md5 value for file
*/
void MD5_CTX::MD5Update(const char* szFileName)
{
ASSERT(szFileName != NULL);
ifstream in(szFileName, std::ios_base::binary);
if (in.fail())
{
return;
}
std::streamsize length;
char buffer[1024] = {0};
while (!in.eof())
{
in.read(buffer, 1024);
length = in.gcount();
if (length > 0)
{
MD5Update((unsigned char*)buffer, (unsigned int)length);
}
}
}
/* 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();
}
/* MD5 basic transformation. Transforms state based on block.
*/
void MD5_CTX::MD5Transform (unsigned long int state[4], unsigned char block[64])
{
unsigned long int 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
MD5计算器-计算文件MD5值
需积分: 0 106 浏览量
更新于2012-07-02
收藏 28KB ZIP 举报
MD5(Message-Digest Algorithm 5)是一种广泛用于数据完整性检验和身份验证的加密散列函数。它由美国计算机科学家Ronald Rivest于1991年设计,产生一个128位(16字节)的散列值,通常以32个十六进制数字的形式表示。MD5算法的主要应用是确保文件的完整性和一致性,防止数据在传输或存储过程中被篡改。
在给定的资源中,"MD5计算器-计算文件MD5值"是一个程序,能够计算文件的MD5哈希值。这个程序具有以下特点:
1. **自动保存结果**:计算出的MD5值会被自动保存到与原始文件在同一目录下的ini配置文件中。ini文件是一种简单的文本格式,用于存储用户设置或程序状态,便于后续读取和分析。
2. **MD5类的扩展**:程序可能包含一个自定义的MD5类,该类在原始MD5算法基础上进行了扩展,添加了计算文件MD5值的功能。这意味着用户可以通过调用类的方法,一次性处理多个文件,提高效率。
3. **多文件处理**:描述中提到,这个工具可以一次计算多个文件的MD5值。这在批量验证文件一致性或比较大量文件时非常有用。
4. **源代码**:提供的压缩包中包含`md5.cpp`和`md5.h`两个文件。`md5.cpp`很可能是实现MD5算法和相关功能的C++源代码,而`Md5Encoder.exe`则应该是编译后的可执行文件,可以直接运行计算MD5值。通过查看这些源代码,开发者可以了解MD5计算的具体实现细节,学习如何在自己的项目中集成MD5计算功能。
MD5虽然在安全性方面存在弱点,因为现代计算能力的进步,已能有效碰撞攻击,即找到两个不同的输入数据,它们的MD5散列值相同。但这并不影响其在某些场景下作为快速检查文件完整性的工具,比如下载文件后校验是否与源文件一致。然而,在安全敏感的应用中,如密码存储,MD5已被更安全的哈希函数如SHA-2系列所取代。

cy2015yc
- 粉丝: 23
最新资源
- 网络故障诊断与排除元龙.ppt
- 2016年尔雅选修课-《移动互联网时代的信息安全与防护》课后作业答案.docx
- 企业网络组建与设计方案和IP划分.doc
- 2011下半年程序设计方案基础试题.doc
- 项目管理工作程序(HJCX).doc
- 大数据与新闻创新.docx
- 51单片机实验4-:-c语言程序基础设计方案.doc
- 大数据时代计算机软件技术应用.docx
- 工业应用PLC可编程控制器的原理和应用.docx
- 计算机基础复习考试题.doc
- 计算机图书管理系统毕业论文.doc
- 中职计算机应用专业人才培养模式研究.docx
- 玩转3G网络-汽车防盗报警系统视频监控设计方案-平安城市.docx
- plc变频恒压供水系统大学设计方案标准版.doc
- C++ 实现!深度解析 DeepSeek 家族大模型的 CPU 推理过程
- DeepSeek 成功集成 Mind Network 的 Rust SDK,为 AI 安全保驾护航