Server端的加密算法采用DES。加密和解密是整个USB安全钥身份认证的核心。在安全钥的初期产品中,已经实现了DES算法下的加密功能。但是,作为产品,其安全性是第一位的。而且,对于要将加密算法嵌入自己系统的用户来说,提供给他们大量的加密算法的源代码是不合适的。要对DES算法进行修改,将其从Server端的源程序中提出,改掉原来复杂的调用机制,改为提供给用户三个简单的接口函数:产生随机数、加密和解密函数、实现DES加密算法的DLL。
动态链接库(DLL)是一个包含了若干个函数的可执行模块,Windows应用程序可以调用这些函数来完成实际任务。对于调用DLL的用户来说,利用的资源仅仅是应用函数接口和一个后缀为.dll的文件,实现加密算法的模块化。
在建立了一个VC工程之后,需要建立主程序头文件KeyDll.h,加入如下代码。这些代码中定义了导出的四个函数。
class _declspec(dllexport) CKeyDllApp
{public:
BOOL GetChallenge();
int* Challenge();//导出函数
int* DecryptData(BYTE []);//导出函数,需要解密的随机数,可存储在数组InputNum[8]中。此函数输出值即为加密后的数据,输出格式为数组DESDeData[8]
int* EncryptData(BYTE []);//导出函数,需要加密的随机数,可存储在数组InputNum[8]中。此函数输出值即为加密后的数据,输出格式为数组DESEnData[8]
BOOL cha_gen;
void DESDecrypt ();//BYTE *Data, BYTE *Key); //解密函数定义
void DESEncrypt ();//BYTE *Data, BYTE *Key); //加密函数定义
BOOL Init();
protected:
BYTE DESKey[8]; //密钥
BYTE IniDeData[8]; //外部输入的需要解密的数据
BYTE IniEnData[8]; //外部输入的加密前的随机数
BYTE DESDeData[8]; //解密后的数据
BYTE DESEnData[8]; //加密后的数据
WORD subkey[16][48]; //子密钥
BYTE challenge[8];
......}
然后,在主文件KeyDll.cpp中实现各功能函数的具体功能,主要是算法的实现。
BOOL CKeyDllApp::GetChallenge()//这是产生随机数的函数,它调用API的函数srand(),最终产生的8位随机数存在数组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 ()//解密函数,完成对已加密的8位随机数的解密功能
{
WORD TempInput[64],TempOutput[64],TempKey[64];
stringtobit (IniDeData, TempInput);
stringtobit (DESKey, TempKey);
decry (TempInput, TempKey, TempOutput);
bittostring (TempOutput, DESDeData);}
void CKeyDllApp::DESEncrypt() //加密函数,可完成
对8位随机数的加密功能,然后可与原随机数比较,看是否相等
{
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])//导出的获取解密数据的函数。此函数需要赋值——已加密了的8位随机数,并进行解密,最终函数值为解密后的