阅读:2242回复:7
word加密求助
RC4加密算法在对较大WORD文件(380K左右)加密后再读出就会出现以下错误:
WORD在试图打开文件时遇到错误。 请尝试下列方法: *检查文档或驱动器的文件权限 *确保有足够的内存和磁盘空间 *用文本恢复转换器打开文件。 而对小WORD文件(30K左右)加解密则正常。 如果使用取反或加一减一再大的word也是正常加解密 我查了加解密文件前后的长度也是正常的,但大文件就是打不开,我还是怀疑在加密上有问题,我使用的是sfilter框架,请哪位高手帮下忙,不胜感激 |
|
沙发#
发布于:2008-06-17 14:26
有没有高手帮帮忙啊
|
|
板凳#
发布于:2008-06-17 14:31
问一下,楼主。您是怎么处理Word的临时文件的。你在透明加解密中,怎么识别Word的临时文件。
|
|
地板#
发布于: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); 哪位帮忙看看 |
|
地下室#
发布于:2008-06-17 14:49
我把tmp也当成一般文件处理,好象没什么问题啊
|
|
5楼#
发布于:2008-06-18 10:58
我又查了查,所有word小于64k的都可以,但大于64k的就有问题.么样解决啊?
|
|
6楼#
发布于:2011-03-18 13:32
楼主,我想知道你在过滤读写的时,你是怎么过滤识别到这是word临时文件的呢,我通过路径只过滤到word文件本身。能告诉我下不
|
|
7楼#
发布于:2011-05-14 22:22
我也想知道
|
|