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 初稿