Server 端的加密算法采用DES。加密和解密是整個(gè)USB安全鑰身份認(rèn)證的核心。在安全鑰的初期產(chǎn)品中,已經(jīng)實(shí)現(xiàn)了DES算法下的加密功能。但是,作為產(chǎn)品,其安全性是第一位的。而且,對于要將加密算法嵌入自己系統(tǒng)的用戶來說,提供給他們大量的加密算法的源代碼是不合適的。要對DES算法進(jìn)行修改,將其從 Server端的源程序中提出,改掉原來復(fù)雜的調(diào)用機(jī)制,改為提供給用戶三個(gè)簡單的接口函數(shù):產(chǎn)生隨機(jī)數(shù)、加密和解密函數(shù)、實(shí)現(xiàn)DES加密算法的DLL。
動態(tài)鏈接庫(DLL)是一個(gè)包含了若干個(gè)函數(shù)的可執(zhí)行模塊,Windows應(yīng)用程序可以調(diào)用這些函數(shù)來完成實(shí)際任務(wù)。對于調(diào)用DLL的用戶來說,利用的資源僅僅是應(yīng)用函數(shù)接口和一個(gè)后綴為.dll的文件,實(shí)現(xiàn)加密算法的模塊化。
在建立了個(gè)VC工程之后,需要建立主程序頭文件KeyDll.h,加入如下代碼。這些代碼中定義了導(dǎo)出的四個(gè)函數(shù)。
class _declspec(dllexport) CkeyDllApp
{public:
BOOL GetChallenge();
int* Challenge();//導(dǎo)出函數(shù)
int* DecryptData(BYTE []);//導(dǎo)出函數(shù),需要解密的隨機(jī)數(shù),可存儲在數(shù)組InputNum[8]中。此函數(shù)輸出值即為加密后的數(shù)據(jù),輸出格式為數(shù)組DESDeData[8]。
Int* EncryptData(BYTE []);//導(dǎo)出函數(shù),需要加密的隨機(jī)數(shù),可存儲在數(shù)組InputNum[8]中。此函數(shù)輸出值即為加密后的數(shù)據(jù),輸出格式為數(shù)組DESEnData[8]
BOOL cha_gen;
void DESDecrypt ();//BYTE *Data,BYTE *Key); //解密函數(shù)定義
void DESEncrypt ();//BYTE *Bata,BYTE *Key); //加密函數(shù)定義
BOOL Init();
protected:
BYTE DESKey[8]; //密鑰
BYTE IniDeData[8]; //外部輸入的需要解密的數(shù)據(jù)
BYTE IniEnData[8]; //外部輸入的加密前的隨機(jī)數(shù)
BYTE DESDeData[8]; //解密后的數(shù)據(jù)
BYTE DESEnData[8]; //加密后的數(shù)據(jù)
WORD subkey[16][48]; //子密鑰
BYTE challenge[8];
……}
然后,在主文件KeyDll.cpp中實(shí)現(xiàn)各功能函數(shù)的具體功能,主要是算法的實(shí)現(xiàn)。
BOOL CKeyDllApp::GetChallenge()//這是產(chǎn)生隨機(jī)數(shù)的函數(shù),它調(diào)用API的函數(shù)srand(),最終產(chǎn)生的8位隨機(jī)數(shù)存在數(shù)組challenge[8]中
{
int i;
srand((unsigned)time (NULL));
if(!cha_gen){
for(i=0;i<8;i++){
do{challenge[i]=(rand()/256);}
while((challenge[i]=='')||(challenge[i] = =0)||(challenge[i]==255)||(challenge[i]==256-''));}
challenge[8]=0;
cha_gen=TRUE;
return TRUE;}
retur FALSE;}
void CKeyDllApp::DESDecrypt ()//解密函數(shù),完成對已加密的8位隨機(jī)數(shù)的解密功能
{
WORD TempInput[64],TempOutput[64],TempKey[64];
Stringtobit (IniDeData,TempInput);
Stringtobit (DESKey,TempKey);
decry (TempInput,TempKey,TempOutput);
bittostring (TempOutput,DESDeData);}
void CKeyDllApp::DESEncrypt() //加密函數(shù),可完成對8位隨機(jī)數(shù)的加密功能,然后可與原隨機(jī)數(shù)比較,看是否相等
{
WORD TempInput [64],TempOutput[64],TempKey[64];
stringtobit (IniEnData,TempInput);
stringtobit (DESKey,TempKey);
encry(TempInput,TempKey,TempOutput);
bittostring (TempOutput,DESEnData);}
int* CKeyDllApp::DecryptData (BYTE InputDeNum[8])//導(dǎo)出獲取解密數(shù)據(jù)的函數(shù)。此函數(shù)需要賦值——已加密了的8位隨機(jī)數(shù),并進(jìn)行解密,最終函數(shù)值為解密后的8位隨機(jī)數(shù)
{
int i;
for (i=0;I<8;i++)
IniDeData[i]=InputDeNum[8];
return (int *)DESDeData;}
int* CKeyDllapp::EncryptData (BYTE InputEnNum [8])//導(dǎo)出的獲取加密數(shù)據(jù)的函數(shù)。此函數(shù)需要賦值——8位隨機(jī)數(shù),直接調(diào)用并賦8位隨機(jī)數(shù)后,此函數(shù)將調(diào)用加密函數(shù)并進(jìn)行加密,最終函數(shù)值為加密后的8位隨機(jī)數(shù)
{
int I;
for (i=0;i<8;i++)
IniEnData[i]=InputEnNum[i];
Return (int *)DESEnData;}
編譯、連接后接產(chǎn)生一系列文件,在加上源工程文件,將會有數(shù)量比較龐大的文件系統(tǒng)。最終,只需提供給用戶三個(gè)文件即可,它們是:
·.dll,這是DLL文件;
·.lib,這個(gè)文件將在應(yīng)用DLL的程序編程和連接時(shí),提供連接向?qū)В?/font>
·.h,這個(gè)頭文件告訴用戶此DLL中導(dǎo)出了哪些量可以用。
DES的DLL導(dǎo)出了一個(gè)類:CkeyDllApp。在這個(gè)類中共有4個(gè)導(dǎo)出函數(shù)可以導(dǎo)入應(yīng)用程序中,用戶在導(dǎo)入了加密DLL后,可以在自己的程序中直接調(diào)用以下函數(shù):
·BOOL GetChallenge(),用于在應(yīng)用程序支持循環(huán)結(jié)構(gòu);
·int *Challenge(),產(chǎn)生隨機(jī)數(shù),并存儲在Challenge[8]中;
·int *DecryptData(BYTE []),用于解密隨機(jī)數(shù);
·int *EncryptData(BYTE []),用于加密隨機(jī)數(shù)。
2.2 USB安全鑰新增功能描述
USB 安全鑰和PC傳輸?shù)臄?shù)據(jù)量不大,而且沒有很高的速度要求。因此,在編寫固件時(shí)就將其歸類為HID(USB的人機(jī)接口設(shè)備類)。在編寫PC端的驅(qū)動程序時(shí)可以直接調(diào)用Windows提供的HID的API函數(shù),大大降低了編程的難度。更重要的是,Windows對HID設(shè)備的支持非常完備,不需要用戶再編寫底層的驅(qū)動。
安全鑰端的設(shè)計(jì)內(nèi)容主要是:實(shí)現(xiàn)在線修改存儲在安全鑰內(nèi)的KeyID和讀取KeyID兩個(gè)功能,分別由函數(shù)Set_KeyID和Get_KeyID實(shí)現(xiàn)。KeyID是安全鑰的標(biāo)識符,在安全鑰插到PC 上后,被讀出并送往Server進(jìn)行檢查。在初期產(chǎn)品中,KeyID只能是安全鑰首次接到PC上讀取,且不能更改,這為廠家和開發(fā)者造成了不便。因此要更改初期產(chǎn)品中的KeyID,這必須修改安全鑰端的匯編程序,然后再“燒”寫到安全鑰中,非常麻煩。新增功能可實(shí)現(xiàn)KeyID的在線修改。
PC端的設(shè)計(jì)包括兩步。首先要實(shí)現(xiàn)在PC上讀取安全鑰內(nèi)的KeyID。通過安全鑰的端點(diǎn)1,8個(gè)字節(jié)的KeyID被周期地送出。PC要獲取這些數(shù)據(jù),調(diào)用HID類庫Get_Report(Feature)。從安全鑰發(fā)來的包含KeyID的包的特性及技術(shù)指標(biāo)如表1。
表1 調(diào)用HID類庫獲取KeyID





