wanyunlo197702
驱动牛犊
驱动牛犊
  • 注册日期2008-02-29
  • 最后登录2008-07-04
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望19点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:2242回复:7

word加密求助

楼主#
更多 发布于:2008-06-17 14:17
RC4加密算法在对较大WORD文件(380K左右)加密后再读出就会出现以下错误:

WORD在试图打开文件时遇到错误。
请尝试下列方法:
*检查文档或驱动器的文件权限
*确保有足够的内存和磁盘空间
*用文本恢复转换器打开文件。

而对小WORD文件(30K左右)加解密则正常。
如果使用取反或加一减一再大的word也是正常加解密
我查了加解密文件前后的长度也是正常的,但大文件就是打不开,我还是怀疑在加密上有问题,我使用的是sfilter框架,请哪位高手帮下忙,不胜感激
wanyunlo197702
驱动牛犊
驱动牛犊
  • 注册日期2008-02-29
  • 最后登录2008-07-04
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望19点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-06-17 14:26
有没有高手帮帮忙啊
zhou_gz8888
驱动牛犊
驱动牛犊
  • 注册日期2003-01-22
  • 最后登录2014-08-05
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望247点
  • 贡献值1点
  • 好评度28点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-06-17 14:31
问一下,楼主。您是怎么处理Word的临时文件的。你在透明加解密中,怎么识别Word的临时文件。
wanyunlo197702
驱动牛犊
驱动牛犊
  • 注册日期2008-02-29
  • 最后登录2008-07-04
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望19点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-06-17 14:47
我加密的代码
sfwrite()
...
do
    {
        if (Irp->MdlAddress)
            OldBuffer = MmGetSystemAddressForMdl(Irp->MdlAddress);
        else
            OldBuffer = Irp->UserBuffer;

        if (!OldBuffer)
        {
            KdPrint(("sfilter!SfWrite: STATUS_INVALID_PARAMETER\n"));
            Status = STATUS_INVALID_PARAMETER;
            break;
        }

        Length = IrpSp->Parameters.Write.Length;

        CompletionCtx = ExAllocateFromNPagedLookasideList(&gReadWriteCompletionCtxLookAsideList);
        if (!CompletionCtx)
        {
            KdPrint(("sfilter!SfWrite: STATUS_INSUFFICIENT_RESOURCES\n"));
            Status = STATUS_INSUFFICIENT_RESOURCES;
            break;
        }

        MyBuffer = ExAllocatePoolWithTag(NonPagedPool, IrpSp->Parameters.Write.Length, SFLT_POOL_TAG);
        if (!MyBuffer)
        {
            KdPrint(("sfilter!SfWrite: STATUS_INSUFFICIENT_RESOURCES\n"));
            ExFreePool(CompletionCtx);
            Status = STATUS_INSUFFICIENT_RESOURCES;
            break;
        }

        CompletionCtx->OldMdl = Irp->MdlAddress;
        CompletionCtx->OldUserBuffer = Irp->UserBuffer;
        CompletionCtx->OldSystemBuffer = Irp->AssociatedIrp.SystemBuffer;

        CompletionCtx->OldBuffer = OldBuffer;
        CompletionCtx->MyBuffer = MyBuffer;
        CompletionCtx->Length = Length;

        Irp->MdlAddress = IoAllocateMdl(MyBuffer, IrpSp->Parameters.Write.Length, FALSE, TRUE, NULL);
        if (!Irp->MdlAddress)
        {
            KdPrint(("sfilter!SfWrite: STATUS_INSUFFICIENT_RESOURCES\n"));
            Irp->MdlAddress = CompletionCtx->OldMdl;
            ExFreePool(CompletionCtx);
            ExFreePool(MyBuffer);
            Status = STATUS_INSUFFICIENT_RESOURCES;
            break;
        }

        KdPrint(("sfilter!SfWrite: Encrypt %ws\n", FileCtxPtr->Name));
        

                                              keyvalue = GetKeyFile("keyt=");                     //加密密码
        prepare_key(keyvalue,sizeof keyvalue,&key);//打乱密码
        rc4(OldBuffer,Length,&key);                           //rc4加密算法,加密oldbuffer
                                          for(Offset = 0;Offset<Length;++Offset)
        {
            ((PUCHAR) MyBuffer)[Offset] = ((PUCHAR) OldBuffer)[Offset];
        }

        keyvalue = NULL;
        MmBuildMdlForNonPagedPool(Irp->MdlAddress);
        Irp->UserBuffer = MmGetMdlVirtualAddress(Irp->MdlAddress);

        IoCopyCurrentIrpStackLocationToNext(Irp);
        IoSetCompletionRoutine(Irp, SfWriteCompletion, CompletionCtx, TRUE, TRUE,TRUE);
        return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
    } while (FALSE);
哪位帮忙看看
wanyunlo197702
驱动牛犊
驱动牛犊
  • 注册日期2008-02-29
  • 最后登录2008-07-04
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望19点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-06-17 14:49
我把tmp也当成一般文件处理,好象没什么问题啊
wanyunlo197702
驱动牛犊
驱动牛犊
  • 注册日期2008-02-29
  • 最后登录2008-07-04
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望19点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-06-18 10:58
我又查了查,所有word小于64k的都可以,但大于64k的就有问题.么样解决啊?
redchairman
驱动牛犊
驱动牛犊
  • 注册日期2009-05-08
  • 最后登录2015-05-07
  • 粉丝2
  • 关注2
  • 积分41分
  • 威望361点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2011-03-18 13:32
楼主,我想知道你在过滤读写的时,你是怎么过滤识别到这是word临时文件的呢,我通过路径只过滤到word文件本身。能告诉我下不
fatepro
驱动牛犊
驱动牛犊
  • 注册日期2011-05-12
  • 最后登录2011-09-07
  • 粉丝0
  • 关注0
  • 积分68分
  • 威望681点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2011-05-14 22:22
我也想知道
游客

返回顶部