xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2069回复:18

关于新建WORD时加密的问题

楼主#
更多 发布于:2005-06-15 13:43
请问,新建WORD时会产生很多tmp文件,我要加密时是否要将tmp文件也加密呢,还是在删除tmp时再加密呢,请大家帮忙

[编辑 -  6/15/05 by  xuAmigo]

最新喜欢:

znsoftznsoft
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-06-15 16:30
word文档在保存的时候首先将内容保存在tmp里面,然后再将tmp重命名为.doc,所以应该对tmp加密。
xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-15 17:03
我加密了tmp文件后,整个WORD文件的长度就改变了变长了,有很多的临时文件要处理,高手们请帮忙吧
xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-06-16 12:22
新建WORD时,我在重命名后且文件被关闭时进行加密,但为什么不能加密呢,请高手帮忙,我给50分
xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-06-17 15:54
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-06-18 10:54
请问楼上的,你在关闭的时候怎么加密文件,代码贴出来看看
xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-06-18 11:37
我这个方法不对,在改名时设了一个标记,然后在关闭时设置加密标记,但发现irp_mj_write不是紧跟着在close后执行的,因此加密时已晚了不成功。请问你在新建WORD时有没有调试到 52 43 52 44 28 等数据,我不知道这表示什么,它是在新建空文档时出现的。
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-06-18 12:11
对word文档的处理太麻烦了,如果你照现在的方法继续做下去会发疯的,我以前也尝试在要处理的文件前面添加加密标志,读文件和写文件的时候首先判断该文件是否存在头,然后决定是否加解密。

