type
status
date
slug
summary
tags
category
icon
password

AES-128加密算法详解

前言:

很早之前就像进行加密算法这类的研究了,一直在拖延,今天完成一下对他的研究。下面的解释如有错误,请各位师傅进行指出修改,感谢!

加密逻辑概略:

我先简单说明一下他的加密流程以及他每一步加密的含义
先来放一张加密流程图:(网上找的一张,感觉这个写的很好)
notion image
 

加密流程

先对这个流程简单说一下:
首先,我们可以看到这个明文先进行了一波轮密钥加,这个轮密钥加是什么呢,我们要先知道他的明文与key是怎么存储的

字节存储

这是我自己起的名,实际是说明明文与密文的存储,可以看成将数据存储到一个4x4的矩阵中,按照 从上到下,从左到右 进行排序
notion image
假如明文是“ABCDEFGHIJKLMNOP”
notion image
密文也是这样存储的
对于key,他的存储也是放在矩阵中,但是会通过一个密钥编排函数,将这个密钥扩展成一个44字的序列,命名为W[0],W[1],W[2]...W[43],每组4个字,分别用于10轮加密运算中的轮密钥加
给个图
notion image
还是给个例子具体分析一下:
key=”abcdefghijklmnop”
我们的key还是像明文一样设置成4x4的矩阵中
所以这样来说就是
W[0]=K0 K1 K2 K3="ABCD"
其他也都这样来划分的,此时肯定就会说W5怎么进行划分a,他已经用完K0到K15了

密钥扩展:

此时的密钥扩展就是通过递归的方式产生了,分为两种情况
1、如果 i 是 4 的倍数 W[i]=W[i-4]⨁T(W[i-1])
2、如果 i 不是4 的倍数 W[i]=W[i-4]⨁W[i-1]
此时我们还是用key=“abcdefghijklmnop”,所以下面就是
W[0] = 3C A1 0B 21 W[1] = 57 F0 19 16 W[2] = 90 2E 13 80 W[3] = AC C1 07 BD
接下来不就是求W[4]了吗,此时i (i=4)正好是4的倍数
公式: W[i]=W[i-4]⨁T(W[i-1])
此时的T是一个函数,这个函数包括字循环、字节代换和轮常量异或
a.字循环:将一个字中的四个自己循环左移一个字节,即将输入
字[b0, b1, b2, b3] 变换成 字[b1,b2,b3,b0]
b.字节代换:对字循环的结果使用S盒进行字节代换(下面会具体来说)
c.轮常量异或:将前两步的结果同轮常量Rcon[j]进行异或,其中j表示轮数
notion image
下面进行具体的例子讲解W[4],W[5]什么的只取最后一步异或
notion image

轮密钥加:

轮密钥加是将128位轮密钥Ki同状态矩阵中的数据进行逐位异或操作,如下图所示。其中,密钥Ki中每个字W[4i],W[4i+1],W[4i+2],W[4i+3]为32位比特字,包含4个字节,他们的生成算法下面在下面介绍。轮密钥加过程可以看成是字逐位异或的结果,也可以看成字节级别或者位级别的操作。也就是说,可以看成S0 S1 S2 S3 组成的32位字与W[4i]的异或运算。
给个图就非常容易理解了

字节代换:

字节代换:

notion image
这个很好理解,AES的字节代换其实就是一个简单的查表操作。AES定义了一个S盒和一个逆S盒
S盒:
notion image
这个举例子就非常容易理解:
比如咱的原来的值是12,那么经过字节代换之后的值就是从上面的S盒的序号为1的行1和序列为2的列取值,就是82
这样容易理解了
这里也是标准AES进行魔改的地方,因为S盒是自己给的,我只要修改S盒,那么加密肯定也会发生变化

逆字节代换:

原理相同,此处我只贴一个逆S盒
notion image

行移位:

行移位

这个也非常容易理解
notion image

逆行移位

行移位的逆变换是将状态矩阵中的每一行执行相反的移位操作,例如AES-128中,状态矩阵的第0行右移0字节,第1行右移1字节,第2行右移2字节,第3行右移3字节
两者区别就是一个向左一个向右

列混合:

我觉得这个比较困难,我先引用大佬的进行解释,明天在代码里面进行讲解
notion image

列混合

列混合变换是通过矩阵相乘来实现的,经行移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵,如下图的公式所示:
notion image
状态矩阵中的第j列(0 ≤j≤3)的列混合可以表示为下图所示:
其中,矩阵元素的乘法和加法都是定义在基于GF(2^8)上的二元运算,并不是通常意义上的乘法和加法。这里涉及到一些信息安全上的数学知识,不过不懂这些知识也行。其实这种二元运算的加法等价于两个字节的异或,乘法则复杂一点。对于一个8位的二进制数来说,使用域上的乘法乘以(00000010)等价于左移1位(低位补0)后,再根据情况同(00011011)进行异或运算
贴一下课本上的图片:
notion image
notion image
这个地方我觉得有个b站up主讲的很好
下面贴一个例子:
初始
notion image
notion image

列混合逆运算:

使用下面的公式
notion image
原理基本是这样的,明天简单写写代码的实现以及IDA进行反编译的样子分析。
推荐阅读:
 
CISCN2024—reNKCTF—re
Loading...