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

news2024/9/29 13:25:02

关于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

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

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

相关文章

【LeetCode每日一题】938. 二叉搜索树的范围和

2024-2-26 文章目录 [938. 二叉搜索树的范围和](https://leetcode.cn/problems/range-sum-of-bst/)思路&#xff1a;写法一&#xff1a;在中间累加写法二&#xff1a;在最后累加 938. 二叉搜索树的范围和 思路&#xff1a; 1.在二叉搜索树中&#xff1a;左子树的结点都小于根节…

LeetCode69. x 的平方根(C++)

LeetCode69. x 的平方根 题目链接代码 题目链接 https://leetcode.cn/problems/sqrtx/description/ 代码 class Solution { public:int mySqrt(int x) {int right x, left 0, ans -1;while(left < right){long long mid left (right - left) / 2;if(mid * mid <…

System V版本的共享内存

在之前的学习中我们学习到了使用匿名和命名管道进行进程间的通信&#xff0c;下面我们再来使用一种新的方式进行进程间的通信。 我们下面要学习的是system V版本的共享内存。 首先我们要知道什么是system V 首先我们要知道我们在之前学习的管道通信的代码并不是一个专门设计…

1995-2021年全国30省能源消费总量(万吨标煤)

1995-2021年全国30省能源消费总量&#xff08;万吨标煤&#xff09; 1、时间&#xff1a;1995-2021年 2、范围&#xff1a;30省市不含西藏 3、来源&#xff1a;能源统计年鉴 各省年鉴 3、指标: 能源消费总量 4、单位&#xff1a;万吨标煤 5、缺失情况&#xff1a;新疆202…

贝叶斯核机器回归拓展R包:bkmrhat

1.摘要 bkmrhat包是用于扩展bkmr包的贝叶斯核机器回归&#xff08;Bayesian Kernel Machine Regression, BKMR&#xff09;分析工具&#xff0c;支持多链推断和诊断。该包利用future, rstan, 和coda包的功能&#xff0c;提供了在贝叶斯半参数广义线性模型下进行identity链接和 …

C# 通过共享内存调用C++ 算法

需求&#xff1a; C#程序调用 C开发的dll. 一种C# 程序调用c 算法方案_算法怎么被c#调用-CSDN博客 上回书说到&#xff0c;将c算法封装为dll 插件&#xff0c;c加载后&#xff0c;暴露C风格接口&#xff0c;然后供C#调用。但是这样有几个问题&#xff1a; 1&#xff0c;一是…

Django后台管理(二)

一、自定义注册管理类介绍 官网:Django 管理站点 | Django 文档 | Django 注册模型除了使用 Django 默认的管理类admin,也可以自定义,比如: class StudentAdmin(admin.ModelAdmin):pass admin.site.register(Student, StudentAdmin)ModelAdmin 类是管理界面中模型的表示。…

Java四大引用详解:强引用、软引用、弱引用、虚引用

在JDK1.2以前的版本中&#xff0c;当一个对象不被任何变量引用&#xff0c;那么程序就无法再使用这个对象。也就是说&#xff0c;只有对象处于可触及状态&#xff0c;程序才能使用它。这就像在商店购买了某样物品后&#xff0c;如果有用就一直保留它&#xff0c;否则就把它扔到…

【深度学习】微调ChatGlm3-6b

1.前言 指令微调ChatGlm3-6b。微调教程在github地址中给出&#xff0c;微调环境是Qwen提供的docker镜像为环境。 镜像获取方式&#xff1a;docker pull qwenllm/qwen:cu117 github地址&#xff1a;https://github.com/liucongg/ChatGLM-Finetuning 2.微调过程 github地址中的教…

网络防御-VPN概述

目录 VPN的概述VPN的分类根据建设的单位不同分类根据组网方式不同分类根据VPN技术实现的层次来进行分类 VPN其他常用技术身份认证技术 --- 身份认证是VPN技术的前提。加解密技术 --- 以此来抵抗网络中的一些被动攻击数据认证技术 --- 验货 --- 保证数据的完整性密钥管理技术 VP…

CS_上线三层跨网段机器(完整过程还原)

以前讲过用cs_smb_beacon上线不出网机器&#xff0c;但是真实的网络拓扑肯定不止这么一层的网络&#xff01; 所以我就来搭建一个复杂一点的网络环境&#xff01;&#xff01; 当然了&#xff0c;这三台电脑之间都是不同的网段&#xff0c;&#xff08;但是同属于一个域环境&a…

C# 学习第二弹

一、变量 存储区&#xff08;内存&#xff09;中的一个存储单元 &#xff08;一&#xff09;变量的声明和初始化 1、声明变量——根据类型分配空间 ①声明变量的方式 —变量类型 变量名 数值&#xff1b; —变量类型 变量名&#xff1b; 变量名 数值&#xff1b; —变…

【Rust】简介、安装和编译

文章目录 一、Rust简介二、Rust 安装三、Rust 程序结构3.1 模块&#xff08;Modules&#xff09;&#xff1a;3.2 函数&#xff08;Functions&#xff09;&#xff1a;3.3 变量&#xff08;Variables&#xff09;&#xff1a;3.4 控制流&#xff08;Control Flow&#xff09;&a…

Coursera吴恩达机器学习专项课程02:Advanced Learning Algorithms 笔记 Week03

Week 03 of Advanced Learning Algorithms 笔者在2022年7月份取得这门课的证书&#xff0c;现在&#xff08;2024年2月25日&#xff09;才想起来将笔记发布到博客上。 Website: https://www.coursera.org/learn/advanced-learning-algorithms?specializationmachine-learnin…

Centos配置SSH并禁止密码登录

CentOS8 配置SSH使用密钥登录并禁止密码登录 一、概念 SSH 为 Secure Shell 的缩写,SSH 为建立在应用层基础上的安全协议。SSH 是较可靠&#xff0c;专为远程登录会话和其他网络服务提供安全性的协议。 SSH提供两个级别的认证&#xff1a; 基于口令的认证 基于密钥的认证 基本使…

SkyWalking微服务链路追踪实战

目录 skywalking是什么&#xff1f; Skywalking主要功能特性 Skywalking整体架构 SkyWalking 环境搭建部署 SkyWalking快速开始 SkyWalking Agent追踪微服务 通过jar包方式接入 在IDEA中使用Skywalking Skywalking跨多个微服务追踪 Skywalking集成日志框架 Skywalki…

【c语言】if 选择语句

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

计网Lesson16 - TCP选择重传和流量控制

文章目录 1. 选择性确认&#xff08;SACK&#xff09;2. TCP流量控制2.1 基本情况2.2 特殊情况 1. 选择性确认&#xff08;SACK&#xff09; TCP通信中&#xff0c;发送序列中的某一包丢失&#xff08;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5 中 3 丢失&#…

Promise 介绍与基本使用 - 学习笔记

Promise 介绍与基本使用 1、 Promise 是什么&#xff1f;2、创建 Promise 实例对象3、Promise 实例方法4、Promise 的基本工作流程5、实例方法6、静态方法7、async 和 await7.1、关键字7.2、实例7.3、区别7.4、为什么使用 async/await 比较好&#xff1f; 1、 Promise 是什么&a…

NUS神经网络生成我感觉解读过于夸大了

网上对其解读有点过了&#xff0c;只是合成了最后标准化层的参数&#xff0c;或者是更多的其他层参数。而不是网络结构。对于新任务下的网络结构以及参数如何生成&#xff0c;应该是做不到的&#xff0c;论文意义有限。 论文片段&#xff1a;我们提出了神经网络扩散&#xff0…