#include <openssl/des.h>
/**
* @brief DES ECB加解密,暂时不选用CBC
* @param pSrc [in] 源字符串
* @param pLen 源字符串长度
* @param key [in] 密钥
* @param kLen 密钥长度
* @param enc 操作类型,DES_ENCRYPT加密,DES_DECRYPT解密
* @param cipher [out] 加密后的字符串
* @param oLen [out] 加密后的字符串长度
*
* @return 加密后的字符串
*/
std::string _DESCode( const char *pSrc,
int pLen,
char *key,
int kLen,
int *oLen,
int enc )
{
std::string strCipher;
std::vector<unsigned char> ciphers;
DES_cblock keyEncrypt;
memset( (void*)keyEncrypt,0,8 );
// 只取key的8位
memcpy( (void*)keyEncrypt,
(void*)key,
kLen >=8?8:kLen );
// 设置key
DES_key_schedule keySchedule;
DES_set_key_unchecked(&keyEncrypt, &keySchedule);
const_DES_cblock inputText; // 每次输入8位
DES_cblock outputText; // 每次输出8位
unsigned char tmp[8]; // 中间结果
// 每次加密8字节
for( int i = 0; i < pLen/8; i++ )
{
memcpy( inputText, pSrc + i*8,8 );
DES_ecb_encrypt( &inputText,&outputText,&keySchedule,enc );
memcpy( tmp,outputText,8 );
// 汇总
for( int j=0; j<8; j++ )
{
ciphers.push_back( tmp[j] );
}
}
// 不足8倍数补齐
if( pLen%8 )
{
int tmp1 = pLen/8*8;
int tmp2 = pLen - tmp1;
memset( (void*)inputText,0,8 ); // 填充0
memcpy( (void*)inputText,(void*)(pSrc + tmp1), tmp2 ); // 剩余部分
DES_ecb_encrypt( &inputText,&outputText,&keySchedule,enc );
memcpy( tmp,outputText,8 );
// 汇总
for( int j=0; j<8; j++ )
{
ciphers.push_back( tmp[j] );
}
}
// 复制结果
strCipher.clear();
strCipher.assign( ciphers.begin(),ciphers.end() );
// 密文长度
*oLen = ciphers.size();
if( enc == DES_DECRYPT )
{
*oLen = strCipher.size();
}
return strCipher;
}