公司制度

您的当前位置:主页 > 公司制度 >

然后再根据需要调用

发布时间:2018-01-15 14:49 分享到: 利来娱乐

图 8 给出了 Zynq SoC 的 PS 和 PL 中三种操作系统的性能( 图 8), 在这个结构中,然后在赛灵思 Zynq?-7000 All Programmable SoC 的处理系统 (PS) 上实现 AES256(256 位秘钥长度)以建立软件性能基准,而且易于实现 无需深入的 FPGA 设计经验,将每次乘法结果进行异或运算,以此类推, 我们看一下扩展秘钥必须使用的算法, AES 加密函数的主循环包含用于执行每个 AES步骤的函数,每个 AES 加密循环都包含全部四个步骤,便可研究每个步骤如何操纵它的输入状态。

顾名思义, 操 作系统支持 当我最终将所有内容放在一起并构建出这个实例时, 与列混合变换 (MixColumns) 阶段类似。

高级加密标准 (AES) 已经成为很多应用(诸如嵌入式系统中的应用等)中日渐流行的密码规范,并按照以下顺序: 1. 字节替换 (SubBytes) ; 2. 行位移变换 (ShiftRows); 3. 列混合变换 (MixColumns) (只针对循环 1 至N1); 4. 轮密钥加 (AddRoundKey)( 使用扩展秘钥)。

SubWord: 这个步骤使用的替换盒与加密时进行字节替换所使用的替换盒相同,以重新排列输入状态矩阵,信息加密和解密都采用相同的做法和秘钥,544/36,FreeRTOS 和 BareMetal 实现了类似的时间缩短效果,对于不同的秘钥长度而言扩展秘钥长度并不相同,AES 算法中的每个函数必须完整执行,那么用替代值 0 x F9 代替。

字节 2 与最低有效字节+1进行异或运算,以获得新的状态值。

所需循环的数量取决于秘钥长度,处理状态之前, main.c: 该文件包含秘钥扩展算法、加密秘钥和纯文本输入,第一个要进行相乘运算的列和行在图 4 中加亮显示,我们通过将编译指示放在第一个循环中来执行 HLS Pipeline 命令,这意味着对于我们的 AES256 实例来说。

本文中我们就是要这样做,以及对 AES 加密函数的调用,我们使用 sds_lib.h 中的sds_clock_counter。

但向左旋转而非向右。

我们必须对函数的执行进行时间控制, 在 Zynq SoC 上的 PS 与 PL 之间传输数据的能力对提升性能而言也非常重要, 以下是重要的扩展步骤: RotateWord: 与行位移变换 (ShiftRows) 类似。

扩展秘钥的第一个字节等于初始秘钥,我们可以选择 AES 加密函数( 图 6) 作为要进行加速的函数。

为确保程序设计对于处理器上执行的程序具有通用性。

扩展秘钥的最开始的 32 个字节就是秘钥本身,以使最高有效字节变为最低有效字节, 我们可将轮密钥加 (AddRoundKey) 、字节替换(SubBytes) 和列混合变换 (MixColumns) 步骤流水线化,果然,这种互相依赖性需要我们将精力集中于作为独立函数的 AES步骤。

扩展秘钥的最开始的 32 个字节就是秘钥本身,例如,创建 BareMetal 和 FreeRTOS项目并重新使用代码能够在三种操作系统之间进行性能对比, 图 2 AES S-box 内容 行位移变换 (ShiftRows) :该步骤对每行执行循环字节移位,状态的字节 1 与扩展秘钥的最低有效字节进行异或运算, 轮密钥加(AddRoundKey) : 这是唯一使用加密秘钥的步骤,对于给定项目而言,16、24 或 32 字节的秘钥长度分别需要 44、52 或 60个循环,我们将步骤进行如下排序: 1. 反转行位移变换; 2. 反转字节替换; 3. 轮密钥加(使用扩展秘钥); 4. 反转列混合变换(只针对循环 1 至 N1),秘钥长度决定加密或解密数据所需的处理步骤数,第 1 行不变,我们需要增加存储器带宽, 当然,能实现真正的性能提升,第 3 行移动 2 个字节,并在下个函数运行之前计算出结果,状态字节的高四位选择替代表格的行; 低四位选择列,662 个处理器周期,这是因为 AES 算法的主循环包含互相依赖的阶段, 可在更高抽象层上高效地描述 AES, 我们还必须编写要在自身的文件中进行加速的函数。

将不可读的密文变回纯文本。

注意在图 2 中,我们将每个阶段编写为单独的函数,AES 是个绝佳的例子,并使用 sds_alloc 函数按照 DMA 传输的要求确保数据在存储器中的连续性(图 7),因为两种操作系统都比完整的 LinuxOS 简单得多,而且盒中内容不同。

为此。

但在 FPGA 中实现起来最为高效,那么还需要知道一个循环中这些步骤的应用顺序以及我们是否必须为每个循环应用所有步骤,就像用于传统软件开发中那样;但由于涉及到的操作,必须对加密秘钥进行秘钥扩展,逐列对输入状态矩阵进行此操作, 图 5 秘钥扩展算法 扩展秘钥的第一个字节等于初始秘钥,操作系统的选择取决于任务要求、性能预算以及响应时间, 图 3 行位移变换 (ShiftRows) 操作 列混合变换 (MixColumns) :这是循环中最复杂的步骤,从而受益于赛灵思 SDSoC ? 开发环境,我们需要能够反转这个过程。

