strongdisk
驱动牛犊
驱动牛犊
  • 注册日期2003-10-11
  • 最后登录2004-06-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1937回复:7

再问filedisk加上加密(else wowocock是否可以回答一下,谢谢)

楼主#
更多 发布于:2004-01-31 16:42
实在是无法搞定,大师都说我的算法有问题,可是我反复测试,我是在驱动中测试的,都是正确的。

可是格式化后只有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]

最新喜欢:

cyliucyliu
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2004-01-31 21:49
我觉得还是你算法的问题,用DES吧,虽然慢点,但还可行
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
powenko
驱动牛犊
驱动牛犊
  • 注册日期2004-05-07
  • 最后登录2006-12-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-07-28 06:51
Where can find DES ?
codeghost
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2011-11-15
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-08-24 21:34
RC4在加解密虚拟盘文件没有问题。
Sundsea
驱动老牛
驱动老牛
  • 注册日期2003-05-06
  • 最后登录2012-06-05
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望35点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-08-25 00:31
在仔细检查检查吧!
david99
驱动牛犊
驱动牛犊
  • 注册日期2001-06-02
  • 最后登录2010-12-03
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-09-02 11:03
是你驱动代码的问题,和加密算法有什么关系
不管是什么加密算法都可以在filedisk 中用,
我们都做过了,努力吧
wangka
驱动牛犊
驱动牛犊
  • 注册日期2003-12-11
  • 最后登录2010-05-07
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望23点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-09-07 16:17
我最近用DES做过加密,原来也有这样的问题,后来我改成将每次收到的数据分成每块512个字节大小的小数据块加密,就解决了.
chrysanth
驱动牛犊
驱动牛犊
  • 注册日期2007-05-02
  • 最后登录2010-02-02
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望129点
  • 贡献值0点
  • 好评度61点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-05-29 00:04
cannot convert from 'PVOID' to 'unsigned char *'
游客

返回顶部