USB安全鑰功能擴展與優(yōu)化設計
8位隨機數
{
int i;
for (i = 0; i 8; i++)
IniDeData[i]=InputDeNum[8];
return (int *)DESDeData;}
int* CKeyDllApp::EncryptData(BYTE InputEnNum[8])//導出的獲取加密數據的函數。此函數需要賦值――8位隨機數,直接調用并賦8位隨機數后,此函數將調用加密函數并進(jìn)行加密,最終函數值為加密后的8位隨機數
{
int i;
for (i = 0; i 8; i++)
IniEnData[i]=InputEnNum[i];
return (int *)DESEnData;}
編譯、連接后將產(chǎn)生一系列文件,在加上源工程文件,將會(huì )有數量比較龐大的文件系統。最終,只需提供給用戶(hù)三個(gè)文件即可,它們是:
? KeyDllDebugKeyDll.dll,這是DLL文件;
? KeyDllDebugKeyDll.lib,這個(gè)文件將在應用DLL的程序編譯和連接時(shí),提供連接向導;
? KeyDllKeyDll.h,這個(gè)頭文件告訴用戶(hù)此DLL中導出了哪些量可以用。
DES的DLL導出了一個(gè)類(lèi):CkeyDllApp。在這個(gè)類(lèi)中共有4個(gè)導出函數可以導入應用程序中,用戶(hù)在導入了加密DLL后,可以在自己的程序中直接調用以下函數:
? BOOL GetChallenge(),用于在應用程序支持循環(huán)結構;
? int*Challenge(),產(chǎn)生隨機數,并存儲在Challenge[8]中;
? int*DecryptData(BYTE []),用于解密隨機數;
? int*EncryptData(BYTE []),用于加密隨機數。
USB安全鑰和PC傳輸的數據量不大,而且沒(méi)有很高的速度要求。因此,在編寫(xiě)固件時(shí)就將其歸類(lèi)為HID(USB的人機接口設備類(lèi))。在編寫(xiě)PC端的驅動(dòng)程序時(shí)可以直接調用Windows提供的HID的API函數,大大降低了編程的難度。更重要的是,Windows對HID設備的支持非常完備,不需要用戶(hù)再編寫(xiě)底層的驅動(dòng)。
安全鑰端的設計內容主要是:實(shí)現在線(xiàn)修改存儲在安全鑰內的KeyID和讀取KeyID兩個(gè)功能,分別由函數Set_KeyID和Get_KeyID實(shí)現。KeyID是安全鑰的標識符,在安全鑰插到PC上后,被讀出并送往Server進(jìn)行檢查。在初期產(chǎn)品中,KeyID只能是安全鑰首次接到PC上讀取,且不能更改,這為廠(chǎng)家和開(kāi)發(fā)者造成了不便。因此要更改初期產(chǎn)品中的KeyID,就必須修改安全鑰端的匯編程序,然后再“燒”寫(xiě)到安全鑰中,非常麻煩。新增功能可實(shí)現KeyID的在線(xiàn)修改。
PC端的設計包括兩步。首先要實(shí)現在PC上讀取安全鑰內的KeyID。通過(guò)安全鑰的端點(diǎn)1,8個(gè)字節的KeyID被周期地送出。PC要獲取這些數據,調用HID類(lèi)庫Get_Report(Feature)。從安全鑰發(fā)來(lái)的包含KeyID的包的特性及技術(shù)指標如表1。
第2步,在PC上實(shí)現修改KeyID功能。調用HID類(lèi)庫Set_Report(Feature),將新的KeyID發(fā)送到安全鑰中,具體指標如表2所示。
USB固件(Firmware),就是USB安全鑰硬件上采用的單片機和其他處理器中有關(guān)USB通信的程序。這里采用Motorola公司的8位單片機MC68HC908JB8作為USB安全鑰的控制器芯片。MC68HC908JB8帶有USB接口,8K的Flash,支持USB 1.1版本中的低速(Low Speed)設備,資源有限,主要用于實(shí)現USB通信,價(jià)格比較低廉。因此,很適合于USB安全鑰。MC68HC908JB8中USB通信的程序模塊,包含在實(shí)現MC68HC908JB8所有功能的匯編程序中。
圖2是經(jīng)典的USB固件的流程圖??紤]到USB安全鑰中USB數據通信量很小,不需要考慮通信時(shí)間,采用中斷傳輸方式。整個(gè)程序就是在等待數據傳輸要求的中斷到來(lái),從而進(jìn)入數據傳輸模塊。讀/寫(xiě)數據緩沖區,往USB端點(diǎn)(Endpoint)中讀/寫(xiě)數據,交給USB模塊收發(fā)數據。當USB安全鑰不需要傳輸數據時(shí),就進(jìn)入掛起狀態(tài)(Suspend)。在得到PC主機遠程喚醒后啟動(dòng),繼續工作。
評論