使用boost库进行MD5加密和SHA1加密
使用boost库进行MD5加密和SHA1加密
MD5 和SHA-1 是目前使用比较广泛的散列(Hash)函数,也是在消息认证和数字签名中普遍使用的两种加密算法,现在信息安全面临两大基本攻击:被动式攻击(获取消息的内容、业务流分析)和主动攻击(假冒、消息的篡改、业务拒绝)。
因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:
- 对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^128 数量级的操作,而对SHA-1则是2^160数量级的操作。这样,SHA-1对强行攻击有更大的强度。
- 对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
- 速度:在相同的硬件上,SHA-1 的运行速度比 MD5 慢。
下面为附加详细代码示例 如下.
#include <iostream> #include <boost/algorithm/hex.hpp> #include <boost/uuid/detail/md5.hpp> #include <boost/uuid/detail/sha1.hpp> 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; }