📄 encryptutils.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 + -