阅读:2171回复:8
wowocock 请进
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; |
|
最新喜欢:![]() |
沙发#
发布于:2004-08-23 09:31
收工了!
DES3存在串行化的问题可能 用DES就OK了! 还是要感谢各位的热心帮助。 |
|
板凳#
发布于:2004-08-20 15:53
您能确定我的调用位置没有问题吗?
我怕算法换了仍然出问题呢 还有呀,您手头有您说的那个算法吗? 能否发一个给我呢,要不是走头无路真不好意思开口呢 我的mail:wangdaokou@163.com |
|
地板#
发布于:2004-08-20 15:31
看你在FILEDISK中的处理应该没有问题,我自己以前做过BLOWFISH的加密,由于都是对齐到8个字节,并且也很顺利的一次就成功了,所以也没有做多少研究。
|
|
|
地下室#
发布于:2004-08-20 15:21
顶!!!!!!!!
|
|
5楼#
发布于:2004-08-20 15:10
晕,FILEDISK的例子以前玩过就丢了,早忘了,但DES算法好象是可以的,你参考下以前的帖子,关于这方面的讨论很多的,我个人认为最好用BLOWFISH做最好,速度很快,基本上和没加密时的速度差不多。 终于把老大盼来了:) 您要帮我分析一下,调用的位置是否有问题,如果位置有问题,既使换了其它算法,仍然不成呢。 |
|
6楼#
发布于:2004-08-20 15:07
在初始化key的时候,以及在umount的时候,我都在相应的位置增加了对DES算法的调试,既对一个8个字节的字符串进行加密,然后在解密,都显示成功。
好郁闷的。。。。。。 |
|
7楼#
发布于:2004-08-20 15:05
晕,FILEDISK的例子以前玩过就丢了,早忘了,但DES算法好象是可以的,你参考下以前的帖子,关于这方面的讨论很多的,我个人认为最好用BLOWFISH做最好,速度很快,基本上和没加密时的速度差不多。
|
|
|
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算法在驱动中的工作是正常的。 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 请教,问题出在哪儿? |
|