文件可以添加头(这个基本上算是成功了),读取和写入的时候也可以通过这个头来判断是否加密,可是由于自己加了头(或者采用分组加密算法)可能导致文件的长度大于原来的长度,你还需要处理文件增大以后的问题,你必须向用户隐藏文件头的存在。总之,这样做十分麻烦,头疼! :(
xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-06-18 12:20
那请问你对新建WORD加密如何处理的,对拷贝WORD文件倒好处理的因为它没临时文件,老板一直催我,已到最后期限,做不出来只好走人,我只得求助与这里的朋友们了
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-06-18 14:28
基于目录的加密,无论里面是word还是什么别的文件,一律加密,就不用处理临时文件了,加密标识采用的是自己建立临时数据库,存放加密文件的信息。
xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-06-18 14:44
你的帖子上提到你采用的就是基于目录级的加密,不用考虑什么word文档还是什么别的类型文件,只要write就加密,read就解密。
我现在也采用类似的方法。但是在从explorer文件菜单中新建一个空的word文档时,写到磁盘上已经加了密,但是立即打开时,不从磁盘读取,却还是密文。
请问您是如何处理的?谢谢
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-06-18 15:04
没有什么特殊处理啊,只要你保证用户缓冲区始终为明文就可以了。
xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-06-23 11:13
我基本采纳了你的意见,但还有一点实现不了,现在加密标记我也不采用改变文件长度了,但在某个目录下新建WORD时就加密了(注意,这个WORD是空DOC文件),还没有编辑它就加密了。我要的效果是先新建一个空DOC文件然后能打开,并编辑后再加密,这个要求可以实现吗。
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-06-23 11:33
新建Word文件的时候,office自动会在这个word文档前面添加10K左右的数据,可能用来定义word文档的格式什么的,这就必然需要写操作,所以就被加密了,但是没有关系,等你打开这个新建的文档的时候不是又解密了吗,这样你看到的word文件还是明文啊,照样能够编辑的。
xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-06-23 11:46
等你打开这个新建的文档的时候不是又解密了吗
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
这句话我不赞同,因为新建WORD文件后,再打开时又不是从磁盘上读文件,因此又不解密了呀,你可不可以将你的新建WORD的部分代码贴上来呀,还有你说的“保证用户缓冲区始终为明文”具体指什么,我在下面的帖子上贴了我的部分代码,不知指的是不是OldBuffer.
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-06-23 12:47
if( !((Irp->Flags & IRP_NOCACHE) ||
               (Irp->Flags & IRP_PAGING_IO) ||
               (Irp->Flags & IRP_SYNCHRONOUS_PAGING_IO)) )
       {
              IoSkipCurrentIrpStackLocation(Irp);
              return IoCallDriver(hookExt->FileSystem, Irp);
       }
      
       DownTransfer = ExAllocatePool(NonPagedPool, sizeof(DOWN_TRANSFER));
       if(DownTransfer == NULL)
              return CompleteRequest(Irp, STATUS_INSUFFICIENT_RESOURCES, 0);
      
       DownTransfer->MdlAddress = Irp->MdlAddress;
       DownTransfer->UserBuffer = Irp->UserBuffer;
      
       if(Irp->MdlAddress){//Direct I/O Method
              SysBuffer = (PUCHAR)MmGetSystemAddressForMdlSafe(
                     Irp->MdlAddress,
                     NormalPagePriority
                     );
              if(SysBuffer == NULL)
              {
                     ExFreePool(DownTransfer);
                     return CompleteRequest(Irp, STATUS_INSUFFICIENT_RESOURCES, 0);
              }
       }
       else
              SysBuffer = Irp->UserBuffer;
      
       BufferSize = currentIrpStack->Parameters.Write.Length;
      
       MyBuffer = ExAllocatePool(NonPagedPool, BufferSize);
       if(MyBuffer == NULL)
       {
              ExFreePool(DownTransfer);
              return CompleteRequest(Irp, STATUS_INSUFFICIENT_RESOURCES, 0);
       }
      
                //这里将用户缓冲区拷贝给新建的加密缓冲区,然后加密
       RtlZeroMemory(MyBuffer, BufferSize);
       RtlCopyMemory(MyBuffer, SysBuffer, BufferSize);
      
       Encrypt(
              MyBuffer,
              BufferSize,
              FileEncryptAlgorithm,
              FileEncryptKey,
              FileEncryptKeyLen
              );
      
       DownTransfer->MyBuffer = MyBuffer;
      
       Irp->MdlAddress = IoAllocateMdl(MyBuffer, BufferSize, FALSE, FALSE, NULL);
       if(!Irp->MdlAddress)
       {
              DbgPrint(("IoAllocateMdl call failed\n"));
              ExFreePool(DownTransfer);
              ExFreePool(MyBuffer);
              return CompleteRequest(Irp, STATUS_INSUFFICIENT_RESOURCES, 0);
       }
      
       MmBuildMdlForNonPagedPool(Irp->MdlAddress);
      
       Irp->UserBuffer = MmGetMdlVirtualAddress(Irp->MdlAddress);
      
       IoCopyCurrentIrpStackLocationToNext(Irp);
       IoSetCompletionRoutine(
              Irp,
              FilemonWriteCompleted,
              DownTransfer,
              TRUE,
              TRUE,
              TRUE
              );      

       return IoCallDriver(hookExt->FileSystem, Irp);


完成例程:
PDOWN_TRANSFER       DownTransfer = (PDOWN_TRANSFER)Context;
      
                if( Irp->PendingReturned )
              IoMarkIrpPending( Irp );

       if(Irp->MdlAddress)
       {
              IoFreeMdl(Irp->MdlAddress);
              Irp->MdlAddress = DownTransfer->MdlAddress;
              Irp->UserBuffer = DownTransfer->UserBuffer;
              ExFreePool(DownTransfer->MyBuffer);
              ExFreePool(DownTransfer);
       }

       return Irp->IoStatus.Status;
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-06-23 12:49
所有的文件都一样处理,并没有对新建word文档有什么特殊处理。
xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-06-23 14:17
我的程序和你的差不多,没有对原缓冲区进行处理只对新的缓冲区进行处理,你可否讲一下你新建WORD文件的结果呀,我还是老样子,新建了空WORD文档后立即打开就打不开了因为是密文了,
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-06-23 15:45
我说过了,新建任何文件都一样,新建以后立刻就可以打开,而且加解密正常。出现你说的现象说明你的缓存里面还是密文,可能哪里出问题了。仔细检查一下吧。
游客

返回顶部