USB安全鑰功能擴展與優(yōu)化設計
Server端的加密算法采用DES。加密和解密是整個USB安全鑰身份認證的核心。在安全鑰的初期產品中,已經(jīng)實現(xiàn)了DES算法下的加密功能。但是,作為產品,其安全性是第一位的。而且,對于要將加密算法嵌入自己系統(tǒng)的用戶來說,提供給他們大量的加密算法的源代碼是不合適的。要對DES算法進行修改,將其從Server端的源程序中提出,改掉原來復雜的調用機制,改為提供給用戶三個簡單的接口函數(shù):產生隨機數(shù)、加密和解密函數(shù)、實現(xiàn)DES加密算法的DLL。
動態(tài)鏈接庫(DLL)是一個包含了若干個函數(shù)的可執(zhí)行模塊,Windows應用程序可以調用這些函數(shù)來完成實際任務。對于調用DLL的用戶來說,利用的資源僅僅是應用函數(shù)接口和一個后綴為.dll的文件,實現(xiàn)加密算法的模塊化。
在建立了一個VC工程之后,需要建立主程序頭文件KeyDll.h,加入如下代碼。這些代碼中定義了導出的四個函數(shù)。
class _declspec(dllexport) CKeyDllApp
{public:
BOOL GetChallenge();
int* Challenge();//導出函數(shù)
int* DecryptData(BYTE []);//導出函數(shù),需要解密的隨機數(shù),可存儲在數(shù)組InputNum[8]中。此函數(shù)輸出值即為加密后的數(shù)據(jù),輸出格式為數(shù)組DESDeData[8]
int* EncryptData(BYTE []);//導出函數(shù),需要加密的隨機數(shù),可存儲在數(shù)組InputNum[8]中。此函數(shù)輸出值即為加密后的數(shù)據(jù),輸出格式為數(shù)組DESEnData[8]
BOOL cha_gen;
void DESDecrypt ();//BYTE *Data, BYTE *Key); //解密函數(shù)定義
void DESEncrypt ();//BYTE *Data, BYTE *Key); //加密函數(shù)定義
BOOL Init();
protected:
BYTE DESKey[8]; //密鑰
BYTE IniDeData[8]; //外部輸入的需要解密的數(shù)據(jù)
BYTE IniEnData[8]; //外部輸入的加密前的隨機數(shù)
BYTE DESDeData[8]; //解密后的數(shù)據(jù)
BYTE DESEnData[8]; //加密后的數(shù)據(jù)
WORD subkey[16][48]; //子密鑰
BYTE challenge[8];
......}
然后,在主文件KeyDll.cpp中實現(xiàn)各功能函數(shù)的具體功能,主要是算法的實現(xiàn)。
BOOL CKeyDllApp::GetChallenge()//這是產生隨機數(shù)的函數(shù),它調用API的函數(shù)srand(),最終產生的8位隨機數(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]=='t') || (challenge[i] == 0) || (challenge[i]==255) || (challenge[i]== 256- 't'));}
challenge[8] = 0;
cha_gen = TRUE;
return TRUE;}
return FALSE;}
void CKeyDllApp::DESDecrypt ()//解密函數(shù),完成對已加密的8位隨機數(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位隨機數(shù)的加密功能,然后可與原隨機數(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])//導出的獲取解密數(shù)據(jù)的函數(shù)。此函數(shù)需要賦值――已加密了的8位隨機數(shù),并進行解密,最終函數(shù)值為解密后的
評論