《ASCE1885的信息安全》の使用Crypto++的MD5算法对字符串进行哈希

使用Crypto++MD5算法对字符串进行哈希,先在VS2010中新建Win32 Console Application,取工程名为:Crypto-MD5。在工程主目录中新建文件夹include,将Crpyto++的头文件放进去,在同一目录新建lib文件夹,在lib文件夹中再建两个文件夹DebugRelease,之后将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);}

 

 

 

你可能感兴趣的:(信息安全)