數(shù)據(jù)鏈路層加密方法

為了提高內(nèi)部網(wǎng)絡(luò)數(shù)據(jù)的安全性,分析了網(wǎng)絡(luò)驅(qū)動程序接口規(guī)范( NDIS)以及Windows網(wǎng)卡驅(qū)動程序,我們提出了一種基于NDIS的網(wǎng)絡(luò)數(shù)據(jù)鏈路層加密方案。

一、Windows環(huán)境下網(wǎng)卡驅(qū)動程序

1、網(wǎng)絡(luò)驅(qū)動程序接口規(guī)范NDIS

Microsoft和3Com公司于1989年聯(lián)合開發(fā)出了網(wǎng)絡(luò)驅(qū)動程序接口規(guī)范NDIS(Network DriverInterface Specification)。NDIS規(guī)范了網(wǎng)絡(luò)驅(qū)動程序間的標(biāo)準(zhǔn)接口,它使不同的傳輸可以采用一種通用的方式來訪問由不同廠商制造的網(wǎng)卡。網(wǎng)絡(luò)驅(qū)動程序不是直接調(diào)用操作系統(tǒng)的例程,而是通過NDIS進行系統(tǒng)調(diào)用,而NDIS驅(qū)動程序所存在的環(huán)境都是由NDIS庫(Ndis.sys)所創(chuàng)建的,這個庫輸出一組標(biāo)準(zhǔn)接口,提供一個形如NdisXxx的系統(tǒng)函數(shù)集,使各NDIS驅(qū)動程序不需要直接與操作系統(tǒng)進行通信。

NDIS支持下列幾種網(wǎng)絡(luò)驅(qū)動程序形式:微端口驅(qū)動程序( Miniport drivers)、中間驅(qū)動程序(In-tennediate drivers)和協(xié)議驅(qū)動程序(Protocol drir-ers)。NDIS各層驅(qū)動程序以及它們之間的關(guān)系如圖1所示:

數(shù)據(jù)鏈路層加密方法

2、網(wǎng)卡驅(qū)動程序

在windows環(huán)境下,網(wǎng)卡驅(qū)動程序?qū)?yīng)于NDIS的微端口驅(qū)動程序…,微端口驅(qū)動程序工作在數(shù)據(jù)鏈路層,是與網(wǎng)絡(luò)接口卡( NIC)結(jié)合最緊密的一層驅(qū)動程序.它調(diào)用NDIS庫提供的接口函數(shù)來完成NIC與上層驅(qū)動程序之間的相互通訊.NDIS庫導(dǎo)出一組函數(shù)集合(NdisXxx函數(shù))來封裝所有微端口需要調(diào)用的操作系統(tǒng)函數(shù),而微端口也輸出一組MiniportXxx函數(shù)供NDIS和上層驅(qū)動程序調(diào)用。

二、鏈路加密方案的設(shè)計與實現(xiàn)

1、設(shè)計思想

數(shù)據(jù)鏈路層是OSI系統(tǒng)結(jié)構(gòu)中的第二層,如果采用鏈路加密,則網(wǎng)絡(luò)中每條通信鏈路上的加密是獨立實現(xiàn)的。對每條鏈路可以使用不同的密鑰,這樣,當(dāng)某條鏈路受到破壞時也不會導(dǎo)致其他鏈路上傳遞的加密信息被解出。

NDIS微端口驅(qū)動位于網(wǎng)絡(luò)鏈路層,是網(wǎng)絡(luò)驅(qū)動中與網(wǎng)卡結(jié)合最緊密的驅(qū)動程序。因此可以對微端口驅(qū)動程序進行改造,在驅(qū)動程序中實現(xiàn)對數(shù)據(jù)幀的截取,并調(diào)用加解密模塊對數(shù)據(jù)進行加解密,如圖2所示,對驅(qū)動程序的改造大體可以分為兩步:截取數(shù)據(jù)幀和加解密模塊的實現(xiàn)。

數(shù)據(jù)鏈路層加密方法

(1)截取數(shù)據(jù)幀

