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 beginif (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));endassign 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表示移动一位,即循环左移一位,结果存入S1shifter #(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) beginif (reset) begin                                        //复位操作x_temp <= 16'h00;y_temp <= 16'h00;endelse beginx_temp <= (S1_sig & S8_sig) ^ y_in ^ S2_sig ^ key_in;   //对y_in进行运算后赋值给x,当作下一轮的x_iny_temp <= x_in;                                         //将x_in的值赋给y,当作下一轮的y_inendendassign 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.hqwc.cn/news/493718.html

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

相关文章

影像仪满足0.02㎜~4㎜的筛网检测需求

影像仪具有高精度、高效、全面数据分析和可视化展示的测量优势。通过影像测量技术&#xff0c;可以有效解决筛网检测中的难题&#xff0c;提高工作效率和工作质量&#xff0c;为筛网的使用和管理提供科学依据&#xff0c;推动筛网行业的发展。 筛网检测的难点 1、超细筛网的…

PHP+vue+mysql校园论坛bbs系统w076f-

本文尝试以B/S架构设计模式中的vue框架&#xff0c;php语言为基础&#xff0c;通过必要的编码处理、BBS论坛系统整体框架、功能服务多样化和有效性的高级经验和技术实现方法&#xff0c;旨在完成一个快速、高效、便捷的BBS论坛系统。本系统以用户与管理员两类人&#xff0c;作为…

Redis 服务集群、哨兵、缓存及持久化的实现原理和应用场景

Redis 是一种高性能的键值存储系统&#xff0c;已经成为了许多企业和互联网公司的核心技术之一。本文将介绍 Redis 的服务集群、哨兵以及缓存实现原理和应用场景&#xff0c;以帮助读者更好地理解和使用 Redis。 引言&#xff1a; 随着互联网应用规模不断扩大&#xff0c;Redi…

Datawhale-Sora技术原理分享

目录 Sora能力边界探索 Sora模型训练流程 Sora关键技术拆解 物理引擎的数据进行训练 个人思考与总结 参考 https://datawhaler.feishu.cn/file/KntHbV3QGoEPruxEql2c9lrsnOb

动态规划之第 N 个泰波那契数/三步问题【leetCode】【算法】

动态规划动态规划之第 N 个泰波那契数/三步问题 动态规划LeetCode题目第 N 个泰波那契数求解1求解2&#xff08;滚动数组&#xff09; 三步问题求解1求解2&#xff08;滚动数组&#xff09; 动态规划 如果问题是由重叠的子问题构成的&#xff0c;那就可以用动态规划&#xff08…

限流算法八股笔记

前言&#xff1a;本文是限流算法的八股总结和详解&#xff0c;博主在准备暑期实习&#xff0c;应该会持续更新 参考文章 服务限流详解 5种限流算法&#xff0c;7种限流方式&#xff0c;挡住突发流量&#xff1f; 超详细的Guava RateLimiter限流原理解析 使用Guava实现限流器…

react useRef用法

1&#xff0c;保存变量永远不丢失 import React, { useState,useRef } from react export default function App() { const [count,setcount] useState(0) var mycount useRef(0)//保存变量永远不丢失--useRef用的是闭包原理 return( <div> <button onClick{()>…

SocketError | Socket错误码一览表(每一种错误码的故障排查建议)

Socket错误码一览表 文章目录 Socket错误码一览表前言错误码表 前言 在软件开发和网络通信编程中&#xff0c;SocketError算是一个绕不开的坎。它可能因为各种原因而来&#xff0c;比如网络问题、用户搞错了、应用程序出错等等。本文整理一张SocketError排查建议表格就是为了帮…

蜘蛛蜂优化算法SWO求解不闭合MD-MTSP,可以修改旅行商个数及起点(提供MATLAB代码)

1、蜘蛛蜂优化算法SWO 蜘蛛蜂优化算法&#xff08;Spider wasp optimizer&#xff0c;SWO&#xff09;由Mohamed Abdel-Basset等人于2023年提出&#xff0c;该算法模型雌性蜘蛛蜂的狩猎、筑巢和交配行为&#xff0c;具有搜索速度快&#xff0c;求解精度高的优势。VRPTW&#x…

合泰杯开发板HT66F2390入门教程(点亮LED灯)——获得成就:点灯大师

前言 前不久报名了合泰杯竞赛项目&#xff0c;然后手上也是有一个HT66F2390的开发板&#xff0c;我就打算先从点灯开始&#xff0c;学习一个新的芯片第一步都是先成为点灯大师。 一开始&#xff0c;我在网上搜寻了许多的代码示例&#xff0c;希望能够顺利实现LED的控制。然而&…

基于事件触发机制的孤岛微电网二次电压与频率协同控制MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 本模型质量非常高&#xff0c;运行效果完美。本模型为4机并联孤岛系统&#xff0c;在下垂控制的基础上加入二次控制&#xff0c;二次电压与频率协同控制策略利用事件触发的方法来减少控制器的更新次数。该方法…

C++ //练习 9.16 重写上一题的程序,比较一个list<int>中的元素和一个vector<int>中的元素。

C Primer&#xff08;第5版&#xff09; 练习 9.16 练习 9.16 重写上一题的程序&#xff0c;比较一个list中的元素和一个vector中的元素。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /**********************************…