使用boost库进行MD5加密和SHA1加密

使用boost库进行MD5加密和SHA1加密

MD5 和SHA-1 是目前使用比较广泛的散列(Hash)函数,也是在消息认证和数字签名中普遍使用的两种加密算法,现在信息安全面临两大基本攻击:被动式攻击(获取消息的内容、业务流分析)和主动攻击(假冒、消息的篡改、业务拒绝)。

因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:

  1. 对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^128 数量级的操作,而对SHA-1则是2^160数量级的操作。这样,SHA-1对强行攻击有更大的强度。

  2. 对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。

  3. 速度:在相同的硬件上,SHA-1 的运行速度比 MD5 慢。

下面为附加详细代码示例 如下.

#include 
#include 
#include 
#include 

using namespace std;

bool GetMd5(std::string &str_md5, const char * const buffer, size_t buffer_size)
{
	if(buffer == nullptr) {
		return false;
	}

	boost::uuids::detail::md5 boost_md5;
	boost_md5.process_bytes(buffer, buffer_size);
	boost::uuids::detail::md5::digest_type digest;
	boost_md5.get_digest(digest);
	const auto char_digest = reinterpret_cast<const char*>(&digest);
	str_md5.clear();
	boost::algorithm::hex(char_digest,char_digest+sizeof(boost::uuids::detail::md5::digest_type), std::back_inserter(str_md5));

	return true;
}

bool GetSHA1(std::string &str_sha1, const char * const buffer, size_t buffer_size)
{
	char hash[20];
	boost::uuids::detail::sha1 boost_sha1;
	boost_sha1.process_bytes(buffer, buffer_size);
	boost::uuids::detail::sha1::digest_type digest;
	boost_sha1.get_digest(digest);
	for(int i = 0; i < 5; ++i) {
		const char *tmp = reinterpret_cast<char*>(digest);
		hash[i*4] = tmp[i*4+3];
		hash[i*4+1] = tmp[i*4+2];
		hash[i*4+2] = tmp[i*4+1];
		hash[i*4+3] = tmp[i*4]; 
	}
	
	str_sha1.clear();
	std::ostringstream buf;
	for(int i = 0; i < 20; ++i) {
		buf << setiosflags(ios::uppercase) << std::hex << ((hash[i] & 0x0000000F0) >> 4);
		buf << setiosflags(ios::uppercase) << std::hex << (hash[i] & 0x00000000F);
	}

	str_sha1 = buf.str();
	return true;
}

int main(int argc, const char *argv[])
{
	string str_md5;
	string str_sha1;
	string str = "1@948-3*9:-=!@#$%^&**()_+?><~`{}[]|;,.";

	if(GetMd5(str_md5, str.c_str(), str.length()) == true) {
		cout << "str_md5 : " << str_md5 << endl;
	} else {
		cout << "error .." << endl;
	}
	
	cout << "----------------------------------------------" << endl;

	if(GetSHA1(str_sha1, str.c_str(), str.length()) == true) {
		cout << "str_sha1 : " << str_sha1 << endl;
	} else {
		cout << "error .." << endl;
	}

	return 0;
}

你可能感兴趣的:(C++)