链路加密方案的实现

实现工具及环境
本方案提出在微端口驱动程序中实施加解密,因此要选用适当的工具对微端口驱动程序进行改造.采用NuMega公司的驱动程序开发工具Driverstudio.其中DriverNetWorks是针对Windows网络驱动程序的开发工具。

数据的发送和截取
数据的发送由上层协议驱动发起,发送的数据信息用一个NDIS—PACKET包来描述.NDIS库提供了一些函数来提取包中的信息,并对其进行处理.发送过程可分为两种情况:


(1)当协议驱动程序有数据要发送时,启动传输操作,通过NIDS库调用微端口驱动程序的MyDriverSend函数.该函数调用的参数是一个指向NDIS_PACKET包(描述将要发送的信息)的指针.驱动调用NdisQueryPacket函数得到包的长度和存放待发送包缓冲区的逻辑地址.然后设置NIC上的寄存器将包发送出去,并返回—个发送成功的状态.


(2)如果驱动程序不能立即发送包,则将它送到”待传输”队列中,然后由中断处理函数MyDriverHandlelnterrupt来完成发送.完成发送以后,调用NdisMSendComplete函数通知上层.由于从上层传下来的数据包到微端口层被放在预先分配的缓冲区中.用NDIS提供的相应函数,可以得到该缓冲区的首地址和数据长度.因此,可在驱动程序中加入Send—Intercept子程序,利用NDIS提供的函数得到存放数据缓冲区的相应参数.然后调用加密模块接口函数DES—EN-CRYPT对数据包进行加密.*后调用CardWrite子程序将加密后的密文发送到网络上.

数据的接收
数据接收是将网络上的数据帧接收到网卡缓冲区中,然后由驱动程序将缓冲区中的数据读入内存中。网卡接收数据时会产生一个中断,因此驱动程序接收数据首先要在中断处理过程MyDriver—Handlelnterrup中进行.对于以太网卡,程序调用NdisMEthReceivelndicate函数将一个称为looka—head的数据传递给上层协议驱动,由协议驱动检查收到的数据是否符合协议要求.1ookahead是指网卡中准备接收的数据的一部分.因为协议驱动判断微端口接收的数据是否符合协议要求时,不需要对所有数据都进行判断,只需对一部分数据(1ookahead)进行判断即可.


如果协议驱动判断数据符合要求,就会调用微端口的MyDriverTransferData函数,将除looka—head之外剩余的数据传送到内存中,再交给上层驱动处理.当传送完毕时,调用NdisMEth—ReiveIndicatecomplete函数通知上层驱动数据已经接收完毕.如果协议驱动检查数据不符合要求,就会终止接收过程.而 已经传送到 内存中的loo—kahead也会被下次接收到的数据覆盖掉。

加解密的实现
加解密实现的主要思想是将加解密算法集成到驱动程序中,本方案采用传统的DES加解密算法作为示例. 数据在被送人加密模块之前已经成帧,前14个字节存放的是源地址、目的地址和数据长度.发送截取函数Send—Intercept得到将要加密的数据长度和起始地址后,调用加密模块的接口函数DES—ENCRYPT,从数据的第l5个字节开始进行加密,这样就将除地址和数据长度之外的所有数据都进行了加密.数据进行加密之后,驱动程序调用CardWrite函数将数据发送到网络中.


数据帧被接收到网卡缓冲区后,读人到内存当中的前14个字节数据为源地址、目的地址和数据长度.这14个字节的信息是以明文形式存在的.解密时,接收截取子程序Receive—Intercept调用解密模块接口函数DES—DECRYPT,从密文数据的*5个字节开始进行解密运算.解密之后将数据存入预先分配的缓冲区Prebuffer中.此后,驱动程序无论调用,NdisMEthReceivelndicate函数还是myDriverTransferData函数,都是从缓冲区Prebuffer中读取数据,而不是从网卡缓冲区中读取,直至解密过程结束.

恒波lockdir文件夹加密器转载自张杨的《基于NDIS的数据链路层加密》。