SIMON 32/64加密电路的实现(System Verilog)

关于SIMON加密电路的原理,参考之前发布的博文【SIMON加密算法的原理】

1.总览与电路介绍

1.1 电路总体结构图

在这里插入图片描述

1.2 模式配置介绍

SIMON加密算法的分组长度、密钥长度以及必要的参数配置如下图:
在这里插入图片描述
本次需要实现的是SIMON 32/64,即分组长度2n=32,密钥长度mn=64,需要进行32轮加密。

2.电路内部模块及代码实现

2.1 移位模块

SIMON加密电路频繁涉及到移位的相关操作,包括循环左移和循环右移,因此单独设计一个模块专门进行移位操作是十分必要的。
首先回顾一下移位操作:>>>(算术右移)>>(逻辑右移)

  • 逻辑右移:>>,不考虑符号位,右移一位,左边补零即可;
  • 算术右移:>>>,需要考虑符号位,右移一位,若符号位为1,就在左边补1,;否则,就补0。

2.1.1 循环移位的原理

假设位的数据a需要循环右移n位,我们可以根据下面的流程来实现循环移位:

  1. 将a逻辑右移n位得到b
  2. 将a逻辑左移(m-n)位得到c
  3. 将b与c按位相或得到循环右移n位的结果d
    d即为所要的移位结果

用代码表示,即为:

temp = (shift_in >> shift_amount) | (shift_in << (WIDTH - shift_amount));//向右循环移位

下图是一个实例,我们要将16位二进制数a=16’b1011101011110000进行循环右移7位,bcd三个数对应上述的流程,1~7对应7次一位循环右移,可以看到,第七次循环右移的结果与d的值完全一致。
在这里插入图片描述

2.1.2 移位模块的实现

从而,我们能够编写出移位模块的代码,如下:

