1. 前言
AES,全称为高级加密标准(Advanced Encryption Standard),是一种广泛使用的对称加密算法。它由比利时密码学家Vincent Rijmen和Joan Daemen设计,并在2001年被美国国家标准与技术研究院(NIST)采纳为官方的加密标准,用以取代旧的DES(数据加密标准)。

AES的特点包括:
块加密:AES是一种块加密算法,意味着它将数据分成固定大小的块(AES的块大小为128位),然后对每个块进行加密。
多种密钥长度:AES支持三种不同的密钥长度,分别是128位、192位和256位,这提供了不同的安全级别。
多轮加密:AES加密过程由多轮变换组成,每轮包括四个步骤:SubBytes(字节替换)、ShiftRows(行移位)、MixColumns(列混淆)和AddRoundKey(轮密钥加)。对于不同长度的密钥,轮数也不同:128位密钥使用10轮,192位密钥使用12轮,256位密钥使用14轮。
速度快且安全:AES在大多数现代硬件上都能快速执行,同时提供了强大的安全性,使其成为商业和政府加密应用的理想选择。
广泛支持:AES被广泛支持和实现,在软件和硬件中都有集成,包括操作系统、网络协议、安全通信和许多其他应用。
模式操作:AES通常与其他算法结合使用,形成不同的工作模式,以适应不同的加密需求。常见的模式包括CBC(密码块链模式)、ECB(电子密码本模式)、CTR(计数器模式)等。
AES的加密和解密过程是可逆的,只要拥有正确的密钥,就可以从密文中恢复出明文。AES算法的安全性基于密钥的保密性,以及算法本身的复杂性,使得破解变得非常困难。
由于其安全性和效率,AES已成为全球范围内最常用的加密算法之一,被用于保护电子数据的安全,包括金融交易、通信、文件存储和许多其他需要保密的应用场景。

2. 理论

  • AES加密模式
    密钥长度 :AES128(16B),AES192(24B),AES256(32B)
    加密模式 : ECB CBC CFB OFB CTR CCM GCM XTS
    填充模式 : NONE PKC37 ZERO ANSI923 IOS7816_4 IOS10126
    数据是以16B一组分组加密;填充明文,常考ECB CBC NONE;NONE 不允许明文长度不是16字节的倍数;PKC37 缺多少字节补多少个字节数量。

- 加密执行流程
输入明文,填充到16B倍数,以16字节分组,明文1,明文2,明文3,明文4 输入16B/24B/32B密钥,对密钥进行扩展生成轮密钥
什么是密钥扩展?就是把用户输入的16B,24B,32B字节密钥扩展到176,208,240字节的轮密钥。

  • 加密器
    AES128加密器(0-10轮);AES192加密器(0-12轮);AES256加密器(0-14轮)。代码实现关键看循环轮数
    加密器具体实现,以128为例:
    明文与轮密钥进行轮密钥加(0轮) ;
    字节代换,行位移,列混淆,轮密钥加(1-9轮);
    字节代换,行位移,轮密钥加(10轮);
    生成密文1,密文2,密文3,密文4,最终合并成最终密文

AES中,16B是按照44矩阵排列,且是以列从上往下,那么这里的偏移量就是4j(列),注意行位移中要用。行i+列j*4,即双重循环。如下矩阵
行0: a1[0] a1[4] a1[8] a1[12]
行1: a1[1] a1[5] a1[9] a1[13]
行2: a1[2] a1[6] a1[10] a1[14]
行3: a1[3] a1[7] a1[11] a1[15]

  • 轮密钥加
    输入数组(16B)和轮密钥的其中16个字节异或(从当前轮数*4的列向后取),得到输出16B继续参与加密

  • 加密字节代换表

    unsigned char Tables1[16][16] = {
    /* 0     1     2     3     4     5     6     7     8     9     a     b     c     d     e     f */
    /*0*/{ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76 },
    /*1*/{ 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0 },
    /*2*/{ 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15 },
    /*3*/{ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75 },
    /*4*/{ 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84 },
    /*5*/{ 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf },
    /*6*/{ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8 },
    /*7*/{ 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2 },
    /*8*/{ 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73 },
    /*9*/{ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb },
    /*a*/{ 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79 },
    /*b*/{ 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08 },
    /*c*/{ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a },
    /*d*/{ 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e },
    /*e*/{ 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf },
    /*f*/{ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 }
      };
    
  • 行位移
    第一行不变
    第二行向左循环移动1B
    第三行向左循环移动2B
    第四行向左循环移动3B
    这里可以联系上面的偏移量了 4*j(列)

  • 列混淆
    使用公式GF(2^8)对[列混淆左乘矩阵的行]与[当前字节的列]进行矩阵乘法

  • 解密
    其实和加密一样,不过解密的字节替换表和加密不同了,而且加密器的步骤要逆向过来,即相反,注意第0轮没有列混淆。
    解密流程是从密文到明文,密钥不变,解密器中步骤相反,即轮密钥加,逆列混淆(第一次不执行),逆行位移,逆字节代换。

3. AES源码
https://github.com/kokke/tiny-AES-c

4.实操

1.2024强网拟态babyre
首先IDA打开是这样

为了方便分析,整理一下之后逻辑是这样

现在我们看具体的AES怎么实现和辨析

  • 轮密钥加
    4*4矩阵异或
  • 行位移
    行位移0行不变,1行向左循环移动1字节,2行左循环移动2字节,3行左循环移动3字节
  • 列混淆
    这个一般在步骤里面还是很好辨别出来的,遇到魔改的话另说了
  • 密钥扩展
    发现了轮常量
  • 字节替换
    这里面是加密的字节替换表

    所以这个地方的AES每一步都分析出来了
    鼠标标的这一行是字节替换

    那么我们整理一下其实就是如图,所以在逆向识别过程中可以适当抓重点,争取抢血的时间。

    后面的z3可以采取爆破求解就不在本文讨论范围了

2.网鼎杯青龙组re2
如图,打开可以直接识别