当前位置:文档之家› 江苏大学 硬件基础课程设计 A5-1流密码器

江苏大学 硬件基础课程设计 A5-1流密码器

1.概述1.1设计目的(1)掌握 FPGA设计软件Quartus II的使用方法;(2)了解数字系统在信息安全领域中的应用,熟悉查阅资料方法,锻炼学习能力;(3)训练使用 Verilog HDL 进行较复杂逻辑电路设计的能力;(4)熟练使用调试工具,提高分析问题、解决问题的能力;(5)培养良好的文档习惯,锻炼撰写规范报告的能力。

1.2设计要求(1)能够全面地应用课程中所学的基本理论和基本方法,完成从逻辑电路到简单数字系统或计算机系统的设计;(2)能够独立思考、独立查阅资料,独立设计规定的系统;(3)能够独立地完成实施过程,包括电路设计、调试验证和排除错误。

1.3设计任务用Verilog HDL设计一个A5/1流密码器;设计多功能移位寄存器用于保存和移位要加密/解密的数据;用流密码器和移位寄存器组成对称加密数据通路;用状态机的方法设计控制单元,由控制单元控制自动完成加密及解密过程。

(1)分析系统功能需求,制定详细设计方案;(2)通过 Verilog HDL 完成规定的设计内容,采取模块化、层次化的设计方法设计电路;(3)在实验板上验证设计的正确性,认真记录测试过程中遇到的故障以及解决方法;(4)撰写设计报告,并对存在的问题进行分析、提出改进意见。

1.4实验设备及软件工具实验设备:windows系统电脑实验系统: WeLab远程实验板设计软件:Quartus II 12.0 Web Edition2.设计2.1功能分析本次设计的A5/1密码器是一个简单易用的硬件加密/解密器,它的功能分析如下:(1)保存和显示数据:硬件内部设计有移位寄存器来保存输入数据和加/解密获得的数据,通过数码管可以显示加/解密获得的数据。

即输入待处理的数据,启动密码器进行处理后,就可以显示处理后的数据(2)加密/解密输入的数据:本密码器是对称式的密码器,输入明文能得到相应的密文,而再输入相应的密文,就能解密出相应的明文,限制二进制输入位数为16位,A5/1密钥机制的复杂性使得它更难被破译2.2整体设计思路本密码器总体上分为两个大模块,一是外部接口模块,该模块中定义了外部信号和内部信号的连接,从而实现内外部的交互;二是FSM状态机控制单元,也是实验逻辑所在,该模块控制了密码器的状态运转,在每个时钟周期内进行相应的数据处理,次态计算,以及状态转换,从而实现每个时钟周期内加密一位输入数据,加密了16次之后将其进行输出模块一:外部接口(1)将输入端口赋值给内部信号:将连续16个开关赋值给16位输入信号IN,将按键0赋值给外部输入的启动信号start_asyn,将按键1赋值给重置信号_reset(2)内部信号赋值给输出端口(数码管)观察:一位数码管最多能表示四位二进制数,将16位的处理完成数据OUT分为四个部分分别赋值给四个数码管(3)启动信号处理与模块连接:将外部输入的启动信号start_asyn进行处理,在启动重置或者加/解密完成的时候将实际的启动信号start置0,在时钟来临的时候将start_asyn赋值给start。

将此模块连接到FSM控制模块模块二:FSM控制单元本控制单元的主要部分是一个三段式状态机和一个计数器,状态机的状态图如下:count<4’hF,count计数一次,加密一位start=0,未启动时(1)计数器:四位计数器,重置时计数值置0,启动加/解密时启动计数,总共加/解密16位计数16次,从0开始计数,到15即计数16次。

完成加/解密计数值置0 (2)状态机1)数据处理:重置信号为1则把输出寄存器清零。

时钟来临时,若现态为初态,start=1则根据输入数据和总密钥初始化输入寄存器和三个分密钥寄存器;若现态为加密态,加密一位输入数据后放入输出寄存器2)次态计算:若现态为初态,start=1则次态为加密态,否则为初态;若现态为加密态,count<4’hF则次态为加密态,否则为初态3)状态转换:重置信号为1则将现态转到初态。