module shifter #(
  parameter WIDTH = 16                            //定义字长,即2n中的n,SIMON32/64即字长为16
)  
(
  input logic [WIDTH-1:0] shift_in,               //需要移位的字
  input logic direction,                          //移位的方向,如果是1则往右移,如果是0往左移
  input logic [($clog2(WIDTH))-1:0] shift_amount, 
  //移位的位数,由于移位位数的位宽并不固定,需要使用系统函数$clog2动态调整位宽以避免失效
  //$clog2是Verilog--2005标准新增的一个系统函数,功能就是对输入整数实现以2为底取对数,其结果向上取整(如5.5取6)。
  output logic [WIDTH-1:0] shift_out              //完成移位的字
);
  
  logic [WIDTH-1:0] temp ;                        //via中间变量
  
  always_comb begin
    if (direction == 1'b1)                        //direction=1,向右循环移位
      temp = (shift_in >> shift_amount) | (shift_in << (WIDTH - shift_amount));
    else                                          //direction=0,向左循环移位
      temp = (shift_in << shift_amount) | (shift_in >> (WIDTH - shift_amount));
  end
  
  assign shift_out = temp;

endmodule

注意,为了代码的可复用性,使用到了系统函数$clog2,其功能是动态调整位宽以避免失效,有一篇博文比较详细描述了$clog2,如果想要了解更多,请【点此前往查看该博文】

2.2 轮函数运算模块

轮函数运算模块结构图如下:
在这里插入图片描述
一次轮函数运算的流程为:

  1. 对2n位输入分组长度的数据分成高n位XL和低n位XR
  2. XL循环左移1位和循环左移8位的数据进行按位与
  3. 2中得到的数据和XR进行异或
  4. XL循环左移2位,然后与3中得到的数据进行异或
  5. 4中得到的数据与相应轮密钥进行异或
  6. 5中得到的数据对原XL进行更新,原XL数据直接覆盖原XR数据

2.2.1 轮函数运算公式

重复上述1-6的操作直至达到1.2节表中规定的轮数R,即完成1次加密,相应的公式表达如下:
R k ( x , y ) = ( y ⨁ ( S x & S 8 x ) ⨁ S 2 x ⨁ k , x ) R_k(x,y)=(y\bigoplus(Sx\&S^8x)\bigoplus S^2x\bigoplus k,x) Rk(x,y)=(y(Sx&S8x)S2xk,x)

其中: x x x(或 x i + 1 x_{i+1} xi+1)是高 n n n X L XL XL y y y(或 x i x_i xi)是低 n n n X R XR XR
R k R_k Rk是轮函数; S i x S^ix Six表示 x x x循环左移 i i i位; k k k为密钥

2.2.2 轮函数运算模块的实现

首先,我们需要根据需要,调用2.1节的移位模块,计算移位得到的数据,然后根据公式计算出结果,并将结果分别赋给x和y用作下一轮的轮函数运算,相应代码如下:

module round (
  input logic clk, reset,                                   //时钟和复位信号
  input logic [15:0] x_in, y_in, key_in,                    
  //x_in和y_in是拆成左右两个字的明文,或中间状态,key_in是密钥
  output logic [15:0] x_out, y_out                          //x_out和y_out是经过本轮加密的密文
);
  
  logic [15:0] S1_sig, S2_sig, S8_sig;
  logic [15:0] x_temp, y_temp;
    
  shifter #(16) S1 (x_in, 1'b0, 4'd1, S1_sig);              
  //调用shifter移位模块,dirt=0表示左移,mount=1表示移动一位,即循环左移一位,结果存入S1
  shifter #(16) S2 (x_in, 1'b0, 4'd8, S8_sig);              //同理
  shifter #(16) S3 (x_in, 1'b0, 4'd2, S2_sig);
  
  always_ff @(posedge clk) begin
	  if (reset) begin                                        //复位操作
		x_temp <= 16'h00;
		y_temp <= 16'h00;
	  end
	  else begin
		x_temp <= (S1_sig & S8_sig) ^ y_in ^ S2_sig ^ key_in;   
		//对y_in进行运算后赋值给x,当作下一轮的x_in
		y_temp <= x_in;                                         
		//将x_in的值赋给y,当作下一轮的y_in
	  end
  end
  
  assign x_out = x_temp;
  assign y_out = y_temp;
  
endmodule

2.3 密钥调度模块

对特定的 SIMON 2n/mn,密钥调度的方法取决于 m 的取值,m 的 3 种取值对应的具体密钥调度方法有所区别。将输入初始密钥等分为m组,有:

当m=2或3 时

  1. 对最高n 位循环右移3 位后与低 n 位进行异或得到中间值
  2. 同时在循环右移3 位的基础上再右移 1 位与上述中间值再次异或
  3. 最终异或上轮常数的第i位后再异或常量M,并更新密钥寄存器的最高 n 位
  4. 各组密钥寄存器分别由上一组密钥寄存器的值进行覆盖更新。

当m=4时有所不同。

2.3.1 密钥生成公式

根据前面的介绍,可以得到密钥生成公式如下:
k i + m = { c i ⨁ k i S − 3 ( k i + 1 ) ⊕ S − 4 ( k i + 1 ) , m = 2 ; c i ⨁ k i S − 3 ( k i + 2 ) ⊕ S − 4 ( k i + 2 ) , m = 3 ; c i ⨁ k i ⨁ k i + 1 ⊕ S − 1 ( k i + 1 ) ⊕ S − 3 ( k i + 1 ) ⊕ S − 4 ( k i + 1 ) , m = 4 k_{i+m}=\begin{cases}c_i\bigoplus k_iS^{-3}\left(k_{i+1}\right)\oplus S^{-4}\left(k_{i+1}\right),m=2;\\c_i\bigoplus k_iS^{-3}\left(k_{i+2}\right)\oplus S^{-4}\left(k_{i+2}\right),m=3;\\c_i\bigoplus k_i\bigoplus k_{i+1}\oplus S^{-1}\left(k_{i+1}\right)\oplus\\S^{-3}\left(k_{i+1}\right)\oplus S^{-4}\left(k_{i+1}\right),\quad m=4\end{cases} ki+m= cikiS3(ki+1)S4(ki+1),m=2;cikiS3(ki+2)S4(ki+2),m=3;cikiki+1S1(ki+1)S3(ki+1)S4(ki+1),m=4
其中: x x x是高 n n n X L XL XL y y y是低 n n n X R XR XR R k R_k Rk是轮函数; S i x S^ix Six表示 x x x循环左移 i i i位; k k k为密钥。

2.3.2

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】B树,B+树,B*树

文章目录 一、B树1.B树的定义2.B树的插入3.B树的中序遍历 二、B树和B*树1.B树的定义2.B树的插入3.B*树的定义4.B树系列总结 三、B树与B树的应用 一、B树 1.B树的定义 1. 在内存中搜索效率高的数据结构有AVL树&#xff0c;红黑树&#xff0c;哈希表等&#xff0c;但这是在内存…

Stable Diffusion 绘画入门教程(webui)-ControlNet(Shuffle)

Shuffle(随机洗牌)&#xff0c;这个预处理器会把参考图的颜色打乱搅拌到一起&#xff0c;然后重新组合的方式重新生成一张图&#xff0c;可以想象出来这是一个整体风格控制的处理器。 那么问题来了&#xff0c;官方为啥会设计个这样的处理器呢&#xff0c;主要是给懒人用的&am…

Atcoder ABC341 E - Alternating String

Alternating String&#xff08;交替字符串&#xff09; 时间限制&#xff1a;3s 内存限制&#xff1a;1024MB 【原题地址】 所有图片源自Atcoder&#xff0c;题目译文源自脚本Atcoder Better! 点击此处跳转至原题 【问题描述】 【输入格式】 每个查询 q u e r y i query…

STM32存储左右互搏 QSPI总线FATS文件读写FLASH W25QXX

STM32存储左右互搏 QSPI总线FATS文件读写FLASH W25QXX FLASH是常用的一种非易失存储单元&#xff0c;W25QXX系列Flash有不同容量的型号&#xff0c;如W25Q64的容量为64Mbit&#xff0c;也就是8MByte。这里介绍STM32CUBEIDE开发平台HAL库Quad SPI总线实现FATS文件操作W25Q各型号…

Vue笔记(一)

常用指令 1.v-show与v-if底层原理的区别 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>创建一个V…

快速搭建宠物医院服务小程序的步骤,无需编程经验

如果你是一家宠物医院或者宠物服务机构&#xff0c;想要拥有一款方便用户预约、查询信息的小程序&#xff0c;那么乔拓云网提供的轻应用小程序是你的不二选择。下面将为你详细介绍如何轻松打造宠物医院服务小程序。 1. 进入乔拓云网后台&#xff0c;点击【轻应用小程序】中的【…

国产服务器操作系统

为何记录 最近的开发工作经常接触到国产服务器操作系统的业务&#xff0c;经常被x86、arm、龙芯、鲲鹏、欧拉...搞得一脸懵逼&#xff0c;遂记之&#xff01; 操作系统 这里按照应用场景分&#xff1a; 桌面操作系统&#xff1a;主要用于pc&#xff0c;如Windows、macOS、Li…

★【递归】【构造二叉树】Leetcode 106.从中序与后序遍历序列构造二叉树

★【递归】【构造二叉树】Leetcode 106.从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树 106.从中序与后序遍历序列构造二叉树:star:思路分析递归解法 105. 从前序与中序遍历序列构造二叉树递归解法 ---------------&#x1f388;&#x1f388;题目链接&a…

大语言模型推理加速技术:计算加速篇

原文&#xff1a;大语言模型推理加速技术&#xff1a;计算加速篇 - 知乎 目录 简介 Transformer和Attention 瓶颈 优化目标 计算加速 计算侧优化 KVCache Kernel优化和算子融合 分布式推理 内存IO优化 Flash Attention Flash Decoding Continuous Batching Page…

嵌入式学习第二十一天!(线程)

线程&#xff1a; 1. 基本概念&#xff1a; 线程&#xff1a;线程是一个轻量级的进程&#xff0c;位于进程空间内部&#xff0c;一个进程中可以创建多个线程 2. 线程创建&#xff1a; 线程独占栈空间&#xff0c;文本段、数据段和堆区与进程共享 3. 线程调度&#xff1a; 与进程…

Tomcat 下部署若依单体应用可观测最佳实践

实现目标 采集指标信息采集链路信息采集日志信息采集 RUM 信息会话重放 即用户访问前端的一系列过程的会话录制信息&#xff0c;包括点击某个按钮、操作界面、停留时间等&#xff0c;有助于客户真是意图、操作复现 版本信息 Tomcat (9.0.81)Springboot(2.6.2)JDK (>8)DDT…

2024年软件测试路线,不同等级应具备的基本能力(总结)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、软件测试的正确…

大数据可视化的设计规范,全面剖析,很实用。

大数据可视化的设计规范需要考虑到数据量大、复杂度高、数据类型多样等特点。以下是一份常见的大数据可视化设计规范&#xff0c;供您参考&#xff1a; 设计原则 简单易用&#xff1a;保证用户操作简单、直观&#xff0c;降低用户认知负担。数据准确&#xff1a;保证数据准确…

数据可视化引领智慧工业新时代

在智慧工业的大潮中&#xff0c;数据可视化崭露头角&#xff0c;以其直观、清晰的方式赋能工业生产&#xff0c;为智慧工业的高效运转提供了强有力的支持。下面我就以可视化从业者的角度&#xff0c;简单聊聊这个话题。 数据可视化首先在智慧工业的生产监控中大显身手。通过将…

4-Bean的循环依赖

Bean的循环依赖 循环依赖指的是依赖闭环的问题 解决 首先我们来实例化A&#xff0c;实例化A时并没有处理依赖注入&#xff0c;因此会得到半成品A。有了半成品A&#xff0c;它会被封装成一个ObjectFactory&#xff0c;并且把它放入第三个缓存区singletonFactories中。 接下来要…

tmux的使用方法

1. tmux的定义 我&#xff1a;什么是tmux&#xff1f; GPT&#xff1a;tmux&#xff08;terminal multiplexer&#xff09;是一个强大的终端复用器&#xff0c;它允许用户在一个终端窗口中创建、访问和控制多个会话。使用tmux&#xff0c;你可以在一个窗口中打开多个终端会话&…

苍穹外卖 -- day11 - Apache ECharts- 营业额统计- 用户统计- 订单统计- 销量排名Top10

苍穹外卖-day11 课程内容 Apache ECharts 营业额统计 用户统计 订单统计 销量排名Top10 功能实现&#xff1a;数据统计 数据统计效果图&#xff1a; 1. Apache ECharts 1.1 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#x…

docker 常用指令(启动,关闭,查看运行状态)

文章目录 docker 常用指令启动 docker关闭 docker查看 docker的运行状态 docker 常用指令 启动 docker systemctl start docker关闭 docker systemctl stop docker查看 docker的运行状态 systemctl status docker如下图所示&#xff1a; 表示docker正在运行中

【Vue】

什么是Vue Vue是一款用于构建用户界面的JavaScript框架&#xff0c;它基于标准HTML、CSS和JavaScript构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助开发者高效地开发用户界面。Vue是一个JS库&#xff0c;无依赖其他JS库&#xff0c;直接引入一个JS文…

数据可视化--了解数据可视化和Excel数据可视化

目录 1.1科学可视化&#xff1a; 可视化是模式、关系、异常 1.2三基色原理&#xff1a; 三基色:红色、绿色和蓝色 1.3Excel数据可视化 1.3.1 excel数据分析-13个图表可视化技巧 1.3.2 excel数据分析-28个常用可视化图表&#xff08;video&#xff09; 1.3.3Excel可视化…