# Reverse 常见的加密算法
在 reverse 的题目中,常常会对我们的输入以及内存数据进行加密,然后与已有的密文进行对比,从而判断我们的输入是否正确
# 基于特征值识别的加密算法:DES,AES,T 系列,md5,sm4
ida pro 插件
https://github.com/polymorf/findcrpyt-yara
# T 系列
# TEA,XTEA,XXTEA
有一个明确的特征值,然后对明文进行一些基本的算数运算
# AES—— 块加密算法
有一个固定的 256 字节的数组
sbox [256] 的数组(用于矩阵运算的密钥), 但是密钥不一定在程序中定义,可能是通过算法函数生成。这里也是出题人常用的出题思路 —— 修改 sbox。
AES 基于单个块的加密,一次处理 4 个字节的数据
# RC4
通过一个 key,生成一个 sbox,再由 sbox 生成一个 keystream,明文与 keystream 亦或得到明文
# MD5
有 4 个固定的 32bit 的值
# SM4
有一个固定的 256 字节的数组
# DES
有一个固定的 64 字节的数组
# 第三方库加密
调用第三方的库函数,对数据进行加密。这时候我们需要去寻找对应的加密函数的调用信息,dll,so 文件提供的 api。也有可能是使用的网络上开源的加密算法。
# 加密算法的模式
# 分组加密模式(1,2 常用)
# 1,电码本模式 ecb
将明文分成多个块,对每个块进行单独的加密,然后拼接成密文,解密的流程就是将加密快换成解密块
# 2,密码分组链接模式 CBC
将明文分组程多个明文块 plaintext,算法需要两个额外的值,initialization Vector (IV), 这是一个与明文块大小相同的数据块,用于与第一个 plaintext 进行亦或(初始化),得到中间的块,Block Cipher Encryption,然后 BCE 与 key 进行加密运算的带第一个密文块,Ciphertext。后面按照同样的流程,只不过不再是使用给出的 IV,而是将上一个密文块用作本次加密的 IV。