摘要:介绍基于PCI总线加密卡的硬件组成部分。该加密卡汲取了现代先进的加密思想,实现了高强度加密功能。
关键词:加密卡 PCI总线 PCI9052 ISP 单片机
加密是对软件进行保护的一种有效手段。从加密技术的发展历程及发展趋势来看,加密可大体划分为软加密和硬加密两种。硬加密的典型产品是使用并口的软件狗,它的缺点是端口地址固定,容易被逻辑分析仪或仿真软件跟踪,并且还占用了有限的并口资源。笔者设计的基于PCI总线的加密卡具有以下几个优点:,PCI总线是当今计算机使用的主流标准总线,具有丰富的硬件资源,因此不易受资源环境限制;第二,PCI设备配置空间采用自动配置方式,反跟踪能力强;第三,在PCI扩展卡上易于实现先进的加密算法。
1 总体设计方案
基于PCI总线的加密卡插在计算机的PCI总线插槽上(5V 32Bit连接器),主处理器通过与加密卡通信,获取密钥及其它数据。加密卡的工作过程和工作原理是:系统动态分配给加密卡4字节I/O空间,被加密软件通过驱动程序访问该I/O空间;加密卡收到访问命令后,通过PCI专用接口芯片,把PCI总线访问时序转化为本地总线访问时序;本地总线信号经过转换处理后,与单片机相连,按约定的通信协议与单片机通信。上述过程实现了主处理器对加密卡的访问操作。
图1 硬件总体设计方案
下面以主处理器对加密卡进行写操作为例,阐述具体的实现方法。加密卡采用PLX公司的PCI9052作为PCI总线周期与本地总线周期进行转换的接口芯片。PCI9052作为PCI总线从设备,又充当了本地总线主设备,对其配置可通过EEPROM 93LC46B实现。主处理器对加密卡进行写操作,PCI9052把PCI总线时序转化为8位本地数据总线写操作。这8位本地数据总线通过Lattice公司的ispLSI2064与单片机AT89C51的P0口相连,2064完成PCI9052本地总线与AT89C51之间的数据传输、握手信号转换控制等功能。2064对8位本地数据总线写操作进行处理,产生中断信号。该中断信号与AT89C51的INT0#相连,使AT89C51产生中断。AT89C51产生中断后,检测与其P2口相连的本地读写信号WR#、RD#、LW/R#。当WR#为低电平、LW/R#为高电平时,AT89C51判断目前的操作是否为写操作。确认是写操作后,AT89C51把P0口上的8位数据取下来,然后用RDY51#(经2064转换后)通知PCI9052的LRDYi#,表明自己已经把当前的8位数据取走,可以继续下面的工作。PCI9052收到LRDYi#有效后,结束当前的8位数据写操作。PCI总线的32位数据写操作,PCI9052本地总线需要四次8位数据写操作,通过字节使能LBE1#、LBE0#区分当前的8位数据是第几个字节有效。
加密卡硬件总体设计方案如图1所示。
2 硬件各组成部分说明
2.1 PCI9052部分
PCI9052是PCI总线专用接口芯片,采用CMOS工艺,160引脚PQFP封装,符合PCI总线标准2.1版。其总线接口信号与PCI总线信号位置对应,因此可直接相连,易于PCB实现。PCI9052的数据传输速率可达132MB/s;本地时钟可至40MHz,且无需与PCI时钟同步;可通过两个本地中断输入或软件设置产生PCI中断。它支持三种本地总线工作模式,实际设计采用地址和数据线非复用、8位本地数据总线、非ISA模式。
PCI9052内部有一个64字节PCI配置空间,一个84字节本地配置寄存器组。对PCI9052的配置可由主机或符合3线协议的串行EEPROM完成(注:ISA模式必须由串行EEPROM完成配置)。实际设计采用Microchip公司的93LC46B存放配置信息。系统初始化时,自动将配置信息装入PCI9052,约需780μs。如果EEPROM不存在或检测到空设备,则PCI9052设置为默认值。
在设计中,EEPROM用到的配置项目有:设备ID:9050;厂商ID:10B5;分类代码:0780;子系统ID:9050;子系统厂商ID:10B5;支持INTA#中断,PCI 3C:0100;分配4字节本地I/O空间:(例LAS0RR)0FFFFFFD;其它本地地址空间未使用:00000000;4字节本地I/O空间基地址(模4对齐):(LAS0BA)01200001(仅为示例);4字节本地I/O空间描述符:(LAS0BRD)00000022(非猝发、LRDYi#输入使能、BTERM#输入不使能、不预取、各内部等待状态数均为0、8位本地数据总线宽度、小Endian模式);中断控制/状态,Local 4C:00000143(LINTi1使能、LINTi1边沿触发中断选择使能、LINTi2不使能、PCI中断使能、非软件中断、ISA接口模式不使能);User I/O、从设备应答、串行EEPROM、初始化控制,Local 50:00024492。有两点要注意:一是设计中采用PLX公司推荐使用的串行EEPROM 93LC46B按字(16 bit)为单位组织;二是EEPROM开发器编辑输入与手工书写的顺序对应关系,以厂商ID:10B5为例,在开发器编辑输入的是b510,而不是10B5。
PCI9052本地信号的含义是:LAD[7..0]:本地8位数据总线;WR#:写有效;RD#:读有效;LW/R#:数据传输方向,高电平为写操作,低电平为读操作;LBE1#和LBE0#:字节使能,表明当前LAD[7..0]上的数据是第几个字节(0到3);BLAST#:PCI9052写数据准备好或读数据已取走;LRDYi#:外部设备(此设计指单片机)已把PCI9052写操作数据取走或读操作数据准备好;LINTi1:外部设备通过LINTi1向主机发送INTA#中断,当单片机验证密钥正确,向主处理器发送请求,表明可以开始从中读取相关数据。
需注意的是,PCI9052在使用时,某些引脚要加阻值为1kΩ~10kΩ的下拉或上拉电阻。因此在实现时,给MODE、LHOLD、LINTi1引脚加下拉电阻,CHRDY、EEDO、LRDYi#引脚加上拉电阻。
图2 PCI9052本地写时序
以主处理器向单片机写数据为例,图2给出了PCI9052的本地写时序。
2.2 ispLSI2064部分
为降低数据被解析的风险,应尽量减少使用分离元件。因此在设计中选用了Lattice公司的CPLD ispLSI2064。该芯片采用EECMOS技术,100引脚TQFP封装,拥有2000个PLD门,64个I/O引脚另加4个专用输入,64个寄存器,3个全局时钟,TTL兼容的输入输出信号。2064具有在系统可编程ISP(In-System Programmable)功能,可方便实现硬件重构,易于升级,降低了设计风险,并且安全性能高。PCI9052与单片机之间的8位数据线进行双向数据传输,不能简单地直接相连,需要进行传输方向控制和数据隔离。故用2064作为PCI9052本地信号与单片机信号进行信号传递的接口,图3给出了8位数据信号双向传输的原理图。2064的开发软件ispDesignExpert 8.2版支持VHDL、Verilog HDL、Abel等语言及原理图输入,且通过专用电缆可把终生成的JEDEC文件写入2064,实现编程。在设计时采用了原理图输入的方法。
原理图中用到的BI18的功能描述为:当OE=1时,XB为输出,A为输入,即XB=A;当OE=0时,XB为输入,Z为输出,即Z=XB。FD28的功能描述为:8位D触发器(带异步清除)。结合PCI9052本地读写时序,可以分析得出,在进行读写操作时,图3实现了LAD[7..0]与D[7..0]之间正常的数据传输;在非读写时,双方数据处于正常隔离状态。
2.3 单片机AT89C51部分
单片机采用ATMEL公司的AT89C51。这是一个8位微处理器,采用CMOS工艺,40引脚DIP封装。它含有4K字节Flash和128字节RAM,且自身具有加密保护功能。单片机不进行外部存储器和RAM的扩展,程序存储和运行均在片内完成,有效地保证了加密强度。
图3 LAD[7..0]与D[7..0]之间的数据传输
单片机的P0口接图3的D[7..0],并加10kΩ的上拉排阻。WR#、RD#、W/R#、BE1#、BE0#作为单片机输入信号接P2口。PCI9052写数据准备好或读数据已取走信号REQ9052#作为单片机输入信号接P3.2(INT0#);写数据单片机已取走或读数据单片机准备好信号RDY51#作为单片机输出信号接P1.0;接P1.1的OVER51#作为单片机输出信号,经2064接PCI9052的LINTi1,通过LINTi1向主机发送INTA#中断请求。
基于PCI总线的加密卡,依照PCI总线标准2.1版,通过动态分配4字节I/O空间,实现主处理器与卡上单片机之间的握手通信。被加密软件通过访问加密卡,获取软件正常执行的相关权限。在加密卡不存在的情况下,被加密软件因得不到相关授权而无法运行,从而实现了加密功能。在单片机的存储器里,除了存放密钥之外,设计者还可以把被加密软件的部分程序、算法或常数写入单片机的存储器,在加密卡不存在的情况下,被加密软件的功能是不完整的,从根本上防止了软件破解。
[1]. PCI datasheet https://www.dzsc.com/datasheet/PCI_1201469.html.
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。