时钟来临时,将现态转到计算好的次态运作流程和时序顺序:(1)时钟来临:外部启动信号start_asyn赋值给启动信号start(‘+’表示同时发生)+ 根据现态来处理数据 + 状态转换+计数器根据条件计数(2)重置:输出寄存器置0 + 现态跳转为初态 + 计数器清0 + 启动信号置0 (现态为上次时钟周期转换成的次态,组合逻辑的always块有自己的触发条件)2.3核心设计及阐释本次设计的核心设计为FSM控制单元,各部件详细设计如下:(1)计数器:敏感列表为时钟上升沿和重置信号上升沿,表示当时钟来临或者按下重置键的时候激活该部件,重置信号为1或现态为初态时计数器置0,现态为加密态是计数一次(2)状态定义和变量定义:需要用到的变量,总密钥在定义的时候初始化,并且不做更改。

状态定义,定义初态为0,加密态为1(3)输出逻辑(数据处理):数据处理是本次设计最核心的地方。

敏感列表为时钟上升沿和重置信号上升沿,表示当时钟来临或者按下重置键的时候激活该部件。

重置信号为1时将输出寄存器清零。

时钟来临时,若现态为初态,start=1则根据输入数据和总密钥初始化输入寄存器和三个分密钥寄存器;若现态为加密态,加密一位输入数据后放入输出寄存器,然后分密钥寄存器、输入寄存器和输出寄存器都需要进行移位。

三个分密钥有它们自己的线性反馈移位规则。

每次将最高位加密后放到最低位,其他位都向高位移动一位,当加密16次后,原来在最低位的第一位加密数据就回到了最高位下方的小部件是用来计算密码流的,每次分密钥寄存器进行了更改,就按照当前的分密钥进行一位密码流的计算,然后才能根据此密码流进行数据加密,因为需要先计算出使能位才能再计算密码流,所以只能使用组合逻辑和阻塞赋值,即满足触发条件时马上运行所有语句,code计算时使用刚计算好的M进行计算,而不是上次触发运行时M计算的结果(4)次态计算:敏感列表为*,表示所有信号改变的时候都会触发,这样就能在每个信号变换时及时决定好次态,这个部件也是组合逻辑,一经触发马上执行。

有信号变化时,若现态为初态,,完成信号done置0,start=1则次态为加密态,否则为初态;若现态为加密态,count<4’hF 则次态为加密态,完成信号done置0,否则,加密次数达到16次,将完成信号done置1,将输出寄存器的值赋给输出信号OUT。

注:数码管显示的时OUT的值,重置时重置的是输出寄存器OR的值(5)状态转换:敏感列表为时钟上升沿和重置信号上升沿,表示当时钟来临或者按下重置键的时候激活该部件。

重置信号为1则将现态转到初态。

时钟来临时,将现态转到计算好的次态,而数据处理部分是根据上次转换的次态来进行判断的,即本次时钟周期中,现态为上次时钟周期最后转换成的次态除此之外,时钟信号的控制对于时序电路的设计来说也是非常关键的,本次设计使用的时钟分频模块为偶分频模块,分频系数为50000,实验板的时钟频率为50MHz,所以分频后的时钟输出频率为1KHz,即最大时钟周期为1ms2.4验证测试输入四位16进制数据4’h1234,得到数据4’h2A57输入四位16进制数据4’h2A57,得到数据4’h1234输入四位16进制数据4’h ABCD,得到数据4’h93AE输入四位16进制数据4’h93AE,得到数据4’h ABCD 注:由于远程实验板更新数据比较不稳定,改变开关输入数据后前几次按下密码器启动键时,输出数据为未完成16次加密时的数据,但多按几次后会维持在一个稳定的显示数据,虽然再按也会有一两次输出不稳定,但稳定时的数据就是加密完成的数据,通过对称解密可以验证。

