阅读:1937回复:7
再问filedisk加上加密(else wowocock是否可以回答一下,谢谢)
实在是无法搞定,大师都说我的算法有问题,可是我反复测试,我是在驱动中测试的,都是正确的。
可是格式化后只有4K可用,我分配了10M,其他显示已经使用了。 4k 还是可以使用,写入读出文件都很正常。 可是我把加密部分rc4((unsigned char *)sbuf,Len,&key);去掉确实可以使用。 使用des 问题会更多,des 是块加密的,加密后结果长度是8的整数 所以我想使用rc4 rc4 是长度不变的,调用一次是加密,第二次调用是解密。 我觉得已经没有别的办法了, 大侠是否可以回答一下。是否其他地方还有问题。 case IRP_MJ_READ: pBuf = MmGetSystemAddressForMdl(irp->MdlAddress); Len = io_stack->Parameters.Read.Length; ZwReadFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, pBuf, Len, &io_stack->Parameters.Read.ByteOffset, NULL ); decrypt(pBuf,Len); break; case IRP_MJ_WRITE: 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; } pBuf = MmGetSystemAddressForMdl(irp->MdlAddress); Len = io_stack->Parameters.Write.Length; encrypt(pBuf,Len); ZwWriteFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, pBuf, Len, &io_stack->Parameters.Write.ByteOffset, NULL ); decrypt(pBuf,Len); break; void decrypt(PVOID pBuf,ULONG Len) { unsigned char *sbuf; rc4_key key; UCHAR szKey[8] = {0x21,0x32,0x23,0x34,0x25,0x36,0x27,0x38}; sbuf=ExAllocatePool(NonPagedPool,Len+8); RtlCopyMemory(sbuf,pBuf,Len); prepare_key(szKey,8,&key); rc4((unsigned char *)sbuf,Len,&key); RtlCopyMemory(pBuf,sbuf,Len); ExFreePool(sbuf); } void encrypt(PVOID pBuf,ULONG Len) { unsigned char *sbuf; rc4_key key; UCHAR szKey[8] = {0x21,0x32,0x23,0x34,0x25,0x36,0x27,0x38}; sbuf=ExAllocatePool(NonPagedPool,Len+8); RtlCopyMemory(sbuf,pBuf,Len); prepare_key(szKey,8,&key); rc4((unsigned char *)sbuf,Len,&key); RtlCopyMemory(pBuf,sbuf,Len); ExFreePool(sbuf); } //rc4.c #include \"rc4.h\" static void swap_byte(unsigned char *a, unsigned char *b); void prepare_key(unsigned char *key_data_ptr, int key_data_len, rc4_key *key) { unsigned char swapByte; unsigned char index1; unsigned char index2; unsigned char* state; short counter; state = &key->state[0]; for(counter = 0; counter < 256; counter++) state[counter] = (unsigned char)counter; key->x = 0; key->y = 0; index1 = 0; index2 = 0; for(counter = 0; counter < 256; counter++) { index2 = (key_data_ptr[index1] + state[counter] + index2) % 256; swap_byte(&state[counter], &state[index2]); index1 = (index1 + 1) % key_data_len; } } void rc4(unsigned char *buffer_ptr, unsigned long buffer_len, rc4_key *key) { unsigned char x; unsigned char y; unsigned char* state; unsigned char xorIndex; unsigned long counter; x = key->x; y = key->y; state = &key->state[0]; for(counter = 0; counter < buffer_len; counter ++) { x = (x + 1) % 256; y = (state[x] + y) % 256; swap_byte(&state[x], &state[y]); xorIndex = (state[x] + state[y]) % 256; buffer_ptr[counter] ^= state[xorIndex]; } key->x = x; key->y = y; } static void swap_byte(unsigned char *a, unsigned char *b) { unsigned char swapByte; swapByte = *a; *a = *b; *b = swapByte; } //rc4.h #ifndef HEADER_RC4_H #define HEADER_RC4_H typedef struct rc4_key { unsigned char state[256]; unsigned char x; unsigned char y; } rc4_key; void prepare_key(unsigned char *key_data_ptr,int key_data_len, rc4_key *key); void rc4(unsigned char *buffer_ptr,unsigned long buffer_len,rc4_key * key); #endif [编辑 - 1/31/04 by strongdisk] |
|
最新喜欢:![]() |
沙发#
发布于:2004-01-31 21:49
我觉得还是你算法的问题,用DES吧,虽然慢点,但还可行
|
|
|
板凳#
发布于:2004-07-28 06:51
Where can find DES ?
|
|
地板#
发布于:2004-08-24 21:34
RC4在加解密虚拟盘文件没有问题。
|
|
地下室#
发布于:2004-08-25 00:31
在仔细检查检查吧!
|
|
5楼#
发布于:2004-09-02 11:03
是你驱动代码的问题,和加密算法有什么关系
不管是什么加密算法都可以在filedisk 中用, 我们都做过了,努力吧 |
|
6楼#
发布于:2004-09-07 16:17
我最近用DES做过加密,原来也有这样的问题,后来我改成将每次收到的数据分成每块512个字节大小的小数据块加密,就解决了.
|
|
7楼#
发布于:2007-05-29 00:04
cannot convert from 'PVOID' to 'unsigned char *'
|
|