《电子技术应用》
您所在的位置:首页 > 可编程逻辑 > 设计应用 > 一种基于FPGA的PCI加密卡设计
一种基于FPGA的PCI加密卡设计
严迎建,徐金甫,徐劲松,李 伟
摘要: 利用FPGA设计实现了一种基于PCI总线接口的纯硬件加密卡,为PC机提供加密、签名等服务。对采用VHDL描述的PCI接口IP软核及其应用方法进行了分析;采用VHDL设计了3DES、MD5等算法模块,并设计了其与PCI接口IP核之间的通信控制模块;利用Quartus II进行仿真、综合后,下载到加密卡上的FPGA配置芯片,将上述各个模块集成在一片FPGA上予以实现;最后,采用VC++为加密卡设计了驱动程序和测试程序,并对整个加密卡工作进行了功能测试。
关键词: FPGA PCI总线 3DES算法
Abstract:
Key words :

  摘 要: 利用FPGA" title="FPGA">FPGA设计实现了一种基于PCI总线" title="PCI总线">PCI总线接口的纯硬件加密卡,为PC机提供加密、签名等服务。对采用VHDL描述的PCI接口IP软核及其应用方法进行了分析;采用VHDL设计了3DES、MD5等算法模块,并设计了其与PCI接口IP核之间的通信控制模块;利用Quartus II进行仿真、综合后,下载到加密卡上的FPGA配置芯片,将上述各个模块集成在一片FPGA上予以实现;最后,采用VC++为加密卡设计了驱动程序和测试程序,并对整个加密卡工作进行了功能测试。
  关键词: PCI总线 3DES算法" title="3DES算法">3DES算法 FPGA


  PCI加密卡是基于加解密芯片和PCI总线卡技术实现的安全保密设备,为计算机提供数据加密、数据完整性、数字签名、访问控制等安全功能,可用于计算机文件保护、电子邮件系统安全保密、办公自动化安全保密、数据库保护、网络加密等。主要用于带PCI插槽的台式PC机和工作站, 在防火墙、VPN加密机等方面具有极为广泛的应用前景[1][2]
  PCI加密卡的数据加密分为软件实现和硬件实现两种方式,软件实现是指在PCI配置嵌入式微处理器或DSP芯片实现加密算法;硬件实现是指采用密码算法芯片实现加/解密、签名算法,具有处理速度快,安全性好的特点。在上述硬件实现中,PCI总线接口可以采用专门的接口芯片,例如PCI9054实现;也可以采用PCI接口IP核在密码专用芯片中实现。本文采用一片Altera的Cyclone 系列FPGA实现了加解密算法和PCI接口,并为加密卡开发了WDM驱动程序,设计了一个能为PC机提供数据加密、数据完整性、访问控制等安全功能的PCI加密卡。
1 系统硬件架构设计
  整个PCI加密卡硬件以一片FPGA为中心,配以FPGA配置芯片、时钟等模块构成。PCI接口、3DES、MD5算法等全部在FPGA内部实现。整个加密卡的硬件结构如图1所示,系统主要设计任务在FPGA内部的逻辑功能完成,包括:PCI接口模块、控制模块、输入输出缓存模块和数据加密模块。PCI接口模块由IP软核实现,主要功能是控制和实现数据的双向传输;控制模块主要控制PCI接口与数据加密模块之间的数据传输;输入输出缓存模块主要用于寄存由PCI接口模块输入后等待处理的数据,以及系统内部运算后等待输出的数据结果;数据加密模块主要包含硬件实现后的加密算法,用于对输入的数据进行加解密运算。


  在各个主要模块中,密码运算模块的速度将直接影响到整个加密系统的工作效率。此外,由于控制模块的主要功能是控制输入输出缓存中的数据依次进入加密模块,同时,根据加密模块反馈的状态信息发出相应的控制信息,所以,控制模块的设计在整个加密设备的设计实现中十分重要。
