Cryto++哈希函数md5

Hash函数的最基本的用法就是计算Hash值,一个Hash函数是一个多对一的映射,可以输入任意长度的消息,输出却是一个固定长度的消息,而且,只要有一点很微小的差异的两个消息之间的Hash值也会有很大的差异,根据两个不同的Hash值就可以判断对应的两个消息是不同的。所以Hash函数通常用于数字签名和消息的完整性检测等等一些安全性方面的应用。下面举一个计算字符串的Hash值简单的例子。

 

#pragma comment (lib,"cryptlib.lib")  //加载lib文件的语句

 

 

 

#include "md5.h"

 

 

 

#include <iostream>

 

 

 

using namespace CryptoPP; //使用名字空间CryptoPP

 

 

 

 using namespace std; //使用名字空间std

 

 

 

  

 

void main(){

 

 

 

    byte message[128];       byte m[16];

 

 

 

       cout<<"输入字符串"<<endl; cin.getline((char*) message,128);  

 

 

 

       MD5 md5; md5.Update(message,128); md5.Final(m);        

 

 

 

       for(int i=0;i<16;i++)printf("%02x",m[i]);printf("\n");            

 

 

 

}

 

这个例子首先生成MD5对象(类MD5md5.h里定义),调用方法Update()Final(),这两个方法是定义在基类HashTransformation里的。void Update (const byte *input, unsigned int length) 是用来处理输入的方法,input byte型是将要计算Hash值的字符串,length是字符串的长度。void Final (byte *digest) 是计算当前消息的Hash值并重新开始新的消息的方法,digest是用来存放Hash值的byte型数组。

 

 

 

HashTransformation还定义了几个常用的方法 void CalculateDigest (byte *digest, const byte *input, unsigned int length)也是用来计算hash值的方法,可以用md5. CalculateDigest(m,message,128),来替换上面例子md5.Update(message,128)md5.Final(m) 这两个语句。

 

 

 

在消息完整性检测方面我们通常都是检测文件的完整性,一个相当大的文件如果对其进行一个很微小的修改我们根本看不出的,但是它们的Hash值却有很大的变化,所以我们只要比较Hash值就很容易看出该文件是否为原来的文件。计算文件的Hash值在这个密码库的支持下就比较简单就用下面的一行代码就行了

 

 

 

FileSource f(file, true, new HashFilter(md5,

 

 

 

                new HexEncoder(new ArraySink(buffer,2 * MD5::DIGESTSIZE))));

 

 

 

这一行代码总共用了4个类ArraySinkHexEncoderHashFilterFileSource。首先用类ArraySink复制一个2 * MD5::DIGESTSIZE 字节的buffer存储缓冲区,接着用类HexEncoder把这个缓冲区转换为16进制。计算Hash值主要用到类HashFilter。类FileSource是把要计算Hash值的文件file进行一定的转换放入临时缓冲区,然后调用实例化的HashFilter对其进行计算相应Hash函数的Hash值。

 

这是我结合网上搜索的代码自己做出来的MD5函数的两种调用方式。

 

#define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1
#include "md5.h"
#include<iostream>
#include <hex.h>
#include <files.h>
using namespace CryptoPP;
#pragma comment(lib, "cryptlib.lib")
using namespace std;

 

string md5_string( string message)
{
 string digest;
 Weak::MD5 md5;
 StringSource(message, true,new HashFilter(md5, new HexEncoder(new StringSink(digest))));
 return digest;
}

 

bool md5(const string &src, string &digest)
{
 byte m[16];
 int len = src.length();
 byte *msg = new byte[len + 1];
 std::stringstream stream;
 stream << src;
 stream >> msg;

 

 Weak::MD5 md5;

/*HashTransformation还定义了几个常用的方法
 void CalculateDigest (byte *digest, const byte *input, unsigned int length)
 也是用来计算hash值的方法,可以用md5. CalculateDigest(m,message,128),
 来替换md5.Update(message,128)与 md5.Final(m) 这两个语句。*/
 //md5.CalculateDigest(m, msg, len);  //这句相当于下面两句
 md5.Update(msg, len); 
 md5.Final(m);
 //StringSource ss(m, sizeof(m), true,
 // new HexEncoder(new StringSink(digest))
 // );

 

 delete[] msg;
 return true;
}

 

void main() {

 

 string message, str;
 cin >> message;
 str=md5_string(message);
 cout << str<<endl;
 md5(message,str);
 cout << str<<endl;
}

 

计算文件的Hash值在这个密码库的支持下就比较简单就用下面的一行代码。

 

FileSource f(file, true, new HashFilter(md5,

 

                new HexEncoder(new ArraySink(buffer,2 * MD5::DIGESTSIZE))));

 

这一行代码总共用了4个类ArraySinkHexEncoderHashFilterFileSource。首先用类ArraySink复制一个2 * MD5::DIGESTSIZE 字节的buffer存储缓冲区,接着用类HexEncoder把这个缓冲区转换为16进制。计算Hash值主要用到类HashFilter。类FileSource是把要计算Hash值的文件file进行一定的转换放入临时缓冲区,然后调用实例化的HashFilter对其进行计算相应Hash函数的Hash值。

 

 

部分内容  摘自百度文库Crypt++ 中文使用手册  作者LeopoldChan

 

https://wenku.baidu.com/view/4aab73c208a1284ac8504384.html

 

posted @ 2017-05-15 22:17  ll7  阅读(580)  评论(0编辑  收藏  举报