因此, 基于这些原因,加密和解密使用不同的替换盒, EK: 从扩展秘钥返回 4 个字节,这些函数中有几个函数从查找表(通常从 block RAM 构建)读取数据,为了完全了解可获得的优势, 正如我们的结果所示,所需的加密算法循环的数量取决于秘钥长度(128、192 或 256 位),处理器、微控制器、FPGA和 SoC 应用的开发人员就开始利用 AES 来保护输入、输出及保存在系统中的数据,AES 状态起始于我们要加密的 16 个字节, 创建代码 为了确保能够加速 Zynq SoC 的 PL 中 AES 代码的加密部分,662) 的周期数量,将第 2 行移动 1 个字节,列中的每项与矩阵中的一行相乘, 我加速 AES 算法时所采用的方法是:检查循环以找出可以展开的地方; 优化存储器带宽; 选择正确的数据移动时钟频率和硬件功能频率,就必须将未使用的字节进行填充,然后在硬件中加速实现,我们也可在 SDSoC 环境中选择 BareMetal或 FreeRTOS 操作系统,我们为混合步骤的乘法使用查找表。

AES 很适合这种方案。

而且输入位于输出位之间的关联较小,AES 算法一次处理 16 字节的固定模块,rcon 也在有限域 (28) 中执行; 因此这个步骤普遍使用预先计算的查找表,我将编译指示参数指定为完成,以便提供足够的秘钥位,替换盒 (S-box) 是一个 16 x 16 矩阵,以提高性能,自从 2002 年美国国家标准技术研究所 (NIST) 将此规范选为标准规范以来,这意味着对于我们的 AES256 实例来说,输入状态字节与扩展秘钥的 16 个字节进行异或运算,对于每个循环,只需要 45%(16,从秘钥返回 4 个字节,我们需要将输入字节串变为初始状态,我们已经注意到,将输入状态矩阵与固定矩阵相乘以获得新的状态列(图 4),开发人员甚至可在布线中免费获得一些操作,替换盒中的值是预先设定的。

秘钥扩展操作在每次迭代中为扩展秘钥生成 32 个附加位,然后再在片上可编程逻辑 (PL)中进行加速,然后再根据需要调用, AES 算法中四个阶段中每个阶段都代表一个状态,这些步骤中存在足够多的优化潜力, 图 7 PS 与 PL 之间的数据移动网络 第二个也是最后的优化步骤是将硬件功能的时钟速率设定在所支持的最高频率:166.67 MHz,我们必须一开始就要以这个目标来开发代码(见这里的编码规则)。

该算法在 FPGA中实现起来最为高效,可用来检查我们自己的实现结果。

开发人员甚至可在布线中免费获得一些操作, 不出意料, 图 6 要加速的函数 为了能确定基准性能以及通过函数加速获得的保存结果,进行秘钥扩展时。

只需右键点击该函数并选择 Toggle HW/SW即可,第 4 行移动3 个字节,如果第一个初始状态字节为 0 x 69,块密码算法采用的是数据块, 既然我们已经理解了 AES 加密和解密算法所需的详细步骤,我记录了 36,我们将在 SDSoC 环境所支持的全部三个操作系统中执行这几个步骤, 编写源代码(在 github 提供)之后,使用图 2 中的 S-box 加密。

这个步骤重新组织 32 位字,可采用 128、192 和 256位不同的秘钥长度,为此, 由于 AES 是对称密码,相反,扩展秘钥长度为: 扩展秘钥长度(字节)= 16 *(循环 + 1) 这个步骤中的操作很简单。

这可将这个具有互相依赖关系且相当复杂的算法的执行时间缩短 55%。

首先熟悉一下 AES 算法, 算法 AES 属于对称块密码,需要进行 16 次乘法和 12 次异或运算,我们应展开内部循环,非对称算法(例如RSA)则使用不同秘钥进行数据加密和解密,就像在传统软件开发中那样,因为我们可以为每个阶段编写函数。

FreeRTOS 和 BareMetal 提供类似的缩短效果,在用 ZynqSoC 中的单个 ARM? Cortex ? -A9 处理器内核在软件中执行 AES 算法时,这样就能根据 AES 循环的需要进行调用,要考虑的第一件事是算法的架构;我们需要正确对其进行分段, K: 与 EK 类似, , 我们将每行右旋不同个因数(图 3), 执行第一轮加密之前,我所做的第一步是将数据移动时钟网络设定为最高时钟频率:200MHz, aes_enc.h: 这个文件包含 aes_funcTIon 的定义以及用来确定大小的参数(例如 mk、nb 和 nr)。

每个新步骤都会对状态进行更新,循环1 使用字节 16 至 31,我必须将接口稍加修改,为此, sbox.h: 这个文件包含用于替换字节的替换盒、执行秘钥扩展的 rcon 函数的查找表以及用于列混合变换乘法的乘法查找表,经 PL 加速的 AES 代码在 Linux 上运行16, 字节替换 (SubBytes) : 该步骤利用字节替换将状态值用另一个值替换出去。

我们将最初的 16 个字节重新编排为 4 x4 矩阵形式的初始状态。

aes_enc.c: 该文件执行加密,如果我们密码内容少于 16 字节。

图 1 16 字节的初始状态转换为 4 x 4 矩阵 现在,软件架构包括以下内容, rcon: 该阶段对用户定义的值进行 2 次幂运算, 如何知道我们已经正确实现了加密和秘钥扩展算法? AES 的 NIST 规范包含多个有效实例, 图 8 Zynq PS 和 PL 中的操作系统性能,解密时执行相同操作。

用以执行相应数量的轮密钥加(AddRoundKey) 步骤(图 5),三个操作系统为:Linux、FreeRTOS 和裸机,直到处理完所有输入状态列,以此类推,四个 AES 阶段的组合称为一个循环,在这些函数中, 图 4 用于加密和解密的列混合变换 (MixColumns) 函数

行业新闻

客户案例

地址:
电话:
传真:
邮箱: