php餐饮美食店网站源码 生成html,新生活cms订货系统下载,汉服销售网站建设,电脑网站设计公司基于APB总线的SM4密码协处理器实现#xff08;附Verilog代码#xff09; 本文内容摘要理论依据和设计内容SM4分组密码算法APB_slave协处理器 测试过程与结果调试经历测试结果SM4.0部分测试APB协处理器部分测试 整体代码 本文内容摘要 本文使用Verilog语言实现SM4加密协处理器… 基于APB总线的SM4密码协处理器实现附Verilog代码 本文内容摘要理论依据和设计内容SM4分组密码算法APB_slave协处理器 测试过程与结果调试经历测试结果SM4.0部分测试APB协处理器部分测试 整体代码 本文内容摘要 本文使用Verilog语言实现SM4加密协处理器
使用Verilog完成SM4基本模块定义所需寄存器添加APB总线接口完成兼容APB总线的SM4协处理器设计
理论依据和设计内容
SM4分组密码算法 基于《信息安全技术 SM4分组密码算法》清晰规定了SM4.0的算法流程。SM4.0算法利用分组加密分组的长度和密钥长度均为128bit。该算法由密钥扩展算法与加密(解密)算法两部分构成均采用非线性迭代结构其加密与解密算法具有相同的结构只是对输入轮密钥进行反序变换。下面我只对加密的算法进行解读 首先需要进行输入密钥的分区将128bits的密钥输入划分到四个32bits的数组中此处我采用四个32bits数组拼接并赋予密钥输入值实现。这一步后开始进行密钥扩展算法它通过一系列变换生成一组32位的轮密钥。在介绍如何扩展产生轮密钥之前先介绍几个关键的变换和函数
轮函数其定义为F(X0,X1,X2,X3,rk)X0T(X1X2X3rk)即输入为明文和密钥输出为密文该函数用于加密中。合成置换函数其中由两个变换分别为线性变换和非线性变换。非线性变换为(b0,b1,b2,b3)(Sbox(a0),Sbox(a1),Sbox(a2),Sbox(a3))即输入四个8bits的信号输出查找表后的四个8bit拼接成的32位数据。在得到这个32位数据输出后要进行下一轮的线性变换这个变换有两种一种用于产生轮密钥其为LN(B)B(B13)(B23)另一种为L(B)B(B2)(B10)(B18)(B24)其用于最终产生密文。整个过程需要使用三个常参数矩阵CK,Sbox和FK。 光说很难理清整个SM4.0算法的原理流程下面将画出算法流程图结合我最终的代码结构画图 SM4.0算法流程图如下图所示。 在理解了SM4.0算法的原理和流程后开始了代码的编程。 最开始的模型我设计的输入仅有明文、密钥、时钟和复位输出为密文此模型仅用于编写成正确的SM4.0算法。 首先我在两个always块中分别进行了轮密钥的生成和明文加密最开始所需要用的两个线性变换我都编写了function想在always里直接调用函数进行运算但在调整逻辑后仿真失败难究问题所在于是我摒弃了函数的方式且函数较为简单我就直接在always里进行运算这两个模块都较为容易的的实现了。然后又在第三个always块里建立了一个计数器用于32轮轮密钥和密文的计算。对于三个常参数矩阵的初始化这是三个二维数组我建立了第四个always块在其中逐个地址位赋参数初步完成四个always块完成了SM4.0算法的设计。 在正确完成了算法加密计算后我又添加了两个输入分别为输入密钥的有效和输入明文的有效只有是有效信号时才读入进行计算。并添加了一个状态输出在没有进行加密时标志位高电平而在计算过程中输出为低电平。到此完成了SM4.0基本模块的全部设计。 SM4.0基本模块框图如下
APB_slave协处理器 本部分是用来设计一个可以用来兼容APB总线的SM4加密协处理器用来将SM4.0加密模块与APB总线进行对接使总线发送来的数据可以正常写入并进行加密后并由总线读取。具体可参考之前博客APB总线部分本文也会给出适用于SM4.0的总线代码。 为了满足apb总线的输入因此要将apb_slave的输入和输出设置成与总线一致因此在输入端设置了PSELx用于在通讯时选择从设备、PENABLEAPB使能信号用来指示一次APB传输的第二个时钟周期、PCLKAPB总线时钟信号上升沿有效、PRESETNAPB总线复位信号低电平有效、PWRITEAPB写指令信号高电平为写低电平为读、PADDRAPB总线读写地址最高为32位、PWDATAAPB总线写数据最高为32位SM4_DATASM4加密后数据输入端用来将数据存储起来以便在apb总线读数据的时候输出在输出端设置了text_isvaid和mk_isvaid两个输出用于表示已经接收完毕总线所发送来的数据此时可以进行加密运算在输出端设置了两个128位的数据线用来传输明文以及密钥至SM4模块。 设计完所需要的输入输出之后便可进行内部设计。由于总线是32位宽而SM4加密模块是128位明文输入、128位密钥输入、128位密文输出因此要使用4个32位寄存器改变总线地址让数据分别写入4个32位地址之中并且将数据合并成为128位输出至加密模块进行加密后再以32位数据的方式存储至APB_slave中。 总线程序流程图如下图所示
测试过程与结果
调试经历 在参考了《信息安全技术 SM4分组密码算法》后我在激励文件中也赋予示例中的测试值在modelsim中进行调试加入观察所有变量的波形和值找到不对的位置再找到对应代码位置思考为何出错并调整一步一步调试观察几个rom中的值、cnt计数等返再回纠错再调试。最终完成了modelsim的验证确定了算法语法和代码逻辑的正确性。然后我将代码放入Quartus中进行编译借此检查是否有硬件逻辑错误其中有一个if造成了锁存修正后联合Modelsim仿真正确完成模型的验证。 若要验证APB协处理器是否正确则应该模拟APB总线的工作条件设定正确的时序给出协处理器地址和应写入的数据观察波形图数据是否正确写入然后在观察经过加密后的数据是否能够正确读出与标准加密码表进行对比观察结果是否正确并且查看波形图时序查看逻辑是否正确。在这种思路之上针对协处理器写出了测试文件具体测试结果可见后文验证部分。
测试结果
SM4.0部分测试 下图可以看到当密钥和明文输入有效指令到来后加密模块开始进入加密过程且输出状态置为低电平。在计算完成后输出128位密文同时输出状态置为高电平表示空闲。密文结果与《信息安全技术 SM4.0分组密码算法》给的测试结果对比正确无误即代表SM4.0加密正确。 当新值输入后但没有输入有效信号读入即不是想要的加密信号加密模块不进入加密过程输出不变无新值。
APB协处理器部分测试 在Quartus II中建立工程并将所有HDL文件导入后进行编译编译后无错误利用软件生成了硬件RTL图如下图所示可以看出与设计相符硬件模型搭建基本正确。 随后进行波形的仿真验证利用Quartus II软件联合modelsim进行仿真测试将top_level_tb.v文件导入后生成了如下测试波形图。 仿真的目的是能够不断的向总线内写入: 32’h01234567,32’h89ABCDEF,32’hFEDCBA98,32’h76543210,32’h01234567,32’h89ABCDEF,32’hFEDCBA98,32’h76543210 地址分别对应: 32’h00,32’h04,32’h08,32’h0c,32’h10,32’h14,32’h18,32’h1c 下面图1为协处理器写入前4组数据即128位明文的波形图图2为协处理器写入后4组数据即128位密钥的波形图可以看出来在地址有效时同时PELx和PWRITE信号有效延时一个时钟周期后PENABLE有效此时开始向协处理器内写入数据并且在数据传送完成后PELx、PWRITE、PENABLE均变为0此时地址变为下一个地址随机进行下一轮数据传输。 下图为协处理器读出加密后的密文的波形图可以看出来在地址有效时同时PELx有效PWRITE信号为0延时一个时钟周期后PENABLE有效此时协处理器开始读出数据并且在数据传送完成后PELx、PWRITE、PENABLE均变为0此时地址变为下一个地址随机进行下一轮数据传输。读出的密文数值为68 1e df 34 d2 06 96 5e 86 b3 e9 4f 53 6e 42 46,用此数据与国密标准进行对照发现结果正确验证协处理器的正确性。
整体代码
代码见资源包含APB总线和SM4.0加密模块顶层代码、加密读写代码和激励测试代码
https://download.csdn.net/download/Nirvana_Tai/88650281