NDIS庫為微端口驅(qū)動程序提供了一系列接口函數(shù),微端口驅(qū)動程序可以利用這些函數(shù)在主機與網(wǎng)絡(luò)之間建立聯(lián)系,也可以利用這些函數(shù)來截取數(shù)據(jù)。

在發(fā)送本機數(shù)據(jù)到網(wǎng)卡之前,可以在微端口驅(qū)動程序中加入截取子程序截獲數(shù)據(jù)幀,并把數(shù)據(jù)幀送人加密模塊進行加密,然后將加密后的密文送人網(wǎng)卡緩沖區(qū)中。接收數(shù)據(jù)時,從網(wǎng)卡緩沖區(qū)中接收的密文被送人主機內(nèi)存,密文在送往上層網(wǎng)絡(luò)驅(qū)動程序之前被接收截取子程序截獲,并調(diào)用解密模塊將其解密成明文,之后再將明文數(shù)據(jù)送交上層處理。

(2)加密解密模塊

考慮到幀長的限制,對于數(shù)據(jù)幀加密要求必須保證其明文和密文長度相等,因此在加解密模塊當(dāng)中采用分組密碼算法,分組密碼的工作方式是將明文分成固定長度的組(塊),用同一密鑰對每一塊加密,輸出也是固定長度的密文,本文以DES為例。

考慮到軟件加解密過程速度較慢,為了提高速度,直接將加解密模塊嵌入到微端口驅(qū)動程序中,這樣所有對數(shù)據(jù)的處理將全部在系統(tǒng)底層進行,大大提高了數(shù)據(jù)處理的效率,最后將所有模塊集成在一起,編譯生成網(wǎng)卡驅(qū)動程序MyDriver.SYS文件,分別安裝在兩臺主機中進行測試。

2、方案實現(xiàn)

(1)實現(xiàn)工具及環(huán)境

本方案提出在微端口驅(qū)動程序中實施加解密,因此要選用適當(dāng)?shù)墓ぞ邔ξ⒍丝隍?qū)動程序進行改造。采用NuMega公司的驅(qū)動程序開發(fā)工具DriverStudio。其中DriverNetWorks是針對Windows網(wǎng)絡(luò)驅(qū)動程序的開發(fā)工具。

(2)數(shù)據(jù)的發(fā)送和截取

數(shù)據(jù)的發(fā)送由上層協(xié)議驅(qū)動發(fā)起,發(fā)送的數(shù)據(jù)信息用一個NDIS_PACKET包來描述,NDIS庫提供了一些函數(shù)來提取包中的信息,并對其進行處理。發(fā)送過程可分為兩種情況:

1)當(dāng)協(xié)議驅(qū)動程序有數(shù)據(jù)要發(fā)送時,啟動傳輸操作,通過NIDS庫調(diào)用微端口驅(qū)動程序的MyDriverSend函數(shù)。該函數(shù)調(diào)用的參數(shù)是一個指向NDIS_ PACKET包(描述將要發(fā)送的信息)的指針。驅(qū)動調(diào)用NdisQueryPacket函數(shù)得到包的長度和存放待發(fā)送包緩沖區(qū)的邏輯地址,然后設(shè)置MC上的寄存器將包發(fā)送出去,并返回—個發(fā)送成功的狀態(tài)。

2)如果驅(qū)動程序不能立即發(fā)送包,則將它送到“待傳輸”隊列中,然后由中斷處理函數(shù)MyDriverHandlelnterrupt來完成發(fā)送。完成發(fā)送以后,調(diào)用NdisMSendComplete函數(shù)通知上層。

由于從上層傳下來的數(shù)據(jù)包到微端口層被放在預(yù)先分配的緩沖區(qū)中。用NDIS提供的相應(yīng)函數(shù),可以得到該緩沖區(qū)的首地址和數(shù)據(jù)長度。因此,可在驅(qū)動程序中加入Send_lntercept子程序,利用NDIS提供的函數(shù)得到存放數(shù)據(jù)緩沖區(qū)的相應(yīng)參數(shù)。然后調(diào)用加密模塊接口函數(shù)DES_EN,子程序?qū)⒓用芎蟮拿芪陌l(fā)送到網(wǎng)絡(luò)上。

