DES算法加密问题!

51365133 2008-06-12 04:34:39
        //打开原文件
int fr=_open(szFile,_O_RDONLY|_O_BINARY);
if( fr == -1 )
return;

//生成目标文件
int fw=_open(decFile,_O_CREAT|_O_WRONLY|_O_BINARY);
if( fw == -1 )
return ;

//循环加密或解密
while(!_eof(fr))
{
nRead=_read( fr, szBuf,512);

ndiv=8-(nRead%8);//计算需要补充的字节.

if(ndiv!=8)//补充Buf
{
memset(szBuf+nRead,0,ndiv);
nRead=nRead+ndiv;
}

EncryptBuffer(szBuf,nRead,szPass,false);//false 解密 ture 加密
_write(fw,szBuf,nRead);
}

//关闭文件结束
_close(fw);
_close(fr);


以上是我现在使用的方法.

1.文件块不足8位的情况下补充后加密,写文件.这样做生成文件文件有可能和原文件长度不相等.而且数据会比原数据多ndiv.
补足加密后,只写原宽度数据.这种方法测试不通过的.

请问有没有其它方法来对应DES加密块不足的情况.
...全文
132 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
foxhill 2008-06-13
  • 打赏
  • 举报
回复
还有一种办法,在数据尾部加上一个固定的东西,比如FF 00...,如果不够八个字节,%8之后余7就加FF,余6就叫FF 00,余5就加FF 00 00,如果刚好是8的整数倍就加FF 00 00 00 00 00 00 00,解密之后把这部分数据删除就可以了,从后向前找,删除第一个FF之后的所有数据。
jixingzhong 2008-06-12
  • 打赏
  • 举报
回复
建议你看看 openssl 中的 des 实现方法

这是一个实现的比较不错的开源库,其中就有各类加密算法
yuzl32 2008-06-12
  • 打赏
  • 举报
回复
memset(szBuf+nRead,1,ndiv);
------
用1来填充可能存在问题,就像你说的如何判断1是填充上去的还是原来就有的.因为每个串是以'\0'为结束,所以在串后面添加'\0'比较合适.
51365133 2008-06-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yuzl32 的回复:]
若你补充的是'\0',就过滤解密后最后的'\0'即可.
对于其他加密块都不存在这个问题,因为只有最后那一块才有所谓的不足8位的情况.
[/Quote]

怎么判断后边的'\0'就是因为不足加上去的呢?
51365133 2008-06-12
  • 打赏
  • 举报
回复
        //循环加密
while(!_eof(fr))
{
nRead=_read( fr, szBuf,512);

if (_eof(fr))
{
//加密
ndiv=8-(nRead%8);

if(ndiv!=8)
{
memset(szBuf+nRead,1,ndiv);
nRead=nRead+ndiv;
}
}

EncryptBuffer(szBuf,nRead,szPass,true);
_write(fw,szBuf,nRead);
}
=================================
//循环解密
while(!_eof(fr))
{
nRead=_read( fr, szBuf,512);

EncryptBuffer(szBuf,nRead,szPass,false);

if (_eof(fr))
{
while(szBuf[--nRead]==1);
nRead++;
}

_write(fw,szBuf,nRead);
}


解密的时候怎么判断后边的1就是因为原来不够8位加上去的呢?
yuzl32 2008-06-12
  • 打赏
  • 举报
回复
若你补充的是'\0',就过滤解密后最后的'\0'即可.
对于其他加密块都不存在这个问题,因为只有最后那一块才有所谓的不足8位的情况.
51365133 2008-06-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yuzl32 的回复:]
1.文件块不足8位的情况下补充后加密,写文件.这样做生成文件文件有可能和原文件长度不相等.而且数据会比原数据多ndiv.
补足加密后,只写原宽度数据.这种方法测试不通过的.
---------------------
如果数据不足8位,自然不能按原宽度写入,这样会破坏数据的完整性.多出来又有什么关系? 解密出来后过滤掉不就行了.
[/Quote]

解密出来后怎么过滤呢?
51365133 2008-06-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 foxhill 的回复:]
加密算法固定的情况下,要求的数据长度都是一样的,只需要发送原数据长度就可以了,对称算法接收方应该没有问题。为什么会出现测试不通过的情况呢?
[/Quote]
发送原数据长度是不可以的,如果不够8位,发过去后,对方解密是错误的.
yuzl32 2008-06-12
  • 打赏
  • 举报
回复
1.文件块不足8位的情况下补充后加密,写文件.这样做生成文件文件有可能和原文件长度不相等.而且数据会比原数据多ndiv.
补足加密后,只写原宽度数据.这种方法测试不通过的.
---------------------
如果数据不足8位,自然不能按原宽度写入,这样会破坏数据的完整性.多出来又有什么关系? 解密出来后过滤掉不就行了.
foxhill 2008-06-12
  • 打赏
  • 举报
回复
加密算法固定的情况下,要求的数据长度都是一样的,只需要发送原数据长度就可以了,对称算法接收方应该没有问题。为什么会出现测试不通过的情况呢?
51365133 2008-06-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jillnicky 的回复:]
这个专家好像不怎么出来……
[/Quote]
晕,不知道能不能换专家.
  • 打赏
  • 举报
回复
这个专家好像不怎么出来……

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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