• 全部
  • 问答

请教d3des算法问题

lifeforu 北京赛智科技有限公司 项目经理  2005-01-31 12:06:41
偶而出现如下问题:
这是需要加密的字符串(原型:"ITSOFT-027\r\n%s\r\n1%s\r\n%s\r\n%d\r\n%s")
ITSOFT-027
aaaaaaaa
12005-01-31
00-E0-4C-41-29-CD
1
00-E0-4C-41-29-CD

但是好像在算法中出来了0值,导致返回的加密字符串位数不够,解密出来就只有一半左右的串了。
结果如下:
ITSOFT-027
aaaaaaaa
12005-01-31
00-E0
后面的字符就没了,这是怎么回事?
代码:
int des(){
char* szSrc = sbuf.GetBuffer(sbuf.GetLength());
int iLen = sbuf.GetLength()%8 == 0 ? sbuf.GetLength() : (sbuf.GetLength()/8+1)*8;
char* szDes = new char[iLen + 1];
DesEncrypt(szDesKey , (unsigned char*)szSrc , (unsigned char*)szDes , strlen(szSrc) , EN0);
szDes[iLen] = 0;
DesEncrypt(szDesKey , (unsigned char*)szDes , (unsigned char*)szDes , strlen(szDes) , DE1);
AfxMessageBox(szDes);
}
////
extern "C"
{
#include "d3des.h"
}
char* szDesKey = "Edwin708";
int DesEncrypt(char* szKey, unsigned char* lpbySrc, unsigned char* lpbyDest, int iLength , int iType)
{
unsigned char byKey[8] = {0};
char szTempKey[24];
strcpy(szTempKey, szKey);
makekey(szTempKey, byKey);
deskey(byKey, iType);
int i;
for (i = 0; i < iLength; i += 8)
des(lpbySrc + i, lpbyDest + i);
return 1;
}
...全文
188 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
melonliu 2005-01-31
to idler(偶是豆子。。。):

学信息安全的吗?
呵呵……偶也是
QQ:20976322
回复
idler 2005-01-31
把DesEncrypt函数的声明和简要说明贴上来
偶学信息安全。。。100偶的了。。。表抢。。。 ^o^
回复
idler 2005-01-31
sbuf是什么东西?CString?
输入是可打印字符可不代表DES之后还是可打印字符,出现0值完全可能的。。。
回复
idler 2005-01-31
char* szDesKey = "Edwin708";
CString sbuf = DES_STR;
int iLen = sbuf.GetLength()%8 == 0 ? sbuf.GetLength() : (sbuf.GetLength()/8+1)*8;
char* szSrc = sbuf.GetBuffer(iLen);

cout << "Before Encrypt" << endl << szSrc << endl << endl;

char* szDes = new char[iLen + 1];
DesEncrypt(szDesKey , (unsigned char*)szSrc , (unsigned char*)szDes , iLen , EN0);
DesEncrypt(szDesKey , (unsigned char*)szDes , (unsigned char*)szSrc , iLen , DE1);

cout << "After Decrypt" << endl << szSrc << endl;

sbuf.ReleaseBuffer();
delete[] szDes;

这样就使正确的,注意传递的参数。
回复
idler 2005-01-31
DesEncrypt(szDesKey , (unsigned char*)szSrc , (unsigned char*)szDes , strlen(szSrc) , EN0);
DesEncrypt(szDesKey , (unsigned char*)szDes , (unsigned char*)szDes , strlen(szDes) , DE1);
-----
strlen不对,应该传递iLen吧?
回复
lifeforu 2005-01-31
另注:多数情况下是正确的,比如说把aaaaaaaa这行加一个或减一个都可以,或是把MAC地址随便动一下也可能是正常的
回复
lifeforu 2005-01-31
to idler(偶是豆子。。。)
刚才按你说的getbuffer也不行...
结果同上
要不你把这段字符串试试?
回复
idler 2005-01-31
char* szSrc = sbuf.GetBuffer(sbuf.GetLength());
int iLen = sbuf.GetLength()%8 == 0 ? sbuf.GetLength() : (sbuf.GetLength()/8+1)*8;
-----
这个GetBuffer给出的缓冲区长度还没有填充,可能会不足。因此,因该这样写:
int iLen = sbuf.GetLength()%8 == 0 ? sbuf.GetLength() : (sbuf.GetLength()/8+1)*8;
char* szSrc = sbuf.GetBuffer(iLen);
顺便说一下,你的填充方式有问题,当然不影响解密,填充的最后一个8位组存放填充的长度。使用过szSrc之后要ReleaseBuffer,也不要忘了。
-----

如果出现0值,那么怎么把这些保存到文件里?
-----
可以写到二进制文件里,或者BASE64编码后存储在文本文件里。
回复
lifeforu 2005-01-31
sbuf是什么东西?CString?
输入是可打印字符可不代表DES之后还是可打印字符,出现0值完全可能的。。。
如果出现0值,那么怎么把这些保存到文件里?
回复
lifeforu 2005-01-31
to idler(偶是豆子。。。)
这就是DesEncrypt函数,调用了d3des.h,在网上下载的DES算法啊
(和这个是一样的;http://www.vckbase.com/code/general/cpp/des.zip)

int DesEncrypt(char* szKey, unsigned char* lpbySrc, unsigned char* lpbyDest, int iLength , int iType)
{
unsigned char byKey[8] = {0};
char szTempKey[24];
strcpy(szTempKey, szKey);
makekey(szTempKey, byKey);
deskey(byKey, iType);
int i;
for (i = 0; i < iLength; i += 8)
des(lpbySrc + i, lpbyDest + i);
return 1;
}
回复
lifeforu 2005-01-31
哦,,,,,谢谢
回复
发帖
C++ 语言
创建于2007-09-28

5.9w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2005-01-31 12:06
社区公告
暂无公告