【随记】从入门到入土的密码学 | AES

哈哈,最近突然高产了,小伙伴们是不是有些惊喜?

上一期,我们聊了一下DES,它使用了对称密钥,对明文进行分块加密,16轮操作后,在大结构的末尾,即可输出密文。

今天,我们再聊一个分块加密的对称加密算法。它有着非常高级的名字——AES,高级加密标准。但事实告诉我们,在新算法出来时,不要忙着为它取一个太高级的名字。因为若从现在的眼光来看,这一算法也并不会太“高级”。

好的,现在,让我们来看看AES是否真的如名字一般的“高级”?

扫描二维码关注公众号,回复: 15263696 查看本文章

AES,又称Rijndael加密算法,是一种相当常见的加密算法。它也是先把长明文分割为合适的大小,再进行加密。但这次,AES就很高级了,它可以改变自己的“胃口”,无论是明文分组还是密钥分组!

老规矩,先来看看总体结构:

在AES中,明文和密钥的分组长度,可根据需要选择128比特、192比特和256比特。总体结构中,明文先和一个子密钥进行异或,再进行可调轮数的“r”轮迭代(又高级了一次),最后得到密文。

从结构图上看,最主要的就是“r轮迭代”部分,由字节代替、行移位、列混合和轮密钥加构成。接下来我们就着重讲讲这“r轮迭代”,但要注意一点:最后一轮少一个“列混合”。

磨刀不误砍柴工

为了对应AES的内部结构,我们需要事先将准备好的明文和密钥先进行一个简单的排列。当然,对于机器,我们看到的就是塞进去一大堆比特,然后又吐出来一大堆比特。这里做的工作,仅仅是为了我们更好地分析AES的操作原理,快速看懂AES是咋整的。

作为加密算法的“原料”,明文和种子密钥需要先分割成一个个很小的比特块,每一个比特块共8比特(也就是一个字节)。然后,把它们安排成一个4行N列(N:不知道选择了几比特的分组长度)的矩阵,准备工作就完成了!

排进矩阵时,也有讲究,规则是从上到下,从左往右排列。把自己选定长度的分组,切割成8比特一块,按照这个方法把比特块一个个放完即可。

按照蓝色线和红色箭头指引填写

还有一个问题,就是那个“r”轮迭代的“r”怎么选定?也很简单,查表!

Nb指的是明文矩阵有多少列,Nk指的是密钥矩阵有多少列

轮函数

有了前面的铺垫,接下来操作加密过程就简单多了!在除了最后一轮的轮函数中,都含有字节代替、行移位、列混合和轮密钥加。我们一个一个来解决。

01

字节代替

顾名思义,就是把一个字节,用另一个字节代替,最懒的方式依旧是查表(是不是很爽)。但这里,鹦鹉先生想讲一下这个表是怎么来的。具体操作方法如下:

对每一个字节:

  • 求GF(28)下的逆元;

  • 在GF(2)下的仿射变换。

这个GF(28)和GF(2)啥意思?其实就是一个域,这里头只有0~255或0~1这些元素,而且只有“异或”和“与”两种运算。举一个最简单的例子:实数域。在实数域中,所有的数都是可以在数轴上明确标记出来的,像是1、0.00001等等。在实数域中,不管我们如何对里面的数进行加法或乘法运算,其结果终究会落回数轴上,也就是实数域。

那“逆元”是什么?最简单粗暴的理解就是“和它相反的那个元素”,就像消消乐,两个元素放在一起运算,就把对方给运算没了。也举一个例子:5的加法逆元是-5,乘法逆元是1/5。前者结果为0,后者结果为1,试想一下:你还能举出哪些例子?所以说,上面的域运算中,没有“减法”和“除法”。

了解完“域”和“逆元”的例子,再看看“仿射变换”是什么。说得这么高大上,其实就只是一个等式:

能把一个看上去很厉害的等式,化成这样的简式即可。但要注意,这里要升级一下:这里的a、b、X、Y都是矩阵,进行的是矩阵运算。具体怎么算,就留给计算机和专业人士就行了。

y7和x7均为高位,意为:从下到上取数字

02

行移位

行移位,就三个字:查表格!

03

列混合

之前,我们都是对单个比特(格子内的比特)进行操作的。这次,“列混合”是以一个字节(一格)为一个操作对象,进行矩阵乘法。

b0~b3就是我们要的,把原来的那一列换成b0~b3即可。

04

轮密钥加

四个字:简单“异或”!种子密钥先扩展,再和半成品的“明文”进行逐比特异或即可。

至于种子密钥的扩展,咱们下次再聊。

Reference:

《现代密码学 -- 杨波 著》

《Cryptography and Secure Communication -- Richard E. Blahut》

《Computer Security: Principles and Practice (Fourth Edition)》

部分图片源于互联网

猜你喜欢

转载自blog.csdn.net/m0_60483056/article/details/125774063
AES
今日推荐