重置键重置的是内部输出寄存器,并不清零数码管观察的OUT信号,所以按下重置键没有现象,所以不作演示附录:设计源代码文件目录:只附上主要文件Virtual_Lab_Top.v和FSM_controller.v的代码:Virtual_Lab_Top.v://A5/1密码器`default_nettype nonemodule Virtual_Lab_Top(input wire CLOCK,input wire [4:0] BUTTON, //按键input wire [35:0] SWITCH, //开关output wire [35:0] LED, //指示灯output wire [3:0] HEX0, //数码管output wire [3:0] HEX1,output wire [3:0] HEX2,output wire [3:0] HEX3);//输入端口赋值给内部信号wire [15:0] IN = SWITCH[15:0]; //需加/解密的输入数据wire start_asyn = BUTTON[0]; //启动信号wire _reset = BUTTON[1]; //重置信号reg start; //启动信号定义wire done; //完成信号定义wire [15:0] OUT; //加/解密完成的输出数据信号定义//启动信号always@(posedge CLOCK or posedge _reset or posedge done)begini f(_reset==1 || done==1)start<=1'b0;e lsestart<= start_asyn;end//连接FSM控制模块FSM_controller u1(CLOCK,_reset,start,IN,OUT,done);//内部信号赋值给输出端口(数码管)观察assign HEX0 = OUT[3:0];assign HEX1 = OUT[7:4];assign HEX2 = OUT[11:8];assign HEX3 = OUT[15:12];endmoduleFSM_controller.v://-----------A5/1密码器-----------//FSM控制单元module FSM_controller(i nput CLOCK,_reset, start,i nput [15:0] IN,o utput reg [15:0] OR,o utput reg done);reg [15:0] IR,OUT; //输入,输出寄存器reg [63:0] LFSR = 64'h3170604015ABCDEF; //十六位总密钥reg [18:0] X; //分密钥Xreg [21:0] Y; //分密钥Yreg [22:0] Z; //分密钥Zreg M; //使能总位reg code; //每次得到的1位密码流reg [3:0] count; //4位计数器//----------计数器-----------always@(posedge CLOCK or posedge _reset) //为15即已加密16位begini f(_reset==1)count<=0;e lse if(current_state==init)count<=0;e lse if(current_state==encrypt)count<=count+1;endreg current_state, next_state;//----------状态定义----------localparam init=1'b0; //初始态localparam encrypt=1'b1; //加密态/*---------输出逻辑----------输出发生器定义了数据通路,并且通过行为描述来定义了数据通路的控制信号*/ always@(posedge CLOCK or posedge _reset)beginif(_reset==1)O R <= 0;elsebegincase(current_state)i nit:b egin //初始化if(start==1)beginIR <= IN;X <= LFSR[18:0];Y <= LFSR[40:19];Z <= LFSR[63:41];ende ncrypt:beginOR <= {OR[14:0],code^IR[15]};IR <= {IR[14:0],IR[15]};X <= {X[17:0],X[13]^X[16]^X[17]^X[18]};Y <= {Y[20:0],Y[20]^Y[21]};Z <= {Z[21:0],Z[7]^Z[20]^Z[21]^Z[22]};e nde ndcaseendendalways@(Z)beginM = X[8]&Y[10]|Y[10]&Z[10]|X[8]&Z[10];c ode = ((~M|~X[8])&X[18])^((~M|~Y[10])&Y[21])^((~M|~Z[10])&Z[22]); end//----------状态转换----------always@(*)beginc ase(current_state)i nit:b eginif(start==1)begindone=0;next_state=encrypt;endelsebegindone=0;next_state=init;ende nde ncrypt:if(count<4'hF)begindone=0;next_state=encrypt;endelsebegindone=1;next_state=init;OUT=OR;ende nde ndcaseend//----------状态转换----------always@(posedge CLOCK or posedge _reset) begini f(_reset==1)current_state <= init;e lsecurrent_state <= next_state;endendmodule。

相关主题