总体结构设计
总体设计方案
整体模块按功能可分为加密部分和解密部分,通过输入端口mode进行选择。实际功能模块有,加密解密共用的密钥异或模块Xorkey,S盒替换模块Dsbox、Inv_sbox,行变换模块Row_trans,列混合模块Col_trans以及密钥扩展模块Key8bit。由于解密部分与加密的执行顺序不同以及解密部分密钥扩展的特殊性,针对解密部分还有时序调整 Time_adjust、Inv_comb模块,密钥存储模块Keysave,以及一片用于存储输入数据的FIFO。整体由Control模块控制。
对于加密,Xorkey模块将输入的数据进行异或,Dsbox由rom实现,行变换Row_trans模块输出地址至ram,Col_trans从ram中读取数据并进行相应的运算,密钥扩展与以上模块并行处理,一轮耗时22个时钟,从数据输入到输出完毕共用231个时钟,速率为27.7Mbps,资源消耗476LE。
对于解密,先算完十轮密钥扩展,并存至ram中,再进行类似加密的轮变换,只是密钥异或模块的密钥需从ram中取得。十轮密钥扩展完毕并存储花费227个时钟,十轮异或运算花费226个时钟,速率为14.1Mbps,资源消耗在600左右。(写解密的时候直接在加密模块上进行的逻辑修改,没有单独的数据,从后期结果推算的大致结果)。整体消耗805LES,RTL schematic图如下:
总体设计框图
总体设计框图如下:
其中part of decryption是指与解密与加密不同的部分,包括对扩展密钥的存储、用于输入数据的FIFO以及部分时序调整。控制模块Control用于加密和解密的切换。
下面分别从加密和解密两个部分进行子模块和结构的描述。
加密各部分结构设计
加密部分整体概述
加密部分算法流程图如下:
针对该加密算法,设计的模块及功能如下:
Xorkey:与扩展密钥进行异或运算
Dsbox:S盒变换
Row_trans:行变换
Col_trans:列变换
Key8bit:密钥扩展模块
下面一一进行阐述。
密钥异或模块Xorkey设计
密钥异或模块将输入的8bit明文和密钥进行异或,由输入使能enain控制,enaout为输出使能,消耗9个LE。
S盒变换模块Dsbox设计
Dsbox使用了双口rom,一方面用于变换Xorkey的输出数据,一方面用于密钥扩展时最后一列的S盒变换。
行变换模块Row_trans的设计
DSbox模块出输出数据通往ram,同时Row_trans模块接受到使能信号后,按照一定的规律向ram输入写入的数据地址,消耗20个LE。
Row_trans结构框图如下所示:
如上所示,使能信号为高时,计数器counter从0记到15,计算地址部分根据mode的不同输出相应的地址。Wren是ram的写使能信号,col_st是加密部分中通往列变换模块的使能信号。Addrout是通往ram的写地址,由于采用了乒乓操作,位宽为5。
列变换模块Col_trans的设计
加密和解密的列变换算法不同,在轮变换中的顺序也不同,解密稍复杂一些。在加密功能中,col_trans接收到col_st为高后,从ram中按顺序读出数据,采用并行计算的方法,读入一个数据进行4次计算,读入4个数据后可开始输出结果。由于列变换中使用的第4个数据是行变换之前的最后一个数据,因此在行变换开始后的12个时钟,列变换模块才能开始从ram中读取数据,又经过4个时钟后才能输出,故该模块需要16个时钟。加密加上解密的列变换一共消耗321个LE。
解密部分结构设计
加密部分总体概述
加密部分算法如下:
解密部分与加密部分大体一致,故而Xorkey、key8bit、用于行变换的dpram,用于key8bit的sbox是通用的,row_trans和col_trans进行了部分改变。同时,考虑到解密部分的密钥异或模块使用的密钥与密钥扩展运算顺序相反,即第一次密钥异或模块使用的密钥是密钥扩展第十轮的结果,第二次则为第九轮结果……故采取先算出十轮密钥扩展结果并进行存储,轮变换时再进行读取并运算的方法。
解密部分用于密钥扩展有Simreq, Time_adjust与Keysave模块,存储输入数据使用了一片FIFO,逆Sbox运算使用Inv_sbox模块,同时增加了用于调整运算顺序的Inv_comb模块。
解密部分的所有模块如下:
Inv_storekey:用于存输入数据的FIFO
Simkeyreq:模拟keyreq变化
Key8bit:密钥扩展模块(与加密共用)
Sbox用于密钥扩展部分(共用)
Time_adjust:密钥读写地址控制
Keysave:用于存扩展秘钥的ram
Xorkey:密钥异或模块(共用)
Inv_sbox:逆S盒变换
Row_trans:行变换(部分共用)
Dpram:用于行变换的ram(共用)
Col_tran:列变换(部分共用)
Inv_comb:解密运算顺序调整
下面重点阐述解密与加密不同的模块。
解密部分密钥扩展结构
由于key8bit消耗资源比较多,故解密部分需要充分利用key8bit模块。考虑到key8bit的使能输入是keyreq,持续16个周期的高电平,key8bit会算完一轮扩展密钥,故解密部分通过Simkeyreq模块模拟keyreq的变换控制key8bit进行十轮运算,Time_adjust模块用于输出相应的写地址至ram(keysave)中,同时也输出相应的写使能。Simkeyreq模块结构如下:
其中enain是用户的输入信号,cycle_cnt是来自key8bit的密钥扩展次数。Simkeyreq耗用17LE。 Time_adjust模块结构如下:
keyreq是来自Simkeyreq的信号,用于计算密钥扩展输出时的写地址与写使能信号wren,keyreqaddr是来自轮变换的取密钥信号,keyreqaddr为高时模块计算通往ram的读地址rd_addr。Inv_cyclecnt是轮变换的次数,用于计算rd_addr。Time_adjust耗用26个LE。 Keysave模块是一个准双口ram,用于存储扩展后的密钥。下图是Simkeyreq、keysave和Time_adjust模块连接示意图
密钥扩展花费226个时钟,写代码的时候这里没注意还能不能进行时间上的优化,之后会进一步考虑。
运算控制Inv_comb模块设计结构
由于解密部分与加密部分的运算顺序的不同,故设计一个Inv_comb模块进行密钥异或,行变换、列变换之间的调控以及轮变换进行次数的计算。
enain是行变换的输出使能,Rd_addr是通往行变换ram的读地址,enaout是通往Xorkey的输入使能,keyreqaddr是通往Time_adjust的扩展密钥读使能信号,Inv_cyclecnt是轮变换运算次数的输出。该模块消耗45个LE。写到这里发现该模块的rd_addr与列变化模块有重复之处,应该可以继续优化。
AES加密解密模块实现结果
按照本文所设计的结构,分别采用Altera公司的CycloneIV和Xilinx公司的Spartan6 xc6slx9FPGA进行综合,得到结果如下。
作者:Hu_Yang_BUAA
来源:CSDN
原文:https://blog.csdn.net/Hu_Yang_BUAA/article/details/52390389
版权声明:本文为博主原创文章,转载请附上博文链接!
作者:Hu_Yang_BUAA
来源:CSDN
原文:https://blog.csdn.net/hu_yang_buaa/article/details/52214852
版权声明:本文为博主原创文章,转载请附上博文链接!
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC
语法后生成一个完美的目录。
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' |
‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" |
“Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash |
– is en-dash, — is em-dash |
一个具有注脚的文本。2
Markdown将文本转换为 HTML。
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::
这将产生一个流程图。:
我们依旧会支持flowchart的流程图:
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
mermaid语法说明 ↩︎
注脚的解释 ↩︎