c软件查表获得电量代码_AES对称密码算法介绍(2)——查表法软件实现

本文介绍了AES加密算法的查表法软件实现,包括加密和解密过程。查表法通过T-Box融合字节代换、ShiftRows和MixColumn层,简化了伽罗瓦域计算,适用于内存充足的设备。文章提供了Rust语言的示例代码,并讨论了解密过程中的逆向MixColumn操作。此外,还提到了AES在现代硬件中加速实现的常见方式和安全性考虑。
摘要由CSDN通过智能技术生成

现在,AES在软件层面和硬件层面都已经有了很多种实现方式。本文将介绍由Rijndael的设计者提议的一种快速软件实现——查表法。(由于硬件实现的内容较复杂,本文不会涉及,如果有兴趣的可自行查找相关资料。)

查表法的核心思想是将字节代换层、ShiftRows层和MixColumn层融合为查找表:每个表的大小是32 bits(4字节)乘以256项,一般称为T盒(T-Box)或T表。加密过程4个表(Te),解密过程4个表(Td),共8个。每一轮操作都通过16次查表产生。虽然一轮就要经历16次查表,但这都简化了伽罗瓦域上的计算操作和矩阵乘法操作,对于计算机程序而言,这是更快的。当然还有S盒和逆向S盒两个表,这两个表相对于T表就要小很多,其大小位8 bits(1字节)乘以256项。

查表法操作过程种需要的内存量并不低,对于一些内存很有限的设备(例如智能卡、嵌入式设备)实现起来并不理想。但其适合在计算机一类具有充裕内存的设备上实现。然而现代计算机软件种并没有广泛使用查表法实现。主要有以下两个原因:一是Rijndael被选定为AES标准后,例如Intel之类的CPU生产商都在其产品内增加了新的指令集,通过汇编语言或其他API调用这些指令集进行AES加密和解密能获得优势巨大的硬件加速,甚至还有针对64位处理器的优化技术(例如BitSlice位切片技术)出现,其吞吐率远超纯粹的软件实现;二是查表法加解密的操作耗时与明文和密钥有一定的关系,可能会为旁道攻击(side-channel attack)提供便利,因此查表法实现的AES可能并不适合用于网络通信这一类时间因素很强的工作中的信息加密,但对于硬盘上的文件加密这一类无时间依赖性的工作仍然是可以胜任的。但是现在仍有一些硬件缺乏对AES相关的硬件支持(例如一些手机CPU、树莓派等),AES的查表法实现仍有应用场景,例如OpenSSL、Bouncy Castle等密码学库中仍然保留了查表法的相关实现。

由于查表法比较简单,便于大家理解AES算法,故本文选择了查表法作为实现部分的讲解内容。理解本文需要前一篇文章(AES的内部结构)作为基础知识,如果您还没有不了解AES的内部结构,请先将其阅读。

下面我们正式开始。

加密过程

在前一篇文章中我们详细讲解了AES的每一轮中具体的四层结构,以加密过程为例分别是:字节代换层(Byte Substitution Layer)、ShiftRows层、MixColumn层和密钥加法层(Key Addition Layer)。

对于查表法实现,就是要将每一轮中的前三层操作(字节代换层、ShiftRows层和MixColumn层)合并为查找表。

S盒和逆向S盒的结构我们已经在前一篇文章中详细地介绍过了,而且可以比较容易地制作出查找表,这里就不再赘述。虽然这两个表在操作轮中也要被融合到T表中,但是在密钥编排中仍然会用到S盒,所以S盒的表可以考虑单独保留一个表。

45ac6b135c312c546ba4e7689e2c0a70.png
图1 加密过程中的一个完整的操作轮

可能您在阅读上一篇文章、理解AES的内部结构时就发现了,字节代换层和ShiftRows层是可以交换顺序的——即先做字节代换层再做ShiftRows层和先做ShiftRows层再做字节代换层的结果是完全一样的。如果将它们交换,那么ShiftRows层实际上就是按照特定的顺序去读取这一轮操作的输入数据。字节代换层和MixColumn层融合为查找表。密钥加法层的本质是按位异或,这个操作很简单,直接附在后面就行。

b17075e344f156d9fe38e8e3d1d7caab.png
图2 查表法加密操作轮

我们在前一篇文章中对MixColumn层给出了如下矩阵公式:

联系矩阵乘法的定义,将其按列向量拆开,对于每一列,都有:(这里只写出了第一列,其他列请读者理解后自行写出)
故有下式:(其中
是本轮子密钥
中对应的那4字节;这里只写出了第一列,其他列请读者理解后自行写出)

我们将T盒(T-Box)作如下定义,即可基于前面两篇文章的知识,通过编写程序算法计算出四个Te表:

即轮操作化为:

计算机中通常将每一个列向量看作一个整体,储存为一个32位无符号整数(Int32),因此每一个T表都是一个有2^8=256个Int32组成的数组。

(本文全文中,笔者都将“4个8位无符号整数组成一个32位无符号整数”的过程看作

放在
的左侧,即MSB;
放在
的右侧,即LSB。如果您考虑的顺序和笔者的不一样,下面的程序示例代码可能有差异)

在实践中,T表一般提前编写程序算出,然后作为一个常量数组硬编码在AES的软件实现代码中。这样,就将繁琐的伽罗瓦域上的运算和矩阵运算变成了对于计算机而言非常简单高效的查表和按位运算。

下面给出的示例代码是相邻两轮的操作,该示例代码使用Rust编程语言编写。

// round 2 to round 9 (or 11, 13)
for i in 1..(rounds / 2) {
    
    // even-number rounds
    wa0 = TE0[ (wb0 >> 24) as usize        ] ^ TE1[((wb1 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值