使用Crypto++的MD5算法对字符串进行哈希,先在VS2010中新建Win32 Console Application,取工程名为:Crypto-MD5。在工程主目录中新建文件夹include,将Crpyto++的头文件放进去,在同一目录新建lib文件夹,在lib文件夹中再建两个文件夹Debug和Release,之后将Crypto++的调试版和发布版cryptlib.lib分别放到前面两个文件夹中。
打开工程Crypto-MD5.cpp文件,修改添加代码如下:
==========================Crypto-MD5.cpp====================
#include "stdafx.h"
#include "../include/md5.h"
#include <iostream>
#include <sstream>
#ifdef _DEBUG
#pragma comment(lib, "../lib/Debug/cryptlib.lib")
#else
#pragma comment(lib, "../lib/Release/cryptlib.lib")
#endif
int _tmain(int argc, _TCHAR* argv[])
{
std::string instr;
byte m[16];
std::cout<<"输入字符串:"<<std::endl;
std::cin>>instr;
int len = instr.length();
byte *message = new byte[len];
std::stringstream stream;
stream << instr;
stream >> message; //将输入std::string类型字符串转为byte类型字符数组
CryptoPP::MD5 md5;
//md5.CalculateDigest(m, message, len); //等价于下面两行代码只和
md5.Update(message, len); //注意,此处len必须是message的字符长度,
//否则生成的哈希值会一次一变
md5.Final(m);
std::cout<<"算法名称:"<<md5.AlgorithmName()<<std::endl;
std::cout<<"哈希后结果:";
for(int i=0; i<16; i++)
printf("%02x", m[i]);
std::cout<<std::endl;
system("pause");
return 0;
}
代码中首先生成MD5实例对象,调用方法Update()和Final(),这是两个定义在基类HashTransformation中的函数。函数原型如下:(详见cryptlib.h文件)
//! process more input
virtual void Update(const byte *input, size_t length) =0;
//! compute hash for current message, then restart for a new message
/*! /pre size of digest == DigestSize(). */
virtual void Final(byte *digest)
{TruncatedFinal(digest, DigestSize());}
Update()函数是用来处理输入的;参数input是将要计算哈希值的字符串,length是该字符串的长度。
Final()函数是计算当前消息的哈希值并重新开始新的消息的;参数digest是用来存放哈希值的byte型数组。
HashTransformation类还定义了函数CalculateDigest()来替换上面的Update()和Final()这两个函数,原型如下:
//! use this if your input is in one piece and you don't want to call Update() and Final() separately
virtual void CalculateDigest(byte *digest, const byte *input, size_t length)
{Update(input, length); Final(digest);}