Verilog开源项目——百兆以太网交换机(二)AES加解密模块设计

news/2024/7/10 19:25:42 标签: 开源, 网络, 服务器, fpga开发

Verilog开源项目——百兆以太网交换机(二)AES加解密模块设计


🔈声明:未经作者允许,禁止转载
😃博主主页:王_嘻嘻的CSDN主页
🔑全新原创以太网交换机项目,Blog内容将聚焦整体架构、模块设计方面;更新周期可能会略慢,希望朋友们多多包涵
🧡关注本专题的朋友们可以学习到原创交换机设计的全流程,包括设计与验证(FPGA)。
🚩第一代交换机  从零开始 verilog 以太网交换机系列专栏:点击这里
💥第二代交换机  Atom(百兆以太网交换机)专利:点击这里

  在Atom的MAC中和第一代设计有所不同的是,Atom将实现数据包的加解密,支持AES和SM2两种加解密算法。本章重在介绍AES在Atom中的实现方案,就不介绍AES算法原理了。

  虽然暂时做不到MACSEC IP那样专业化的方案,但是Atom的SEC还是会尽可能向实用化靠拢。



一、AES Feature

  • 支持128-bits192-bits256-bits密钥长度加解密;
  • 每个MAC的RMAC和TMAC密钥可配置;(不支持MACSEC)
  • 支持ECBCBC两种工作模式;
  • 256-bits密钥长度模式下,32 cycle内至少完成一次128-bits数据的加解密;
  • CBC模式下初始向量可配置也可以自动生成(后续支持
  • 电路最高主频达250MHz(为后续扩展支持2Gbps或更高转发速率);


二、AES概述

  因为Atom定位于百兆交换速率,所以MAC中仍采用MII接口,clk频率为25MHz,数据位宽为4-bits,MAC上游数据位宽为8-bits,所以MAC以12.5MHz频率处理发送数据,就能满足MII时序要求。

  以TMAC为例,TMC将与上游模块PM以256-bits数据位宽进行数据收发,256=32*8-bits,即一个时钟周期内PM下发的数据,足够MII发送32个时钟,为了满足MII接口以最大速率发送,AES模块需要在32 cycle内完成一次256-bits的加解密,否则数据转发速率将受限。同理,如果后续转发速率提升至1G,AES主频需要达到125MHz。为留出足够裕量能进一步提升速度,将直接以250MHz为目标进行设计。

  另一方面,从一次加解密的时钟周期开销分析,AES操作基础为SBox转换、行移位、列混淆、密钥变换,统一将这些操作执行一次称做一轮子操作。对于密钥长度为128、192、256-bits而言,分别需要完成10、12、14轮操作,为保证14轮操作也能在32 cycle内完成,所以需要限制每轮操作在2 cycle内。

            请添加图片描述

  AES核心模块为:密钥扩展、轮密钥加、S盒替换、行移位、列混合。不论是ECB或BCB工作模式,计算过程类似,只是两次明文子块间是否有依赖关系。

  在实现上将S盒替换、行移位进行合并,成为一个操作,并和轮密钥加一起在一个时钟内完成列混合独立消耗一个时钟,而密钥扩展考虑到解密时需要首先用到最后一轮的子密钥,所以根据最终timing,将在2个clk内完成全部扩展

  如下图所示,计算过程中128-bits明文/密文按Byte为单位切分为16个单元,组成矩阵形式参与全程计算,密钥也是同样方式转换。

在这里插入图片描述

  • Key Add(轮密钥加):将明文块与密钥进行异或;
  • SBox(S盒替换):SBox本质上是在复合域实现乘法逆,具体原理就不介绍了,在Atom中为了追求性能,先直接采用查表的方式,且全部用寄存器堆搭建,实现全并行查找(如果后续timing有较大裕量,可以采用更节约面积的做法)
  • Line Shifter(行移位):按下图移位方式实现即可,具体实现中,可以讲SBox与Line Shifter合并为一步,例如S0’代表S0进行SBox替换后的结果。

在这里插入图片描述

  • Col Mixer(列混合):列混合是状态矩阵与常数矩阵相乘的过程,由于其中一个是常数矩阵,所以计算过程相对简单,由于我们追求较高的主频,所以每个元素都采用并行的方式计算。
    在这里插入图片描述

解密中的列混合逆变换,就是将求逆后的常数矩阵与状态矩阵相乘,计算方式一致,可以采用模块复用,具体的常数矩阵如下。

在这里插入图片描述

  • Key Extend(密钥扩展):当分组长度和密钥长度都是128位时,AES的加密算法共迭代10轮,需要10个子密钥,AES的密钥扩展的目的是将输入的128位密钥扩展成11个128位的子密钥。以字为一个基本单位(4B),刚好是密钥矩阵一列。


三、AES接口

在这里插入图片描述


若有不专业或错误之处,欢迎指正!


搜索关注我的微信公众号【IC墨鱼仔】,获取我的更多IC干货分享!


http://www.niftyadmin.cn/n/5047616.html

相关文章

华为NFC设置教程(门禁卡/公交卡/校园卡等)

今天把华为NFC设置教程分享给大家 出门带门禁卡、校园卡、银行卡、身份证……东西又多,携带又麻烦,还容易搞丢,有没有一种方法可以把它们都装下?有!只要一部手机,出门不带卡包,各种证件&#x…

unity 桌面程序

using System; using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; using UnityEngine; public class chuantou : MonoBehaviour { [DllImport(“user32.dll”)] public static extern int MessageBox(IntPtr hwnd,string t…

SpringBoot MyBatisPlus Oracle

官网 官⽹&#xff1a; https://mybatis.plus/ 或 https://mp.baomidou.com/ pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-in…

【送面试题】Java线程池及其构造函数参数的含义

AI绘画关于SD,MJ,GPT,SDXL百科全书 面试题分享点我直达 2023Python面试题 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java、python面试题 项目实战:AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI…

git 本地分支基础操作

&#xff08;1&#xff09;建立分支 a:基于某个commit建立分支 然后切换 git branch test_branch 6435675ad32c035ed4d9cb6c351de5cbaecddd99 git checkout test_branchb: git checkout 建立分支然后切换 git checkout -b checkout_branchc:分支建立 然后切换 git branch …

Minecraft 1.20.x Forge模组开发 06.建筑生成

我们本次尝试在主世界生成一个自定义的建筑。 效果展示 效果展示 效果展示 由于版本更新缘故,1.20的建筑生成将不涉及任何Java包的代码编写,只需要在数据包中对建筑生成进行自定义。 1.首先我们要使用游戏中的结构方块制作一个建筑,结构方块使用教程参考1.16.5自定义建筑生…

day45 数据库总结

一、加密算法 md5(str) 最经典&#xff0c;做常用的加密方式 1. 创建数据表usercreate table user(id int primary key auto_increment,name varchar(30),password varchar(50)); 2. 在user中插入数据insert into user values(null,兰博文,358972);insert into user values(nul…

C#__简单使用TCP/UDP发送消息

Socket(套接字、插口) TCP和UCP的区别&#xff1a; 1、基于连接和无连接 2、对系统资源的要求&#xff08;TCP较多&#xff0c;UCP少&#xff09; 3、UDP程序结构简单 4、流模式和数据报模式 5、TCP保证数据正确性和数据先后顺…