鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 网站安全 > 加密解密 > >

Openssl Crypto 加/解密功能封装之二:MD5 摘要生成与验证

来源:互联网 作者:佚名 时间:2015-10-09 06:14
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

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

 

网友评论
<