USB安全钥功能扩展与优化设计

时间:2009-04-09来源:网络

8位随机数

{

int i;

for (i = 0; i 8; i++)

IniDeData[i]=InputDeNum[8];

return (int *)DESDeData;}

int* CKeyDllApp::EncryptData(BYTE InputEnNum[8])//导出的获取加密数据的函数。此函数需要赋值――8位随机数,直接调用并赋8位随机数后,此函数将调用加密函数并进行加密,最终函数值为加密后的8位随机数

{

int i;

for (i = 0; i 8; i++)

IniEnData[i]=InputEnNum[i];

return (int *)DESEnData;}

编译、连接后将产生一系列文件,在加上源工程文件,将会有数量比较庞大的文件系统。最终,只需提供给用户三个文件即可,它们是:

・ KeyDllDebugKeyDll.dll,这是DLL文件;

・ KeyDllDebugKeyDll.lib,这个文件将在应用DLL的程序编译和连接时,提供连接向导;

・ KeyDllKeyDll.h,这个头文件告诉用户此DLL中导出了哪些量可以用。

DES的DLL导出了一个类:CkeyDllApp。在这个类中共有4个导出函数可以导入应用程序中,用户在导入了加密DLL后,可以在自己的程序中直接调用以下函数:

・ BOOL GetChallenge(),用于在应用程序支持循环结构;

・ int*Challenge(),产生随机数,并存储在Challenge[8]中;

・ int*DecryptData(BYTE []),用于解密随机数;

・ int*EncryptData(BYTE []),用于加密随机数。

2.2 USB安全钥新增功能描述

USB安全钥和PC传输的数据量不大,而且没有很高的速度要求。因此,在编写固件时就将其归类为HID(USB的人机接口设备类)。在编写PC端的驱动程序时可以直接调用Windows提供的HID的API函数,大大降低了编程的难度。更重要的是,Windows对HID设备的支持非常完备,不需要用户再编写底层的驱动。

安全钥端的设计内容主要是:实现在线修改存储在安全钥内的KeyID和读取KeyID两个功能,分别由函数Set_KeyID和Get_KeyID实现。KeyID是安全钥的标识符,在安全钥插到PC上后,被读出并送往Server进行检查。在初期产品中,KeyID只能是安全钥首次接到PC上读取,且不能更改,这为厂家和开发者造成了不便。因此要更改初期产品中的KeyID,就必须修改安全钥端的汇编程序,然后再“烧”写到安全钥中,非常麻烦。新增功能可实现KeyID的在线修改。

PC端的设计包括两步。首先要实现在PC上读取安全钥内的KeyID。通过安全钥的端点1,8个字节的KeyID被周期地送出。PC要获取这些数据,调用HID类库Get_Report(Feature)。从安全钥发来的包含KeyID的包的特性及技术指标如表1。

第2步,在PC上实现修改KeyID功能。调用HID类库Set_Report(Feature),将新的KeyID发送到安全钥中,具体指标如表2所示。

2.3 如何设计安全钥端新增功能的USB固件

USB固件(Firmware),就是USB安全钥硬件上采用的单片机和其他处理器中有关USB通信的程序。这里采用Motorola公司的8位单片机MC68HC908JB8作为USB安全钥的控制器芯片。MC68HC908JB8带有USB接口,8K的Flash,支持USB 1.1版本中的低速(Low Speed)设备,资源有限,主要用于实现USB通信,价格比较低廉。因此,很适合于USB安全钥。MC68HC908JB8中USB通信的程序模块,包含在实现MC68HC908JB8所有功能的汇编程序中。

图2是经典的USB固件的流程图。考虑到USB安全钥中USB数据通信量很小,不需要考虑通信时间,采用中断传输方式。整个程序就是在等待数据传输要求的中断到来,从而进入数据传输模块。读/写数据缓冲区,往USB端点(Endpoint)中读/写数据,交给USB模块收发数据。当USB安全钥不需要传输数据时,就进入挂起状态(Suspend)。在得到PC主机远程唤醒后启动,继续工作。

1 2 3 4

关键词: 优化 设计 扩展 功能 安全 USB 通用串行总线USB 单片机 动态链接库DLL 标准加密算法DES USB固件 USB驱动程序 人机接口设备HID

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版