请教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;
}
...全文
232 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
  • 打赏
  • 举报
回复
哦,,,,,谢谢

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