基于APB总线的SM4密码协处理器实现(附Verilog代码)

基于APB总线的SM4密码协处理器实现(附Verilog代码)

  • 本文内容摘要
  • 理论依据和设计内容
    • SM4分组密码算法
    • APB_slave协处理器
  • 测试过程与结果
    • 调试经历
    • 测试结果
      • SM4.0部分测试
      • APB协处理器部分测试
  • 整体代码

本文内容摘要

  本文使用Verilog语言实现SM4加密协处理器:

  1. 使用Verilog完成SM4基本模块;
  2. 定义所需寄存器,添加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(B<<13)(B<<23);另一种为L(B)=B(B<<2)(B<<10)(B<<18)(B<<24),其用于最终产生密文。整个过程需要使用三个常参数矩阵CK,Sbox和FK。

  光说很难理清整个SM4.0算法的原理流程,下面将画出算法流程图(结合我最终的代码结构画图):
  SM4.0算法流程图如下图所示。
SM4.0算法流程图

  在理解了SM4.0算法的原理和流程后,开始了代码的编程。
  最开始的模型我设计的输入仅有明文、密钥、时钟和复位,输出为密文,此模型仅用于编写成正确的SM4.0算法。
  首先我在两个always块中分别进行了轮密钥的生成和明文加密,最开始所需要用的两个线性变换我都编写了function,想在always里直接调用函数进行运算,但在调整逻辑后仿真失败,难究问题所在,于是我摒弃了函数的方式,且函数较为简单我就直接在always里进行运算,这两个模块都较为容易的的实现了。然后又在第三个always块里建立了一个计数器,用于32轮轮密钥和密文的计算。对于三个常参数矩阵的初始化,这是三个二维数组,我建立了第四个always块,在其中逐个地址位赋参数,初步完成四个always块完成了SM4.0算法的设计。
  在正确完成了算法加密计算后,我又添加了两个输入,分别为输入密钥的有效和输入明文的有效,只有是有效信号时才读入进行计算。并添加了一个状态输出,在没有进行加密时标志位高电平,而在计算过程中输出为低电平。到此,完成了SM4.0基本模块的全部设计。
  SM4.0基本模块框图如下:
SM4.0基本模块框图

