C++ DES 加密(Cryptopp )
来源:互联网 发布:sqlserver删除唯一约束 编辑:程序博客网 时间:2024/06/15 00:01
转载注明出处
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 posconst int bsize=DES::BLOCKSIZE;//block sizeint blockpos=0;// block posint charpos=0;//char posDESDecryption 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 charfor( 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_instrmemcpy_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;}
- C++ DES 加密(Cryptopp )
- 使用CryptoPP实现DES加密
- CryptoPP DES 加解密
- DES加密模板,和C#des加密
- DES一轮加密(C语言)
- DES加密实现(c语言)
- C#DES加密解密
- C#DES加密方法
- C#DES加密解密
- C#DES加密
- C#DES加密解密
- C#Des加密&解密
- DES加密与机密(C#)
- C#DES加密和解密
- C#DES加密和解密
- c语言实现des加密
- DES加密解密C/C++
- 对称加密(Des)
- 线性表(C++)
- smartforms如何调用自定义内表
- c# 程序只能运行一次
- poj之2749分解因数
- Volatile & transient
- C++ DES 加密(Cryptopp )
- 清除QMAIL邮件队列
- poj之2758菲波那契数列
- web安全测试分析第一步
- u-boot+kernel不能正常运行
- Installing_Code::Blocks_from_source_on_Linux
- struts2的method="{1}"
- 对金融服务公司走信息技术路线的一点看法
- NGINX 实现内部网络的HTTP代理服务器的配置