专栏名称: 算法与数据结构
算法与数据结构知识、资源分享
目录
相关文章推荐
九章算法  ·  计算机专业走向,没有悬念了! ·  6 小时前  
算法爱好者  ·  GitHub 资深工程师揭秘:90% ... ·  18 小时前  
算法爱好者  ·  禁用 Cursor ... ·  昨天  
算法爱好者  ·  Redis 之父放话:AI ... ·  昨天  
51好读  ›  专栏  ›  算法与数据结构

漫画:AES算法的底层原理

算法与数据结构  · 公众号  · 算法  · 2017-10-26 11:10

正文

请到「今天看啥」查看全文


字节代替(SubBytes)

行移位( ShiftRows

加轮密钥(AddRoundKey)







1.字节替代(SubBytes)




首先需要说明的是,16字节的明文块在每一个处理步骤中都被排列成4X4的二维数组。


所谓字节替代,就是把明文块的每一个字节都替代成另外一个字节。 替代的依据是什么呢?依据一个被称为 S盒 (Subtitution Box) 的16X16大小的二维常量数组。


假设明文块当中a[2,2] = 5B(一个字节是两位16进制),那么输出值b[2,2] = S[5][11]。



2.行移位(ShiftRows)




这一步很简单,就像图中所描述的:

第一行不变

第二行循环左移 1 个字节

第三行循环左移 2 个字节

第四行循环左移 3 个字节



3.列混淆(MixColumns)




这一步,输入数组的每一列要和一个名为修补矩阵( fixed matrix )的二维常量数组做矩阵相乘,得到对应的输出列。



4.加轮密钥(AddRoundKey)




这一步是唯一利用到密钥的一步,128bit的密钥也同样被排列成4X4的矩阵。


让输入数组的每一个字节a[i,j]与密钥对应位置的字节k[i,j]异或一次,就生成了输出值b[i,j]。


需要补充一点, 加密的每一轮所用到的密钥并不是相同的。这里涉及到一个概念:扩展密钥( KeyExpansions )。



扩展密钥( KeyExpansions


AES源代码中用长度 4 * 4 *(10+1) 字节的数组W来存储所有轮的密钥。W{0-15}的值等同于原始密钥的值,用于为初始轮做处理。


后续每一个元素W[i]都是由W[i-4]和W[i-1]计算而来,直到数组 W的所有元素都赋值完成。


W数组当中, W{0-15}用于初始轮的处理, W{16-31}用于第1轮的处理,W{32-47}用于第2轮的处理 ......一直到W{160-175}用于最终轮(第10轮)的处理。











请到「今天看啥」查看全文