APB_slave协处理器

  本部分是用来设计一个可以用来兼容APB总线的SM4加密协处理器,用来将SM4.0加密模块与APB总线进行对接,使总线发送来的数据可以正常写入并进行加密后并由总线读取。具体可参考之前博客APB总线部分,本文也会给出适用于SM4.0的总线代码。
  为了满足apb总线的输入,因此要将apb_slave的输入和输出设置成与总线一致,因此在输入端设置了PSELx(用于在通讯时选择从设备)、PENABLE(APB使能信号,用来指示一次APB传输的第二个时钟周期)、PCLK(APB总线时钟信号,上升沿有效)、PRESETN(APB总线复位信号,低电平有效)、PWRITE(APB写指令信号,高电平为写,低电平为读)、PADDR(APB总线读写地址,最高为32位)、PWDATA(APB总线写数据,最高为32位),SM4_DATA(SM4加密后数据输入端,用来将数据存储起来,以便在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加密正确。
  当新值输入后,但没有输入有效信号读入,即不是想要的加密信号,加密模块不进入加密过程,输出不变无新值。
Modelsim测试波形图

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,此时地址变为下一个地址,随机进行下一轮数据传输。
128位明文的波形图
128位密钥的波形图
  下图为协处理器读出加密后的密文的波形图,可以看出来在地址有效时,同时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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能养殖解决方案:如何利用485转WiFi无线路由

随着科技的发展&#xff0c;智能养殖已经成为了一种新兴的生产方式。智能养殖不仅可以提高养殖效率和质量&#xff0c;还可以减少资源浪费和环境污染。其中&#xff0c;485转WiFi无线路由器作为智能养殖解决方案中的重要组成部分&#xff0c;发挥着关键的作用。以下将从三个方面…

多维时序 | MATLAB实现BiTCN-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现BiTCN-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现BiTCN-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | MATLAB实现BiTCN-Multihea…

IP子网划分【专题突破】

1、IP地址基础 IPv4地址是32位&#xff0c;采用点分十进制方式表示&#xff0c;其次必须掌握二进制的转换。 IPv6地址是128位&#xff0c;采用冒号分隔的十六进制表示方法。 2、IP地址的分类 RFC1918规定的私有地址 A类地址范围&#xff1a;10.0.0.0-10.255.255.255(1个A类…

EasyExcel使用: RGB字体,RGB背景颜色,fillForegroundColor颜色对照表

EasyExcel使用: RGB字体&#xff0c;RGB背景颜色&#xff0c;fillForegroundColor颜色对照表 使用EasyExcel导出表格可能会对字体颜色和单元格背景颜色进行自定义的修改。 可以自定义字体颜色或者每个单元格的颜色 要想自定义颜色&#xff0c;需要重写CellWriteHandler接口&am…

java使用websocket搭建客户端和服务端

maven <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.5.4</version> </dependency>客户端 package demo.wsdemo;import java.net.URI; import java.net.URISyntaxE…

CAS为什么还存在线程安全问题(从所谓的ABA问题再学CAS)

概述 之前学习 CAS&#xff0c;从 Java 代码层面知道其原理&#xff0c;借助一条 CPU 原子指令&#xff0c;通过不断地自旋去比较&#xff08;compare&#xff09;和&#xff08;and&#xff09;赋值&#xff08;set&#xff09;。当时对线程安全的认知停留在将多条 Java 语句…

171235-71-5介绍TACE (ADAM17) 抑制剂

本文介绍TACE (ADAM17) 抑制剂的生物学特性&#xff0c;其在生物学中的应用&#xff0c;以及其对生物医学领域的影响。我们将深入探讨这种抑制剂的化学结构、作用机制、生物活性的应用。 一、TACE (ADAM17) 抑制剂的概述 TACE (ADAM17)&#xff0c;也被称为整合素相关跨膜蛋白…

数据管理平台Splunk Enterprise本地部署结合内网穿透实现远程访问

文章目录 前言1. 搭建Splunk Enterprise2. windows 安装 cpolar3. 创建Splunk Enterprise公网访问地址4. 远程访问Splunk Enterprise服务5. 固定远程地址 前言 Splunk Enterprise是一个强大的机器数据管理平台&#xff0c;可帮助客户分析和搜索数据&#xff0c;以及可视化数据…

rust为什么是系统编程语言

Rust 被称为系统编程语言&#xff0c;而其他语言可能不被称为系统编程语言&#xff0c;是因为 Rust 在设计上注重提供与底层系统交互和控制的能力&#xff0c;并且在内存管理、并发性和性能等方面具有特定的优势。 以下是一些原因&#xff1a; 1. **内存管理&#xff1a;** R…

骑砍战团MOD开发(23)-呼延灼连环铁骑

骑砍1战团mod开发-呼延灼连环铁骑踏平卡拉迪亚大陆_哔哩哔哩_bilibili 一.铁骑初始化 (0, 0, ti_once, [],[(try_for_agents, ":agent_no"),(agent_get_troop_id, ":agent_troop_id", ":agent_no"),(agent_get_horse, ":agent_horse"…

二维码智慧门牌管理系统升级的重要性与功能

文章目录 前言一、系统的双重作用二、系统的挑战与未来发展三、结论与未来展望四、为未来智慧管理铺平道路 前言 随着科技不断进步&#xff0c;智能化管理已贯穿于我们日常生活的各个领域。其中&#xff0c;二维码智慧门牌管理系统升级解决方案因其独特的考核评估系统和实用功…

qprocess启动的窗口,不关再点击主窗口会无响问题(1)

start启动的 if (link.contains(".exe")) { QString program "cmd.exe"; QStringList arguments; arguments << "/c" << "start" << link; process.star…

基于红外传感的野外变压站生物入侵检测系统(论文+源码)

1. 系统设计 本课题为基于红外传感的野外变压站生物入侵检测系统&#xff0c;主要是针对野外变压站生物入侵的问题进行设计&#xff0c;整个系统的框图如图经过上述的功能需求分析和各个关键模块的选型后&#xff0c;最终得到了如图2.1所示的&#xff0c;采用STC89C52单片机为…

移动安全APP--Frida+模拟器,模拟器+burp联动

最近测APP被通报了&#xff0c;问题点测得比较深&#xff0c;涉及到frida和burp抓包&#xff0c;一般在公司可能会有网络的限制&#xff0c;手机没办法抓包&#xff0c;我就直接在模拟器上试了&#xff0c;就在这记录一下安装过程。 目录 一、Frida安装 二、burp与逍遥模拟器…

外卖系统海外版:技术智能引领全球美食新潮流

随着全球数字化浪潮的推动&#xff0c;外卖系统海外版不仅是食客们品味美食的便捷通道&#xff0c;更是技术智能在美食领域的引领者。本文将深入剖析其背后的技术实现&#xff0c;揭开代码带来的美食革新。 多语言支持&#xff1a;构建全球美食沟通桥梁 def multilingual_su…

Liunx服务器查看程序的日志命令

一些常用 在Linux系统中&#xff0c;你可以使用一些常见的命令来查看Spring Boot应用的日志文件。通常&#xff0c;Spring Boot应用的日志文件位于应用的工作目录下的logs文件夹中&#xff0c;文件名通常是类似于spring.log的形式。以下是一些常见的日志查看命令&#xff1a; …

获取本机公网内网 ip 地址

获取公网地址 winr 输入 cmd 打开终端 获取公网地址命令 curl http://icanhazip.com # 或者 curl http://ifconfig.me在线工具网址 获取内网 ip ipconfig

WebGL开发虚拟旅游应用

WebGL可以用于开发虚拟旅游应用&#xff0c;提供用户在浏览器中探索虚拟景点和环境的交互体验。以下是在WebGL中开发虚拟旅游应用的一般流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.需求分析…

B040-SpringMVC进阶 JSON 上传下载 拦截器 执行流程

目录 项目准备JSONJSON作用JSON演示ResponseBody注解日期返回json格式 文件上传与下载文件上传准备工作文件项上传文件完成 文件下载文件下载页面下载业务代码 SpringMVC的执行流程 项目准备 大体步骤&#xff1a; 新建dynamic web project&#xff0c; 修改默认输出的class路…

​ SK Ecoplant借助亚马逊云科技,海外服务器为环保事业注入新活力

在当今全球面临着资源紧缺和环境挑战的大背景下&#xff0c;数字技术所依赖的海外服务器正成为加速循环经济转型的关键利器。然而&#xff0c;很多企业在整合数字技术到运营中仍然面临着一系列挑战&#xff0c;依然存在低效流程导致的不必要浪费。针对这一问题&#xff0c;SK E…