关键词:USB加密卡,FPGA,驱动程序,即插即用
1 引 言
软件加密卡(又称软件狗)是一种智能型加密工具,是一个安装在并口、串口等接口上的硬件电路。当被保护的软件运行时,程序向插在计算机上的加密卡发出查询命令,加密卡迅速计算查询并给出响应,正确的响应能保证软件顺利运行。如果没有软件加密卡,程序不能运行。最新的第四代软件加密卡内置一个单片机芯片,芯片中存有特定的算法程序,可将读出的密钥进行加密变幻,以对抗逻辑分析仪。
USB软件加密卡是USB接口技术与第四代加密卡技术结合的产物,因而与其它加密卡相比具有一些明显优势:首先,USB的数据传输速度快,USB1.0协议为12M比特率,USB2.0版可达480M比特率;其次,USB的底层数据传输具有特定的打包方法和编码格式,这样就增加了加密数据在传输过程中被截获及解密的难度。最后,USB设备的即插即用性(plug-and-play)极大地方便了用户的使用,比如,要在其它微机上使用被保护软件时,只要一拔一插即可,免除了开机箱和重启动的麻烦。
2 USB软件加密卡的硬件设计
2.1 USB接口芯片
USB接口芯片的种类很多,但无论何种接口芯片,都有两个基本功能:一是与上位机通信;二是提供对外围电路CPU的接口。也就是说接口芯片架起了计算机与外围设备的桥梁,使开发者不用关心复杂的USB协议是如何将数据传送到主机的。
现有的支持USB1.0协议的接口芯片可大致分为两类:一种为内部集成了微控制器,如Intel 8×930Ax/Hx内嵌一个8051CPU;另一种则只提供了对外围电路访问的读写接口,如USBN9603。在加密卡的设计中,建议采用第二种类型,因为对于较复杂的加密算法,8051CPU处理起来很吃力。下面以USBN9603为例介绍接口芯片的使用。
图1描述了USBN9603的逻辑结构,可以看到芯片对外提供了8位并行接口,该接口为数据/地址复用接口,芯片内部自带地址锁存器,配合CS,RD,WK信号完成对内部寄存器的读写操作。USBN9603有一外部中断INTR管脚,当USB接口有状态变化时可产生中断信号通知CPU,通过软件置中断屏蔽寄存器位,可控制中断信号的发生。
USBN9603有7个与主机相连接的端点,包括一个双向命令传输端点、三个接收端点、三个发送端点,可支持中断(Interrupt)、批量(Bulk)和等时(Isochronal)传输模式。USBN9603传输器(Transceiver)配有的电压调节器通过软件置位可产生上拉电压,通过上拉电阻接D+则接通全速模式,接D-则接通低速模式。
USBN9603使用外接晶振,同时有一个对外的时钟输出器,产生对外的时钟信号,它的输出频率可由软件控制。USBN9603的USB接口引擎由物理层和媒介通道控制器组成。物理层包括数字时钟电路、监视电路、位填充与清除逻辑电路等。媒介通道控制器层要完成数据包格式化、循环冗余检测、端点地址侦察等任务,并提供对端点发出的NAK,ACK和STALL回应的控制。接口引擎还要负责侦察和报告USB总线事件,如复位,挂起和恢复。
USBN9603向开发者提供了53个可编程的寄存器,地址分布在0x00~0x3F。CPU通过对寄存器的读写,完成一切USB接口操作。USBN9603寄存器被映射为CPU的外部RAM。CPU通过CS片选信号寻址,在ALE信号及RD、WR信号的配合下,由8位的并口写入地址和数据。虽然读写操作简单,但各寄存器的定义及作用却复杂,但只要对USB协议及USBN9603功能有一定的了解,就不难理解和掌握各寄存器的使用。
2.2 外围控制电路的设计
外围控制电路的作用有两个:一是对USB接口操作;二是实现加密算法。这要求主控芯片提供基本的读写、中断和地址/数据信号,同时要有一定的计算能力以适应加密算法。在此前提下,我们有多种选择,但加密卡的制作不能一味地追求高保密性能,而忽视了开发成本,应根据不同的应用场合灵活地选用不同的方案。例如,采用DSP芯片,其保密性和计算速度俱佳,但开发成本高、周期长;也可用价格低廉的单片机如8051,虽然速度慢且保密性差,但制作简单、开发周期短。
我们在实践中应用的一种方案为单片机+FPGA(Field Programmable Gate Array)模式,既可方便地用单片机完成对USB口的操作,又能利用FPGA的速度快和保密性强等特点实现复杂的加密算法。FPAG支持众多的加密标准如AES、DES、三倍DES。而且,依靠FPGA的在线编程功能可方便地实现算法的更新与升级。这种组合模式符合模块化设计思想,会一定程度地提高开发速度。
3 USB软件加密卡驱动程序设计
3.1 驱动程序的基本功能实现
驱动程序的基本功能就是建立应用程序与加密卡之间的数据通讯。Windows98和Windows2000操作系统为USB总线提供了全面的支持,并且用WDM(Windows Device Mode)设备驱动程序模型代替了VxD设备驱动程序。WDM支持USB1.1协议,并为用户开发自己的用户驱动程序提供了下沿接口USBDI(USBDriving Interface)。USB用户驱动程序通过USBDI访问USB设备类驱动程序。USB客户驱动程序决不会收到任何硬件资源(如端口或中断),所有低层I/O都由USB设备类驱动程序应付。客户驱动程序只关心数据传输类型、传输时序、传输管道以及如何处理数据等主要操作。USBDI就是为实现这一点而设计的软件接口。形象地讲,USBDI以软件形式搭建了一个USB协议中所定义设备的逻辑结构,见图2。
由图2可知,USBDI表现给客户驱动程序的所有USB设备都统一由配置、接口、端点组成。一个设备暴露一系列管道(端点),一个或多个端点可组成一个接口,一个或多个接口可组成一个配置。注意,USB接口芯片也以此模型描述其设备结构。端点、接口和配置由各自描述符描述性质。描述符一般放在外设储存器中,当设备接入USB总线时,以连续数据块的形式一起发到USB设备类驱动程序。USB客户驱动程序对设备的操作完全参照描述符中的参数进行。
从编程角度上讲,USBDI为开发者提供了一系列内部控制码IOCTL,来向USB设备类驱动程序发出控制信息,如客户驱动程序可使用IOCTL_INTERNAL_USB_RESET_PORT来复位管道。
IOCTL种类很多,其中最重要的是IOCTL_INTERNAL_USB_SUBMIT_URB,它用于向USB设备娄驱动程序发送URB(USB Request Block)请求块。URB是一个联合体数据结构,因而有多种不同的定义,每种定义对应一种功能并由各自的功能码描述,如USB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER表示通过块或中断端点读/写数据功能。每个功能码使用各自的URB结构详细说明它的输入/输出参数。URB包参数构造完后,将其指针挂接在IRP包上,随IRP包传给USB设备类驱动程序处理。URB是个极重要的概念,对外设的各种操作基本上是通过发送URB包进行的。
有了驱动程序并将其安装在计算机上,应用程序(被保护软件)就可用OpenFile、Write/ReadFile等API函数对加密卡进行读写或状态检测。
3.2 开发驱动程序的加密功能
驱动程序的加密功能有以下几种实现方式:将加密数据的一部分或加密算法的某一阶段交给驱动程序完成,使其在基本通讯功能上增加数据过滤计算功能;还可借鉴“用户算法植入”的思想(普通的加密思想无非是在程序执行中与加密卡交换数据,而这种加密技术是在加密硬件中开辟一块存储区,将用户程序的一部分写进去,并由加密卡来执行),将应用软件的一部分写入驱动程序,造成在没有驱动程序时应用程序将不完整。
开发驱动程序的加密功能主要基于两点考虑。首先,USB外设具有即插即用功能,加密卡插上或拔出时,其驱动程序自动加载或卸载,不可能在没有加密卡的情况下单独运行驱动程序,因而可以将它们视为整体。但驱动程序毕竟在计算机上运行,它可以充分利用其资源,如计算能力与内存空间,以协助加密卡的工作。其次,驱动程序运行在操作系统的内核。鉴于一般操作系统(如Windows)对内核的保护,要对其进行跟踪解密比较困难,因而将应用软件的重要部分写入驱动程序要比在应用程序中运行更安全,更依赖于加密卡,同时又不增加加密卡的负担。
驱动程序的加密功能使其既成为加密卡的一部分又成为应用软件的一部分,这种双重性实现了加密系统的紧密联系,使得加密效果更可靠。同时,使得性能较低的加密卡得以扩展,方便地用低成本实现高保密性。另外,要对现有加密卡进行升级,往往只需修改驱动程序,这更显得方便高效。
4 结束语
以上我们已对USB加密卡的各种关键技术作了详细介绍。虽然世界上没有绝对安全的加密技术,而数据加密也只是安全保密的一小部分,但加密卡的软硬件开发表现出了高度的灵活性与创新性。面对层出不穷的威胁计算机安全的行为,各种各样的加密技术将不断涌现,它们以自身的发展,捍卫了软件商利益的同时,也捍卫着知识的尊严。
2 Chris Cant.Windows WDM设备驱动程序开发指南.北京:机械工业出版社,2000
3 看雪编著.加密与解密——软件保护技术及完全解决方案.北京:电子工业出版社,2001
评论
查看更多