2 PCI接口IP核及其应用方法
  PCI总线接口有两种设计方案,一是采用专门的PCI接口芯片(例如PCI9054或PCI9052)实现,二是采用PCI接口IP核在密码专用芯片中实现[3]。本加密卡采用第二种方案,由VHDL描述的软核下载到FPGA中实现。该PCI接口IP核符合标准的PCI2.2协议,支持I/O操作、配置读、写操作、总线BUS_MASTER读、BUS_MASTER写以及DMA中断方式和DMA数据传输方式。该IP核设计主要采用有限状态机实现,包括中断应答、突发读操作、突发写操作、配置读操作、配置写操作、I/O读写传输、存储器读写传输7个状态机组成。其工作流程如图2所示。收到帧开始信号(#FRAM信号为低)后,根据PCI总线C/BE[3..0]上的命令,分别进入7个状态机中的一个。操作结束后,主机发出帧结束信号(#FRAM为信号低),进入等待状态,进入下个操作。


  利用该PCI接口IP核完成加密卡设计,必须先确定数据传输的实现方式。该PCI接口IP核支持两个256K字节的I/O空间;支持一个4M字节的PCI内存空间。在PCI的数据传输中,主要依靠I/O读、I/O写、存储器读、存储器写等操作完成数据传输。I/O读、写命令用来从一个映射到I/O地址空间的设备中读、写数据。存储器读、写命令用来从一个映射到存储器地址空间的设备读、写数据。在加密卡初期设计中,数据都被映射到I/O地址空间进行操作。系统工作的基本过程如下:数据从PC机进入PCI接口模块,先存入PCI接口模块中指定的I/O存储单元中;在控制模块的控制下,依次进入密码算法模块,数据经过处理后输出到输出缓存之中,由驱动程序将运算结果传输给应用程序。
  确定了数据传输方式后,下一步的工作是完成加密算法模块设计,并设计适当的接口控制模块,按照事先确定的数据传输方式将其连接到PCI接口模块。
3 密码算法模块设计
  密码算法模块是整个加密卡设计的核心,其设计的优劣直接关系到加密卡的性能和安全性。下面以3DES算法为例,介绍密码算法模块的设计方法。
3.1 3DES算法模块设计
  本设计采用两个密钥的3DES,该加密方案使用两个不同的密钥Key1和Key2对明文进行三次DES或DES-1变换,加密函数采用加密-脱密-加密序列:
  
  两个密钥的三重DES的有效密钥长度是112位。在本设计中采用了密码分组链接方式(CBC)。在这种方案中,加密算法的输入是当前的明文分组和前边的密文分组的异或,对每个分组使用相同的密钥。从效果上看,将明文分组序列的处理连接起来了。每个明文分组的加密函数的输入与明文分组之间不再有固定的关系,因此,64bit的重复模式不再会暴露。
  3DES密码硬件模块为控制模块和数据路径设计两部分。控制模块产生数据通路需要的控制信号序列,保证数据处理单元正确有序地工作。数据路径用来实现信息传送和密码变换的数据处理单元。3DES算法设计采用迭代结构,由初始置换电路IP、多路选择电路L_MUX和R_MUX、32-bit L锁存器、32-bit R锁存器、扩展置换E处理电路、S盒数据代替电路、P盒置换电路及末置换IP-1电路构成。其运算电路如图3所示。


3.2 3DES输入输出模块设计
  输入输出模块主要为密码运算模块提供密钥、数据以及命令信息的模块。控制信号主要包括:操作时钟CLK、系统初始化INIT、写使能WEN、读使能REN、运算完毕READY、DIN[31:0]、数据输入、数据输出DOUT[31:0]、端口选择A[2:0]。当INIT=1时,将3DES模块内部所有寄存器复位并清零;当A[2:0]=010, WEN=1时,在CLK时钟上升沿,将命令字由32位数据总线写入芯片内部命令寄存器;当A[2:0]=001,WEN=1时,在CLK时钟上升沿,将128位的密钥分四次由32-bit数据总线写入芯片内部密钥寄存器;当A[2:0]=000,WEN=1时,在CLK时钟上升沿将64位的数据分两次由32位数据总线写入芯片内部输入数据寄存器;每写够2个长字,3DES模块开始运算,运算完毕后,READY变为高电平,输出数据分为两组分别送入temporary_l和temporary_2两个寄存器。3DES Quartus仿真波形如图4所示。


4 密码服务的PCI传输控制
  完成了密码算法模块后,还要设计一个接口控制模块,将其连接到PCI接口模块,以实现密码模块与PCI主机的通信连接。下面以3DES密码模块为例,介绍面向PCI传输的密码算法接口控制模块的设计。图5为该模块的设计框图,在PC机与加密卡的通信过程中,驱动程序先将数据按32bit分组送入PCI中指定的IO存储器地址中。一次加密服务流程如下:数据首先进入输入缓存模块,分别将3DES密钥Key1、Key2送入I/O地址70h,74h,78h,7ch;数据送入80h,84h;命令送入88h。待数据传输完毕,由驱动程序向密码算法模块发送启动信号,在计数器模块的控制下,命令、IV向量、密钥、数据由缓存模块依次进入密码运算模块;密码运算完毕后向PCI模块发送ready信号,并把数据处理结果放入输出缓存地址9ch和a0h中,驱动程序在检测的ready信号为高时从输出缓存地址取走数据。


5 加密卡驱动程序设计及系统测试
  PCI加密卡为主机提供加/解密服务,并为应用软件提供相应的软件接口,主要包括用Visual C++开发的WDM驱动程序和应用程序编程接口函数库两个部分[4]。在Windows2000系统中可以使用多种驱动程序,如虚拟设备驱动程序(VDD)和内核模式驱动程序。其中,WDM驱动程序是一种PnP驱动程序,它遵循Windows2000即插即用协议的内核模式驱动程序,同时还遵循电源管理协议,并能在Windows98、Windows2000和Windows XP间实现源代码级兼容。
  应用程序与WDM通信时,应用程序先调用CreateFile函数打开设备,然后调用DeviceIoControl与WDM进行数据通信,最后用CloseHandle关闭设备。主机应用程序用Visual C++开发生成,主要包括系统的用户界面设计、用于输入用户数据、显示运算后的结果数据、调用驱动程序实现某种功能。驱动程序与应用程序之间的通信分为同步方式和异步方式。若采用同步方式,则应用程序调用DeviceIoControl函数时将被阻塞,等待PCI设备进行数据处理,完成相应操作,直到驱动程序给应用程序返回值后,应用程序才会接着运行。若采用异步方式,则应用程序调用DeviceIoControl函数将立刻返回,不等待驱动程序对数据的操作。这样,如果在应用程序退出之前,驱动程序还没完成I/O操作,就需要编写超时取消I/O操作的代码,确保在应用程序退出之后正常关闭设备。异步方式相对比较复杂,考虑到设计中算法对时序要求高,所以本设计选择同步方式实现计算机与PCI设备之间的通信。
  3DES加密算法和驱动程序全部完成后,为了对整个加密卡的功能进行验证,开发了一个文件加密服务程序对加密卡进行测试。测试过程如下:
  第一步,系统安装及初始化。首先将加密卡插入到PCI插槽中,将硬件设计下载到FPGA配置芯片后,重新上电,装载驱动程序,最后,启动应用程序开始整个加密卡的测试工作。
  第二步,加密功能测试。输入3DES的两个加密初始密钥Key1、Key2,选择一个事先编辑的文本文件Plain.txt为待加密的明文数据。模式选择为加密的情况下,所得密文数据输出到Cipher.txt文件中。
  第三步,解密功能测试。为了便于比较,仍然选用Key1、Key2为3DES的两个解密初始密钥。导入Cipher.txt作为待解密的密文数据,在模式选择为解密的情况下,所得明文数据导出在Plain1.txt文件中。经过比较,Plain.txt和Plain1.txt完全一致。
  上述测试结果表明,加密卡驱动程序、PCI接口IP核能够正确将应用程序提供的数据传输给密码算法模块,密码算法模块正确完成加解密操作后,数据能正确通过PCI接口IP核、驱动程序传输到应用程序,即加密卡设计实现了预定的功能。下一步还要对系统的性能进行测试,优化系统结构提高系统的性能。
  本文讨论一个基于FPGA实现的PCI加密卡的设计与实现过程,以3DES算法为例重点讨论了密码算法及其与PCI接口模块之间的数据传输实现方法,对包括驱动程序在内的加密卡进行了功能测试。作为一个功能完善的加密卡,要为PC机提供数据加密、数据完整性、访问控制等服务,除了提供3DES加密算法以外,还需要支持AES等加密强度更高的对称密码算法、非对称算法、散列算法、签名验证算法等,这也是下一步要做的主(接上页)
要工作。
参考文献

[1] 成都天融信网络安全技术有限公司.PCI加密卡[EB/OL].http://www.westsec.com.cn,2006.
[2] 刘建中,李清宝.基子PCI总线加密卡硬件设计.电子技术应用[J],2004,30(1):7-9.
[3] 刘红,李勃,常青,等.基于IP核的PCI总线接口设计与实现[J].电子技术应用,2006,32(6):6-9.
[4] 杜欣,马秦生.PCI传输卡的WDM驱动程序设计[J].电子技术应用,2003,29(12):22-24.

此内容为AET网站原创,未经授权禁止转载。