本文转载自:OpenFPGA
AES CryptoCores 是一个专用硬件模块,用于使用密钥加密和解密数据。
介绍
NIST(US NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY,美国国家标准与技术研究所)呼吁制定新的高级加密标准(Advanced Encryption Standard,AES)。该算法的选择过程向社区开放,所有 AES 提交均必须满足以下要求:
. 块大小为 128 位的块密码
. 必须支持三种密钥长度:128、192 和 256 位
. 安全
. 软件和硬件的效率
NIST 宣布分组密码 Rijndael 为新的 AES,并于 2001 年将其作为最终标准发布。
AES 是一种对称密钥分组密码,是一种迭代密码,意味着机器人解密和加密过程由同一基本函数的多次迭代组成。
在每一轮迭代中,根据轮次索引生成不同的密钥。轮数取决于密钥的大小。对于本项目,由于密钥长度为 128 位,因此迭代轮数等于 10。
输入可以表示为字节矩形数组,有四行。列数等于块长度除以 32。类似地,密钥被映射到二维密码密钥。
算法的高级描述
轮转换有四个步骤,称为:SubBytes、ShiftRows、MixColumn 和 AddRoundKey,但最后一轮 MixColumns 步骤被删除。AES 需要所有转换的反转版本才能解密。这些逆变换称为:InvSubBytes、InvShiftRows、InvMixColumns 和 InvAddRoundKey。国外大学生都用FPGA做什么项目(二)
结构如图所示。
各层的简短描述
Key Addition Layer由 128 位轮密钥或子密钥组成,它源自主密钥调度,并与状态进行异或运算。
Byte Substitution layer (S-BOX) 显示状态的每个元素都是使用具有特殊数学属性的查找表进行非线性变换。这样就给数据带来了混乱。
扩散层由两个子层组成,两个子层执行线性操作:ShiftRows 和 MixColumn。
AES的内部结构
BYTE SUBSTITUTION LAYER
此操作使用 S-Box 转换内部状态的各个字节。S-Box 是一个具有 8 个输入和输出位的块。S-Box替换是一种双射映射,256个可能的输入元素中的每一个都一对一映射到一个输出元素。这使我们能够唯一地逆向解密所需的 S-Box。为了测试硬件设计,S-box 被设计为 256×8 位查找表。
S-Box的定义分两步:
. GF(2^8) 中的逆: a * a^(-1) = 1 (乘法完成模不可约多项式 P(x) = x^8 + x^4 + x^3 + x + 1。
. 仿射变换定义为:
MIXCOLUMN 和 INVMIXCOLUMN 层
该层提供扩散,因此简单地修改一个字节中的一位必然会影响其他字节的计算。ShiftRows 和 MixColumn 层的组合使得仅经过三轮后状态矩阵的每个字节依赖于所有 16 个明文字节。
SHIFTROWS层
ShiftRows 变换循环地将状态矩阵的第二行向右移动 3 个字节,将第三行向右移动 2 个字节,将第四行向右移动 1 个字节。该层中的第一行没有改变。
AddRounds 层
密钥添加层由当前轮的数据和生成的内部密钥之间的简单异或运算组成。XOR运算相当于Galois GF(2)中的加法。
参考
https://www.hackster.io/alexmhiolaru96/aes-cryptocore-b291e8
https://docs.aiitoj.cn/crypto/blockcipher/aes/
IP地址
https://github.com/suisuisi/Xilinx_Library/tree/main/HDL/AesCryptoCore_1.0
测试工程
https://github.com/suisuisi/Xilinx_Library/tree/main/HDL/AesCryptoCore_1...