硬件加密模块.docx
- 文档编号:4031949
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:18
- 大小:375.69KB
硬件加密模块.docx
《硬件加密模块.docx》由会员分享,可在线阅读,更多相关《硬件加密模块.docx(18页珍藏版)》请在冰豆网上搜索。
硬件加密模块
硬件加密模块
(FPGA实现AT88SC0104C认证)
使用说明书
1简介
1.1目的
防范电子装置被盗版的最有效手段目前仍然是设置盗版障碍。
为此,Atmel公司于1999年推出了用于防范盗版的安全存储器件AT88SC153和AT88SC1608,又于2003年推出了具有双向认证且密文传送的新型安全存储器件AT88SC0104C系列,进一步提高了盗版的难度。
试图从I2C接口通信数据(即SDA)分析出密钥的可能性理论上存在,但在现实中并无意义。
这是因为器件的密钥为8字节,按照算法即使用最快的FPGA穷举搜索也要万年以上。
由于大多数单片机的程序易于被盗取且能够被反汇编,当盗版者获得了安全存储器件的详细资料后仍然有可能由盗取的单片机程序代码反汇编追踪安全存储器件的设置信息,使得电子产品被盗版的危险性依然存在。
这里给出将AT88SC0104C的全部认证流程置于CPLD/FPGA器件的方案。
尽管CPLD/FPGA中的设置代码易于被盗取,但由于不能反汇编,所以无法追踪出AT88SC0104C的相关信息,从根本上杜绝了遭受追踪攻击的可能性。
1.2资源占用
采用EP2C8Q208型FPGA时资源占用情况如下:
引脚:
2个输出,分别用于时钟(SCL))和数据输出(SDA_OUT);1个输入(数据输入(SDA_IN);logicelements1139个,为总数(8256)的14%;registers732个。
采用40MHz晶振的认证时间约15ms。
而采用单片机认证所需的时间约180ms。
1.3基本原理
FPGA设计部分主要完成FPGA和0104C上电配置完成之后,FPGA使用I2C主机模式下单一从器件与0104C通讯并执行认证过程。
认证成功后,FPGA内部给出认证成功标志,并使能FPGA内部其它功能模块开始正常工作。
1.4系统结构框图
本设计主要完成FPGA和0104C上电配置完成之后,FPGA使用I2C主机模式与0104C通讯并执行认证过程,认证成功后,产生相应的使能信号使能FPGA内部其它功能模块开始正常工作。
在实际应用时,只需将本设计作为总体设计中的一个模块,把使能信号连接其它设计的使能端口。
该设计主要包括主状态机的设计、时钟分频的设计、随机数产生的设计、I2C串口通信接口的设计。
结构框图如图1所示:
图1-1系统结构框图
1.5AT88SC0104简介
AT88SC0104C是Atmel公司于2003年推出的高安全性能存储卡。
存储容量为128B。
协议认证卡在协议认证后,所有传送的数据均采用密文传送方式,因而提高了存储数据的安全性。
AT88SC0104C协议认证卡的主要特点:
通信协议符合ISO/IEC7816—3同步协议。
工作电压为2.7~5.5V。
时钟频率最大为1.5MHz。
数据保存为100年。
重复擦写次数为100000次。
ESD(静电防护)不小于4000V。
使用环境温度:
商业级为0~70℃;工业级为-45~85℃。
该协议认证卡的基本组成如图1所示:
图1-2AT88SC0104C基本组成框图
采用AT88SC0104C对FPGA进行加密的基本工作流程:
1.硬件连接
将AT88SC0104C与FPGA相连,只需将AT88SC0104C的SCL和SDA引脚分别与FPGA的任意两个I/O管脚连接即可。
为了防止可能出现的I2C总线第9个脉冲无应答信号,将SDA分成一进一出的独立线路。
同时为了确保I2C线路的SDA是OC或OD线路,I2C总线的时钟频率在1.5MHz以下。
电气原理如图2所示。
图1-3AT88SC0104C对FPGA加密的电气原理
2.AT88SC0104C的配置
按照加密功能的要求,对AT88SC0104C的配置区的各数据进行配置。
比如修改读写密码,修改密钥GC等等。
具体修改方法详见读写编程器使用手册。
3.AT88SC0104C的编程
将配置文件和部分保密数据事先按地址写入AT88SC0104C的配置区和用户区各单元。
具体操作方法详见读写编程器使用手册。
4.AT88SC0104C的熔断
在系统调试成功以后,才将AT88SC0104C中的熔丝熔断。
熔断之后,配置不再更改,这一点需特别注意。
熔断的过程如下:
1)向熔丝标志寄存器写入06H;
2)向熔丝标志寄存器写入04H;
3)向熔丝标志寄存器写入00H。
1.6晶体振荡器选用
建议采用独立的40MHz有源晶体振荡器,以确保整机工作的稳定性。
1.7FPGA引脚定义
必须在FPGA的设置中定义引脚见下表。
这些引脚必须与硬件连接相一致。
序号
Verilog/VHDL文件中的名称
输入/输出
用途
1
CLK
输入
40MHz晶体振荡器时钟输入
2
SDA_IN
输入
AT88SC0104C的SDA输出
3
SDA_OUT
输出
AT88SC0104C的SDA输入
4
SCL
输出
AT88SC0104C的SCL输入
5
RST
输入
全局复位信号输入
6
AGAIN_AUTHEN_KEY
输入
用于演示的重复启动认证输入
示例程序中,已将AGAIN_AUTHEN_KEY引至KEY4(按键),所以只要按下KEY4即可启动重复认证流程。
如不需要由外部引脚启动重复认证流程,可以不定义AGAIN_AUTHEN_KEY引脚。
2程序说明
2.1VHDL/Verilog模块文件说明
main主控模块
I2C_transmitI2C数据总线接口与控制模块
I2C_clkI2C总线时钟分频及SCL时钟产生模块
five_clk产生AT88SC0104C初始化所需的5个CLK模块
GPAGPA算法函数电路模块
delay延时3ms
RNG.随机数产生模块
inverse.v非门(用于随机数生成)
编译时使用增量编译,以免非门被综合掉。
:
Settings---CompilationProcessSettings---IncrementalCompilation---off(.)
2.2主控模块设计
该模块主要完成主状态机的状态切换、产生其它模块的控制信号。
根据前面设计的FPGA的工作流程将主状态机设计为14个状态:
RESET、FIVE_CLK、GET_RANDOM、CI_FROM_GCX、READ_CI_A、GPA_A、GPA_B、TRANS_20BYTE、JUSTIFY_A、NEW_CIX、NEW_SK、READ_CI_B、JUSTIFY_B、SK_REPLACE_GC、ALL_RIGHT,一个状态对应工作流程中的一个流程。
主控模块的设计及其与其它模块之间的关系如图2-1:
图2-1主控模块的设计及其与其它模块之间的关系方框图
其中,状态GPA_A、状态GPA_B由gpa_state状态机和train_state状态机实现对GPA算法的控制。
2.3I2C模块说明
I2C总线由FPGA控制,FPGA所发出的字节系列都是由命令开始,随后如果是写操作则是数据字节,否则是读数据。
I2C总线备用时SDA和SCL都必须保持高电阻高电平状态,只有关闭I2C总线时才会将SCL钳位于低电平。
在I2C总线上传送数据时,在SCL高电平期间SDA上必须保持有稳定的逻辑电平状态,高电平为数据1,低电平为数据0。
I2C总线在传送数据过程中共有三种类型信号,即开始信号、终止信号和应答信号。
起始信号:
SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
停止信号:
SCL为高电平时,SDA由低电平向高电平跳变,终止传送数据。
应答信号:
FPGA在接收到一个字节数据后,在下一个SCL高电平时向AT88SC0104C发出低电平脉冲。
FPGA在发送一个字节数据后,在下一个SCL高电平时读SDA_IN,检测应答位是否为低电平,此时SDA_OUT应该钳位于高电平。
时序如图5所示:
图2-2I2C总线时序图
程序由主状态机和串并转换任务组成,其状态机采用独热(one-hot)编码。
状态转移如图2-3所示:
图2-3读写状态转移
为了提高接口的稳定性,I2C总线在读取数据时连续采样三次,采用三决二胜。
在写命令或者写数据后如果0104C没有应答信号,则结束本次数据传输。
2.3.1I2C模块接口说明
整个I2C系统用sda_in、sda_out、scl完成与AT88SC0104C的数据交换
指定至具体引脚:
sda_in:
串行数据输入(读取0104发送的数据)
sda_out:
串行数据输出(传送给0104的数据)
与FPGA内部的接口包括:
SIGNAL:
go:
I2C启动信号
shift_byte:
FPGA需要读(写)的字节数
ready:
I2C模块接收了一个字节的数据(多字节读时表示一个字节传输完成,FPGA读取该字节并储存供后续使用)
send_ready:
表示需要传递一个字节数据给I2C(多字节写时表示FPGA应传输给I2C模块一个字节数据以供传输)
din:
FPGA写数据(传输给0104的数据)
dout:
FPGA读数据(从0104读取的数据)
I2C_stop:
I2C完成传输给定字节的数据
与FPGA外部的接口:
clk:
FPGA外部时钟
rst:
异步复位信号
该模块I2C数据传输过程:
1.起始信号产生
2.控制信号传递(8字节)
3.0104应答(低电平为应答信号)
4.数据传输(读取数据时,连续采样三次,以提高工作可靠性)
5.0104应答
6.停止信号
I2C为顶层文件,I2C_clk为时钟分频部分,I2C_transmit为I2C控制部分。
该设计已用示波器验证。
2.5随机数产生模块设计
本设计中利用这两个非门串联电路的时延的不确定性来实现振荡器的抖动,采用振荡采样法生成随机数,系统原理如图7所示。
为了防止被综合掉,在设计时将非门设计为一个模块(inverse),并使用增量编译。
图2-4 随机数模型原理框图
2.6单片机程序设计
当用户选择采用单片机配置FPGA时,
主控MCU采用51系列单片机,采用C语言编写单片机程序,主要编写FPGA的配置程序。
只需将用户放置于配置程序之后即可。
2.6.1配置FPGA流程设计
当电路板上FPGA配置方式设置成被动配置方式(PS)时,每次上电单片机都会自动对FPGA进行配置。
通过初始化FPGA后,单片机将接收到的数据包数据逐个写入,每写入1字节判断写入成功标志脚,有利于配置各类FPGA芯片,有更好的兼容性。
图2-5FPGA配置数据流程图
3.操作方法
3.1对AT88SC0104C进行设置
具体操作步骤详见《SC-RWP2型AT88SCxx系列读写编程器使用说明书》。
特别注意:
这里设置的AT88SC0104C的密钥必须与2.3中所设置的密钥完全相同。
AT88SC0104C只有在被设置后才能将其焊装到电路板上。
AT88SC0104C.dem
3.2对EP2C8Q208(FPGA)进行配置
本项目为了兼容各种开发环境具备最常用的三类配置下载方式,以下分别说明各种方式的具体操作。
3.2.1(JTAG)配置方式
用于调试
硬件操作:
把ByteBlasterII下载线接到电路板中JTAG接口。
软件操作:
1.打开编程窗和配置文件。
首先将实验系统和并口通信线连接好,打开电源。
在菜单Tool中选择Programmer,于是弹出如图3-1所示的编程窗。
在Mode栏中有4
种编程模式可以选择:
JTAG、PassiveSerial、ActiveSerial和In-Socket。
为了直接对FPGA进行配置,在编程窗的编程模式Mode中选JTAG(默认),并选中打勾下载文件右侧的第一小方框。
注意要仔细核对下载文件路径与文件名。
如果此文件没有出现或有错,单击左侧“AddFile”按钮,手动选择配置文件main.sof。
图3-1选择编程下载文件
2.设置编程器。
若是初次安装的QuartusII,在编程前必须进行编程器选择操作。
这里准备选择ByteBlasterII[LPT1]。
单击HardwareSetup按钮可设置下载接口方式
(图3-1),在弹出的HardwareSetup对话框中(图3-2),选择Hardwaresettings页,在Currentlyselectedhardware框中选择ByteBlasterII[LPT1](图3-3)。
如果打开图3-2所示的窗口内“Currentlyselectedhardware”右侧显示NoHardware,则必须加入下载方式。
即点击AddHardware钮,在图4-27所示的窗口中选择ByteBlasterII,再在弹出的窗中点击OK,使“Currentlyselected”右侧显示ByteBlasterII[LPT1]。
3.最后单击下载标符Start按钮,即进入对目标器件FPGA的配置下载操作。
当Progress显示出100%,以及在底部的处理栏中出现“ConfigurationSucceeded”时,
表示编程成功。
注意,如果必要,可再次单击Start按钮,直至编程成功。
图3-2加入编程下载方式
图3-3双击选中的编程方式名
图3-4ByteBlasterII编程下载窗
3.2.2主动配置方式(AS)
用于将程序下载至EPCS器件
硬件操作:
将ByteBlasterII下载线与电路板上的AS_PS_J接口相连接,将AS_PS_SEL的AS一侧的3个套针连接,下载成功后须将下载线从电路板拔开,FPGA才会开动工作。
软件操作:
1.选择编程模式和编程目标文件
在如图3-5所示窗口的Mode栏,选择“ActiveSerialProgramming”编程模式,打开
编程文件,选中文件main.pof,并选中打勾3个编程操作项目,如图3-5所示。
图3-5ByteBlasterII接口AS模式编程窗口
2.AS模式编程下载
单击图3-5所示窗口的Start,编程成功后将出现如图3-6所示信息。
编程成功后FPGA
将自动被EPCS器件配置而进入工作状态。
此后每次上电,FPGA都能被EPCS4自动配置,进入正常工作状态。
图3-6AS模式编程成功
3.2.3被动配置方式(PS)
用于由单片机下载配置程序
硬件操作:
将AS_PS_SEL的PS一侧的3个套针连接,将PS_J_SET套上(即连接)。
软件操作:
先由VHDL程序导出main.hex文件后写入存储器芯片AT29C040,上电后使单片机运行CPU_SET_FPGA子程序,单片机将读出AT29C040中的数据后,以PS方式对FPGA芯片进行配置。
HEXOUT文件的形成:
下装到AT29C040文件必须为后缀为hexout的文件,仿真软件QuartusII在6.0版本不能默认产生hexout文件,必须人为设置产生格式文件步骤如下:
打开项目,点击File菜单,选择ConvertProgrammingFiles…如图一所示。
鼠标左键点击Programmingfiletype栏目的下拉箭头,选择Hexadecimal(Intel-Format)OutputFileforSRAM(.hexout)项。
在Filename框中输入导出Hexout文件名字如:
output_file.hexout,
在中可选择导出文件存储路径。
然后选中Inputfilestoconvert栏目中的SOFData,左键点击AddFile按钮。
找到生成的相应的sof文件并打开,此时相应的sof下载文件出现在相应的界面中。
最后左键点击Generate按钮,则生成hexout的文件。
图3-7HEXOUT文件输出
3.3在VHDL/Verilog程序中的设置
3.3.1密钥(Gc)设置
加密系统的密钥需要预先设置,分别储存在FPGA和AT88SC0104C中。
如需修改,则必须在FPGA和AT88SC0104C中同时修改并保持一致。
在VHDL/Verilog程序中修改密钥,只需修改主程序(main.vhd)或(main.v)中gc_mem的赋值并重新编译。
例如,当密钥为123456789ABDEFF时,相应的设置如下:
3.3.1.1VHDL程序中密钥(Gc)设置
//修改密匙时只需修改下面语句中gc_mem的赋值
-------------------GC--------------------------------------------
PROCESS(clk)
BEGIN
IF(clk'EVENTANDclk='1')THEN
IF(state=FIVE_CLK)THEN
gc_mem(0)<="00010010";
gc_mem
(1)<="00110100";
gc_mem
(2)<="01010110";
gc_mem(3)<="01111000";
gc_mem(4)<="10011010";
gc_mem(5)<="10111100";
gc_mem(6)<="11011110";
gc_mem(7)<="11111111";
ELSE
IF((state=NEW_SK)AND(gpa_end='1'))THEN
gc_mem(conv_integer(new_sk_cnt(2DOWNTO0)))<=gpa_dout;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
3.3.1.2Verilog程序中密钥(Gc)设置
always@(posedgeclk)
begin
if(state==FIVE_CLK)
//修改密匙时只需修改下面begin……end语句中gc_mem的赋值
begin
gc_mem[0]<=8'h01;
gc_mem[1]<=8'h23;
gc_mem[2]<=8'h45;
gc_mem[3]<=8'h67;
gc_mem[4]<=8'h89;
gc_mem[5]<=8'hAB;
gc_mem[6]<=8'hCD;
gc_mem[7]<=8'hEF;
end
elseif(state==SK_REPLACE_GC)
begin
gc_mem[0]<=sk_mem[0];
gc_mem[1]<=sk_mem[1];
gc_mem[2]<=sk_mem[2];
gc_mem[3]<=sk_mem[3];
gc_mem[4]<=sk_mem[4];
gc_mem[5]<=sk_mem[5];
gc_mem[6]<=sk_mem[6];
gc_mem[7]<=sk_mem[7];
end
end
3.3.2重复认证启动设置
在开机认证后,如果还希望在特定情况下重复认证,则只需在主程序(main.vhd)或(main.v)中,将需要认证处将变量AGAIN_AUTHEN置一次下降沿即可。
区别于AGAIN_AUTHEN_KEY,这里的AGAIN_AUTHEN为内部信号,由程序设置。
3.3.4认证成功后的FPGA关联设置
认证成功后,VHDL程序将置ALL_RIGHT为1。
对于用户自己的程序中所有需要加密控制的流程均可使之与ALL_RIGHT变量相关联。
例如,假设另外一个VHDL/Verilog模块的启动信号为START,则在顶层文件中:
VHDL程序中设置如下:
Sample:
PORTMAP(
START=>ALL_RIGHT,
);
Verilog程序中设置如下:
mainm1(.clk(clk),.rst(rst),.sda_in(sda_in),.sda_out(sda_out),.scl(scl),
.ALL_RIGHT(ALL_RIGHT),.AGAIN_AUTHEN_KEY(AGAIN_AUTHEN));
SampleM2(.start(ALL_RIGHT),…);
只有当认证成功时,ALL_RIGHT信号为高电平,方可启动模块Sample,如果认证不成功,则ALL_RIGHT信号为低电平,模块Sample不启动。
4.DEMO演示操作说明
采用的文件为示例程序,AT88SC0104C采用的文件为:
demo1.dem。
文件中,已将AT88SC0104C下装文件的密钥和EP2C8的下装文件的密钥均设置为0x123456789ABCDEFF。
进入QUARTUSII后,打开main项目,下装代码,程序自动运行。
按下KEY4按键可以重复执行认证流程一次。
只有在认证成功之后,5个LED全部一起点亮。
如要验证认证过程的正确性或有效性,可以按下列方式测试评估板:
A.取下AT88SC0104C,上电后重复按下KEY4按键。
此时5个LED都不会点亮。
B.如将AT88SC0104C的密钥与VHDL/Verilig程序中的密钥设置成不一样。
此时5个LED都不会点亮。
C.全部采用示例程序,上电后5个LED会一起点亮。
5.光盘文件说明
1.单片机C语言源程序:
CPU_SET_FPGA.c;
2.单片机目标代码程序:
CPU_SET_FPGA.hex;
3.AT88SC0104C程序:
AT88SC0104C.dem;
4.SC-RWP2型AT88SCxx系列读写编程器使用说明书;
5.FPGA的VHDL项目文件与下载文件包:
VHDL_program_files;
6.FPGA的Verilog项目文件与下载文件包:
Verilog_program_files;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 硬件 加密 模块