转载注明出处
http://blog.csdn.net/xugangjava
写了一个DES加密的插件,用的是crypto++库,各种字符的转换有点晕
插件是ATL的Activex 只贴出关键代码,希望对你有用,如有不足欢迎指出。
//加密代码
STDMETHODIMP CMAddr::En(BSTR instr, BSTR* outstr) { CComBSTR com_instr(instr); if(com_instr.Length()==0){ com_instr.Empty(); return S_OK; } int pos=0; const int bsize=DES::BLOCKSIZE; char* ptr_instr=NULL; CString cstr_result; CString cstr_buffer; DESEncryption encryption_DES; unsigned char key[ DES::KEYLENGTH ] = "xugangf"; byte blockin[bsize]; byte blockout[bsize]; //设置密钥 encryption_DES.SetKey(key, DES::KEYLENGTH); int nwLen=0; //将宽字节字符集转成多字节,crypto 没unicode的版本让我比较蛋疼 nwLen=WideCharToMultiByte(CP_ACP,NULL,com_instr.m_str,-1,NULL,0,NULL,FALSE); ptr_instr=new char[nwLen+bsize+1]; if(!ptr_instr) { delete[] ptr_instr; return FALSE; } WideCharToMultiByte(CP_ACP,NULL,com_instr.m_str,-1,ptr_instr,nwLen,NULL,FALSE); while(pos<nwLen) { ZeroMemory(blockin,bsize); ZeroMemory(blockout,bsize); memcpy_s(blockin,bsize,ptr_instr+pos,bsize); //解密数据块 encryption_DES.ProcessBlock(blockin, blockout); //转换成16进制数字输出,不然加密后是乱码而且无法解密, //codepage找不到这个字符就给你个乱码 //你用乱码来解密,解出来也是乱码 for(int bpos=0;bpos<bsize;bpos++) { cstr_buffer.Format(L"%02x",blockout[bpos]); cstr_result.Append(cstr_buffer); } pos+=bsize; } //免得内存泄露,清理一下 com_instr.Empty(); delete[] ptr_instr; CComBSTR result; bstr_t bstr_result(cstr_result.LockBuffer()); result.Append(bstr_result.GetBSTR()); result.CopyTo(outstr); cstr_result.UnlockBuffer(); result.Empty(); cstr_result.Empty(); cstr_buffer.Empty(); return S_OK; } //解密代码 STDMETHODIMP CMAddr::De(BSTR instr, BSTR* outstr) { CComBSTR com_instr(instr); if(com_instr.Length()==0){ com_instr.Empty(); return S_OK; } int pos=0;//char pos const int bsize=DES::BLOCKSIZE;//block size int blockpos=0;// block pos int charpos=0;//char pos DESDecryption decryption_DES; //设置密钥 unsigned char key[ DES::KEYLENGTH ] = "xugangf"; decryption_DES.SetKey(key, DES::KEYLENGTH); byte blockin[bsize]; byte blockout[bsize]; int nwLen=0; //将传进来的16进制代码转多字节,BSTR 进来自动是宽字节的 nwLen=WideCharToMultiByte(CP_ACP,NULL,com_instr.m_str,-1,NULL,0,NULL,NULL); char* ptr_instr=new char[nwLen+bsize+1]; if(!ptr_instr) { delete[] ptr_instr; return FALSE; } WideCharToMultiByte(CP_ACP,NULL,com_instr.m_str,-1,ptr_instr,nwLen,NULL,FALSE); char tempbuf[4]; while(charpos<nwLen) { ZeroMemory(blockin,bsize); ZeroMemory(blockout,bsize); //两个字符合成一个16进制的unsigned char for( blockpos=0;blockpos<DES::BLOCKSIZE;blockpos++,charpos+=2) { tempbuf[0]=ptr_instr[charpos]; tempbuf[1]=ptr_instr[charpos+1]; tempbuf[2]=0; blockin[blockpos]= (unsigned char) strtol(tempbuf, (char**)NULL, 16); } decryption_DES.ProcessBlock(blockin, blockout); //将解密出的字符串转到ptr_instr memcpy_s(ptr_instr+pos,bsize,blockout,bsize); pos+=bsize; } //多字节转宽字节 nwLen = MultiByteToWideChar (CP_ACP, 0, ptr_instr, -1, NULL, 0); wchar_t *ptr_winstr = new wchar_t[nwLen+bsize+1]; if(!ptr_winstr) { delete[] ptr_winstr; return FALSE; } MultiByteToWideChar (CP_ACP, 0,ptr_instr, -1, ptr_winstr , nwLen); com_instr.Empty(); delete[] ptr_instr; CComBSTR result(ptr_winstr); //写结果 result.CopyTo(outstr); result.Empty(); delete[] ptr_winstr; return S_OK; }