⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 encryptutils.cpp

📁 支持MD5、Base64、DES的加密和解密算法的小程序
💻 CPP
字号:
/*!< EncryptUtils头文件 */
#include "EncryptUtils.h"

/*!< 加密算法头文件 */
extern "C"
{
	#include "encrypt\md5.h"	
	#include "encrypt\des.h"
	#include "encrypt\des_b.h"
}
#include "encrypt\base64.h"

/***********************************************************************************
* name       : Md5Hash
* description: 对字符串进行 md5 hash
* input      : strSrc - 要转化的字符串
* output     : NA
* return     : 转化后的字符串
* remark     : NA
***********************************************************************************/
string NS_CBB::StrMd5( const string& strSrc )
{
	string strRet;

	md5_context ctx;
	md5_starts( &ctx );
	md5_update( &ctx, (unsigned char *)strSrc.c_str(), (unsigned int)( strSrc.size() ) );
	md5_finish( &ctx, (unsigned char *)strRet.c_str() );

	return strRet;
}

/***********************************************************************************
* name       : Base64Encode
* description: 对字符串进行Base64编码
* input      : strSrc - 要转化的字符串
* output     : NA
* return     : 转化后的字符串
* remark     : NA
***********************************************************************************/
string NS_CBB::Base64Encode( const string& strSrc )
{
	char* pszOut = NULL;
	size_t sizeOut = base64_encode_alloc( strSrc.c_str(), strSrc.size(), &pszOut );

	// 设置返回值
	string strRet( pszOut, sizeOut );

	// 释放内存
	free( pszOut );

	return strRet;
}

/***********************************************************************************
* name       : Base64Decode
* description: 对字符串进行Base64解码
* input      : NA
* output     : NA
* return     : 
* remark     : NA
***********************************************************************************/
string NS_CBB::Base64Decode( const string& strSrc )
{
	// 修正输入长度
	string strTmp = strSrc;
	size_t sizeInput = ( strTmp.size() + 3 ) / 4 * 4;
	strTmp.resize( sizeInput, '=' );

	// base64解码
	char* pszOut = NULL;
	size_t sizeOut = 0;
	if ( base64_decode_alloc( strTmp.c_str(), strTmp.size(), &pszOut, &sizeOut ) )
	{
		// 设置返回值
		string strRet( pszOut, sizeOut );
		// 释放内存
		free( pszOut );

		return strRet;
	}

	// 如果失败,返回空字符串
	return string("");
}

/***********************************************************************************
* name       : StrDes
* description: 对字符串进行Des加密
* input      : NA
* output     : NA
* return     : 加密后的字符串
* remark     : 注意该算法目前的补码方式相对于Java的话为 - DES/ECB/NoPadding
***********************************************************************************/
string NS_CBB::StrDes( const string& strSrc, const string& strKey, bool bEncrypt )
{
	// 补充到 8 字节
	string strKey8 = strKey;
	strKey8.resize( 8, '\0' );

	// 计算输出缓冲区大小
	int iBuffLen = int( strSrc.size() + 7 ) / 8 * 8;
	
	// 设置输出缓冲区
	string strRet;
	strRet.reserve( iBuffLen );

	// 调整输入数据长度为 8 的倍数
	string strTmp = strSrc;
	strTmp.resize( iBuffLen, '\0' );

	// 临时缓冲区	
	unsigned char szBuffer[8] = {0};
	
	// 设置16字节的密匙
	des_context ctx;
	des_set_key( &ctx, (unsigned char*)strKey8.c_str() );

	// 选择算法函数: 加密 或 解密
	void (*pEncryptFunc)( des_context* ctx, unsigned char input[], unsigned char output[] );
	pEncryptFunc = bEncrypt ? des_encrypt : des_decrypt;
	for ( int i = 0; i < iBuffLen; i += 8 )
	{
		memset( szBuffer, 0, sizeof( szBuffer ) );
		pEncryptFunc( &ctx, (unsigned char*)( strTmp.c_str() + i ), szBuffer );
		strRet.append( (char*)szBuffer, 8 );

	} // end of for ( int i = 0; i < iBuffLen; i += 8 ) ...          

	return strRet;
}

/***********************************************************************************
* name       : StrDes
* description: 对字符串进行DES3加密
* input      : strSrc - 要加密的字符串, strKey - 加密的Key,
*			   strIV - 	初始化向量 bEncrypt -加密还是解密
* output     : NA
* return     : 加密后的字符串
* remark     : 注意该算法目前的补码方式相对于Java的话为 - DES/ECB/NoPadding
***********************************************************************************/
string NS_CBB::StrDes3( const string& strSrc, const string& strKey, const string& strIV,bool bEncrypt )
{
	// 补充到 24 字节
	string strKey24 = strKey;
	strKey24.resize( 24, '\0' );
	
	// 计算输出缓冲区大小
	int iBuffLen = int( strSrc.size() + 7 ) / 8 * 8;
	
	// 设置输出缓冲区
	string strRet;
	strRet.reserve( iBuffLen );
	
	// 调整输入数据长度为 8 的倍数
	string strTmp = strSrc;
	strTmp.resize( iBuffLen, '\0' );
	
	// 临时缓冲区
	unsigned char szBuffer[8] = {0};	
	if ( 0 < strIV.size() )
	{
		string strIV8 = strIV;
		strIV8.resize( 8, '\0' );
		
		/*!< 进行加密 */
		DES3_CBC_CTX ctx;
		DES3_CBCInit( &ctx, (unsigned char*)strKey24.c_str(), (unsigned char*)strIV8.c_str(), bEncrypt ? 1 : 0 );
		for ( int i = 0; i < iBuffLen; i += 8 )
		{
			memset( szBuffer, 0, sizeof( szBuffer ) );
			DES3_CBCUpdate( &ctx, (unsigned char*)szBuffer, (unsigned char*)( strTmp.c_str() + i ), 8 );
			strRet.append( (char*)szBuffer, 8 );

		} // end of for ( int i = 0; i < iBuffLen; i += 8 ) ...          
	}
	else
	{
		// 设置16字节的密匙
		des3_context ctx;
		des3_set_2keys( &ctx, (unsigned char*)strKey24.c_str(), (unsigned char*)( strKey24.c_str() + 8 ) );

		// 选择算法函数: 加密 或 解密
		void (*pEncryptFunc)( des3_context* ctx, unsigned char input[], unsigned char output[] );
		pEncryptFunc = bEncrypt ? des3_encrypt : des3_decrypt;
		for ( int j = 0; j < iBuffLen; j += 8 )
		{
			memset( szBuffer, 0, sizeof( szBuffer ) );
			pEncryptFunc( &ctx, (unsigned char*)( strTmp.c_str() + j ), szBuffer );
			strRet.append( (char*)szBuffer, 8 );

		} // end of for ( int i = 0; i < iBuffLen; i += 8 ) ...  
	} // end of if ( 0 < strIV.size() ) ...      
	
	return strRet;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -