微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 如何用C语言描述AES256加密算法最高效?

如何用C语言描述AES256加密算法最高效?

时间:01-23 来源:3721RD 点击:

用C 语言描述AES256 加密算法,然后在硬件中加速性能。

高级加密标准 (AES) 已经成为很多应用(诸如嵌入式系统中的应用等)中日渐流行的密码规范。自从 2002 年美国国家标准技术研究所 (NIST) 将此规范选为标准规范以来,处理器、微控制器、FPGA和 SoC 应用的开发人员就开始利用 AES 来保护输入、输出及保存在系统中的数据。我们可在更高抽象层上非常高效地描述算法,就像用于传统软件开发中那样;但由于涉及到的操作,该算法在 FPGA中实现起来最为高效。开发人员甚至可在布线中"免费"获得一些操作。

基于这些原因,AES 是个绝佳的例子,即开发人员可利用 C 语言描述算法,然后在硬件中加速实现,从而受益于赛灵思 SDSoC ? 开发环境。本文中我们就是要这样做,首先熟悉一下 AES 算法,然后在赛灵思 Zynq?-7000 All Programmable SoC 的处理系统 (PS) 上实现 AES256(256 位秘钥长度)以建立软件性能基准,然后再在片上可编程逻辑 (PL)中进行加速。为了完全了解可获得的优势,我们将在 SDSoC 环境所支持的全部三个操作系统中执行这几个步骤,三个操作系统为:Linux、FreeRTOS 和裸机。

算法
AES 属于对称块密码,可采用 128、192 和 256位不同的秘钥长度。秘钥长度决定加密或解密数据所需的处理步骤数。顾名思义,块密码算法采用的是数据块。AES 算法一次处理 16 字节的固定模块。因此,如果我们密码内容少于 16 字节,就必须将未使用的字节进行填充。

由于 AES 是对称密码,信息加密和解密都采用相同的做法和秘钥。相反,非对称算法(例如RSA)则使用不同秘钥进行数据加密和解密。

AES 算法中四个阶段中每个阶段都代表一个状态。四个 AES 阶段的组合称为一个循环。所需循环的数量取决于秘钥长度。

很简单,AES 状态起始于我们要加密的 16 个字节。每个新步骤都会对状态进行更新。处理状态之前,我们需要将输入字节串变为初始状态,即 4 x 4矩阵(图 1)。

图 1 - 16 字节的初始状态转换为 4 x 4 矩阵

现在,我们将最初的 16 个字节重新编排为 4 x4 矩阵形式的初始状态,便可研究每个步骤如何操纵它的输入状态。

轮密钥加(AddRoundKey) : 这是唯一使用加密秘钥的步骤。我们已经注意到,所需的加密算法循环的数量取决于秘钥长度(128、192 或 256 位)。必须对加密秘钥进行秘钥扩展,以确保在每个循环中不会重新使用秘钥中的字节。果然,对于不同的秘钥长度而言扩展秘钥长度并不相同。扩展秘钥长度为:
扩展秘钥长度(字节)= 16 *(循环 + 1)

这个步骤中的操作很简单。输入状态字节与扩展秘钥的 16 个字节进行异或运算。每个循环使用扩展秘钥的不同部分;循环 0 使用字节 0 至 15,循环1 使用字节 16 至 31,以此类推。对于每个循环,状态的字节 1 与扩展秘钥的最低有效字节进行异或运算,字节 2 与"最低有效字节+1"进行异或运算,以此类推。

字节替换 (SubBytes) : 该步骤利用字节替换将状态值用另一个值替换出去。替换盒中的值是预先设定的,而且输入位于输出位之间的关联较小。替换盒 (S-box) 是一个 16 x 16 矩阵。我们使用被替代字节的高四位和低四位作为替代表格中的索引。例如,使用图 2 中的 S-box 加密,如果第一个初始状态字节为 0 x 69,那么用替代值 0 x F9 代替。状态字节的高四位选择替代表格的行; 低四位选择列。注意在图 2 中,加密和解密使用不同的替换盒,而且盒中内容不同。

图 2 - AES S-box 内容

行位移变换 (ShiftRows) :该步骤对每行执行循环字节移位,以重新排列输入状态矩阵。 我们将每行右旋不同个因数(图 3)。第 1 行不变。将第 2 行移动 1 个字节,第 3 行移动 2 个字节,第 4 行移动3 个字节。解密时执行相同操作,但向左旋转而非向右。

图 3 - 行位移变换 (ShiftRows) 操作

列混合变换 (MixColumns) :这是循环中最复杂的步骤,需要进行 16 次乘法和 12 次异或运算。逐列对输入状态矩阵进行此操作,将输入状态矩阵与固定矩阵相乘以获得新的状态列(图 4)。列中的每项与矩阵中的一行相乘。将每次乘法结果进行异或运算,以获得新的状态值。第一个要进行相乘运算的列和行在图 4 中加亮显示。

图 4 - 用于加密和解密的列混合变换 (MixColumns) 函数

以下是第一列的列混合变换(MixColumns) 方程:
B1’ = (B1 * 2) XOR (B2 * 3) XOR (B3 * 1) XOR (B4 * 1)
B2’ = (B1 * 1) XOR (B2 * 2) XOR (B3 * 3) XOR (B4 * 1)
B3’ = (B1 * 1) XOR (B2 * 1) XOR (B3 * 2) XOR (B4 * 3)
B4’ = (B1 * 3) XOR (B2 * 1) XOR (B3 * 1) XOR (B4 * 2)

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top