3、數(shù)據(jù)的接收

數(shù)據(jù)接收是將網(wǎng)絡(luò)上的數(shù)據(jù)幀接收到網(wǎng)卡緩沖區(qū)中,然后由驅(qū)動程序?qū)⒕彌_區(qū)中的數(shù)據(jù)讀人內(nèi)存中。

網(wǎng)卡接收數(shù)據(jù)時會產(chǎn)生一個中斷,因此驅(qū)動程序接收數(shù)據(jù)首先要在中斷處理過程MyDnver-Handlelnterrup中進行,對于以太網(wǎng)卡,程序調(diào)用NdisMEthReceivelndicate函數(shù)將一個稱為looka-head的數(shù)據(jù)傳遞給上層協(xié)議驅(qū)動,由協(xié)議驅(qū)動檢查收到的數(shù)據(jù)是否符合協(xié)議要求。lookahead是指網(wǎng)卡中準(zhǔn)備接收的數(shù)據(jù)的一部分,因為協(xié)議驅(qū)動判斷微端口接收的數(shù)據(jù)是否符合協(xié)議要求時,不需要對所有數(shù)據(jù)都進行判斷,只需對一部分?jǐn)?shù)據(jù)(lookahead)進行判斷即可。

如果協(xié)議驅(qū)動判斷數(shù)據(jù)符合要求,就會調(diào)用微端口的MyDriverTmnsferData函數(shù),將除looka-head之外剩余的數(shù)據(jù)傳送到內(nèi)存中,再交給上層驅(qū)動處理。當(dāng)傳送完畢時,調(diào)用NdisMEth-MReivelndicatecomplete函數(shù)通知上層驅(qū)動數(shù)據(jù)已經(jīng)接收完畢。如果協(xié)議驅(qū)動檢查數(shù)據(jù)不符合要求,就會終止接收過程。而已經(jīng)傳送到內(nèi)存中的loo-kahead也會被下次接收到的數(shù)據(jù)覆蓋掉。

4、加解密的實現(xiàn)

加解密實現(xiàn)的主要思想是將加解密算法集成到驅(qū)動程序中,本方案采用傳統(tǒng)的DES加解密算法作為示例。

數(shù)據(jù)在被送入加密模塊之前已經(jīng)成幀,前14個字節(jié)存放的是源地址、目的地址和數(shù)據(jù)長度。發(fā)送截取函數(shù)Send_lntercept得到將要加密的數(shù)據(jù)長度和起始地址后,調(diào)用加密模塊的接口函數(shù)DES_ENCRYPT,從數(shù)據(jù)的第15個字節(jié)開始進行加密,這樣就將除地址和數(shù)據(jù)長度之外的所有數(shù)據(jù)都進行了加密。數(shù)據(jù)進行加密之后,驅(qū)動程序調(diào)用CardWrite函數(shù)將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)中。

數(shù)據(jù)幀被接收到網(wǎng)卡緩沖區(qū)后,讀人到內(nèi)存當(dāng)中的前14個字節(jié)數(shù)據(jù)為源地址、目的地址和數(shù)據(jù)長度。這14個字節(jié)的信息是以明文形式存在的。解密時,接收截取子程序Receive_lntercept調(diào)用解密模塊接口函數(shù)DES—DECRYPT,從密文數(shù)據(jù)的第15個字節(jié)開始進行解密運算,解密之后將數(shù)據(jù)存人預(yù)先分配的緩沖區(qū)Prebuffer中,此后,驅(qū)動程序無論調(diào)用NdisMEtbRecei、relndicate函數(shù),還是MyDriverTransferData函數(shù),都是從緩沖區(qū)PrebuflFer中讀取數(shù)據(jù),而不是從網(wǎng)卡緩沖區(qū)中讀取,直至解密過程結(jié)束。

小知識之鏈路層

數(shù)據(jù)鏈路層的最基本的功能是向該層用戶提供透明的和可靠的數(shù)據(jù)傳送基本服務(wù)。