wang1203
驱动牛犊
驱动牛犊
  • 注册日期2004-08-06
  • 最后登录2004-09-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2171回复:8

wowocock 请进

楼主#
更多 发布于:2004-08-20 14:16
filedisk用DES算法加解密的问题
wowocock,您好
再次对您的回贴表示感谢!
在这个论坛上搜索出来不少的关于虚拟磁盘加解密的帖子,但是没有找到一个系统的说明。
我也在这里帖子的基础上,调试了加解密功能,用简单的运算能通过,换成DES就连格式化也不能实现:(

代码如下:
            case IRP_MJ_READ:
if (!VFLAG)
{
                    irp->IoStatus.Status = STATUS_DRIVER_INTERNAL_ERROR;
                    irp->IoStatus.Information = 0;
                    break;
}
                system_buffer = (PUCHAR) MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority);
                if (system_buffer == NULL)
                {
                    irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
                    irp->IoStatus.Information = 0;
                    break;
                }
                buffer = (PUCHAR) ExAllocatePool(PagedPool, io_stack->Parameters.Read.Length);
                if (buffer == NULL)
                {
                    irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
                    irp->IoStatus.Information = 0;
                    break;
                }
                ZwReadFile(
                    device_extension->file_handle,
                    NULL,
                    NULL,
                    NULL,
                    &irp->IoStatus,
                    buffer,
                    io_stack->Parameters.Read.Length,
                    &io_stack->Parameters.Read.ByteOffset,
                    NULL
                    );

//============================DECRYPT=======================================
iOK = io_stack->Parameters.Read.Length/8; //此处确定一直是8的倍数
tmp = buffer;
for(i=0;i<iOK;i++)
{
/*
for(j=0;j<8;j++)
tmp[j] = tmp[j] - j;
*/
DES3_CBCUpdate( 1, &desCtxDe, tmp, 8 ); //des解密处理
// DES3_CBCUpdate( 2, &desCtxEn, tmp, 8 );

tmp += 8;
}
//============================DECRYPT=======================================

                RtlCopyMemory(system_buffer, buffer, io_stack->Parameters.Read.Length);
                ExFreePool(buffer);
                break;

            case IRP_MJ_WRITE:
if (!VFLAG)
{
                    irp->IoStatus.Status = STATUS_DRIVER_INTERNAL_ERROR;
                    irp->IoStatus.Information = 0;
                    break;
}

                if ((io_stack->Parameters.Write.ByteOffset.QuadPart +
                     io_stack->Parameters.Write.Length) >
                     device_extension->file_size.QuadPart)
                {
                    irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
                    irp->IoStatus.Information = 0;
                }

CurrentAddress = MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority);
buf=ExAllocatePool(NonPagedPool,io_stack->Parameters.Write.Length);
RtlCopyMemory(buf,CurrentAddress,io_stack->Parameters.Write.Length);

//============================ENCRYPT=======================================
iOK = io_stack->Parameters.Read.Length/8;
flag = 2;
tmp = buf;
for(i=0;i<iOK;i++)
{
/*
//简单的数据变化处理
for(j=0;j<8;j++)
tmp[j] = tmp[j] + j;
*/
DES3_CBCUpdate( 2, &desCtxEn, tmp, 8 ); //des加密处理
// DES3_CBCUpdate( 1, &desCtxDe, tmp, 8 );

tmp += 8;
}
//============================ENCRYPT=======================================

                ZwWriteFile(
                    device_extension->file_handle,
                    NULL,
                    NULL,
                    NULL,
                    &irp->IoStatus,
//                    MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority),
   buf,
                    io_stack->Parameters.Write.Length,
                    &io_stack->Parameters.Write.ByteOffset,
                    NULL
                    );

ExFreePool(buf);
                break;

最新喜欢:

hnfudyhnfudy
wang1203
驱动牛犊
驱动牛犊
  • 注册日期2004-08-06
  • 最后登录2004-09-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-23 09:31
收工了!
DES3存在串行化的问题可能
用DES就OK了!
还是要感谢各位的热心帮助。
wang1203
驱动牛犊
驱动牛犊
  • 注册日期2004-08-06
  • 最后登录2004-09-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-20 15:53
您能确定我的调用位置没有问题吗?
我怕算法换了仍然出问题呢
还有呀,您手头有您说的那个算法吗?
能否发一个给我呢,要不是走头无路真不好意思开口呢
我的mail:wangdaokou@163.com
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2004-08-20 15:31
看你在FILEDISK中的处理应该没有问题,我自己以前做过BLOWFISH的加密,由于都是对齐到8个字节,并且也很顺利的一次就成功了,所以也没有做多少研究。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
Sundsea
驱动老牛
驱动老牛
  • 注册日期2003-05-06
  • 最后登录2012-06-05
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望35点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-08-20 15:21
顶!!!!!!!!
wang1203
驱动牛犊
驱动牛犊
  • 注册日期2004-08-06
  • 最后登录2004-09-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-08-20 15:10
晕,FILEDISK的例子以前玩过就丢了,早忘了,但DES算法好象是可以的,你参考下以前的帖子,关于这方面的讨论很多的,我个人认为最好用BLOWFISH做最好,速度很快,基本上和没加密时的速度差不多。


终于把老大盼来了:)

您要帮我分析一下,调用的位置是否有问题,如果位置有问题,既使换了其它算法,仍然不成呢。
wang1203
驱动牛犊
驱动牛犊
  • 注册日期2004-08-06
  • 最后登录2004-09-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-08-20 15:07
在初始化key的时候,以及在umount的时候,我都在相应的位置增加了对DES算法的调试,既对一个8个字节的字符串进行加密,然后在解密,都显示成功。
好郁闷的。。。。。。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2004-08-20 15:05
晕,FILEDISK的例子以前玩过就丢了,早忘了,但DES算法好象是可以的,你参考下以前的帖子,关于这方面的讨论很多的,我个人认为最好用BLOWFISH做最好,速度很快,基本上和没加密时的速度差不多。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wang1203
驱动牛犊
驱动牛犊
  • 注册日期2004-08-06
  • 最后登录2004-09-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-08-20 14:23
第一次试验:
for(i=0;i<iOK;i++)
{
for(j=0;j<8;j++)
tmp[j] = tmp[j] - j;
tmp += 8;
}
就对缓冲区做这么简单的处理,成功!

第二次试验:
for(i=0;i<iOK;i++)
{
DES3_CBCUpdate( 1, &desCtxDe, tmp, 8 ); //des解密处理
tmp += 8;
}
替换成DES算法,读取的位置解密,写入的位置加密,失败!

第三次试验:
for(i=0;i<iOK;i++)
{
DES3_CBCUpdate( 1, &desCtxDe, tmp, 8 ); //des解密处理
DES3_CBCUpdate( 2, &desCtxEn, tmp, 8 ); //des加密处理
tmp += 8;
}

就是仅仅在读取〔或者写入〕的位置做工作,调用两次,成功!
这次试验是为了验证DES算法在驱动中的工作是正常的。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
请教,问题出在哪儿?
游客

返回顶部