1、环境
OpenSSL 版本:openssl-0.9.8d
请确保系统存在环境变量 SSL_ROOT, $SSL_ROOT/lib 存在 crypto 库文件,$SSL_ROOT/lib 已加入 LD_LIBRARY_PATH 中。
测试过的系统版本:RHEL 4.8 32 bit,AIX 5.3 64bit
2、源码
/*
* MD5.h
*
* 基于 Openssl crypto 库的加密/解密功能封装
*
* Created on: Mar 11, 2012
* Author: yeyuzhen<mail.yeyuzhen@gmail.com>
*/
#include <iostream>
#include <string>
#include <openssl/md5.h>
// 参见 http://blog.csdn.net/lostaway/article/details/7492939
#include "NumSysConvert.h"
/**
* @brief 生成 MD5 摘要
* @author 叶雨珍<yeyzh@ffcs.cn>
* @return 十六进制字符串形式摘要值
*/
inline std::string My_MD5(std::string msg)
{
std::string result;
if(msg.empty())
{
return result;
}
const int digestLen = 16;
unsigned char digest[digestLen] = {0};
memset(digest, 0x00, sizeof(digest));
MD5_CTX ctx;
MD5_Init(&ctx);
MD5_Update(&ctx, msg.c_str(), msg.size());
MD5_Final(digest, &ctx);
result.clear();
result.append((char *)digest, digestLen);
return Bin2Hex(result);
}
/**
* @brief MD5 校验
* @author
* @param digest 十六进制字符串形式摘要
* @return true 校验成功
* @return false 校验失败
*
*/
inline bool My_MD5_Verify(std::string _msg, std::string _digest)
{
std::string t = My_MD5(_msg);
// 强制转大写,忽略大小写差异
for(std::string::iterator iter = _digest.begin();
iter != _digest.end();
iter++)
{
if(isalpha(*iter))
{
*iter = toupper(*iter);
}
}
if(0 == t.compare(_digest))
{
return true;
}
else
{
return false;
}
}
/*
* main.cpp
*
* MD5 摘要测试
*
*/
#include <iostream>
#include <string>
#include "MD5.h"
int main(int argc, char *argv[])
{
std::string msg("I'am test message!!!");
std::string digest = My_MD5(msg);
std::cout << "Digest:" << digest << std::endl;
std::string expectDigest("07B12819CB3AA62F9B45072B414B0512");
if(!expectDigest.compare(My_MD5(msg)))
{
std::cout << "MD5 Verify Success!!" << std::endl;
}
else
{
std::cout << "MD5 Verify Fail!!" << std::endl;
}
return 0;
}
Makefile:
MD5:NumSysConvert.h MD5.h main.cpp
g++ -g -o MD5 -I$SSL_ROOT/include -L$SSL_ROOT/lib -lcrypto main.cpp
参考
OpenSSL MD5 参考 http://www.openssl.org/docs/crypto/md5.html#
编辑记录:
V1.0 2012-4-25 2:41:39 初稿