加密解密算法与编码–逆向工程基础知识
字数 3632 2025-09-01 11:25:53

逆向工程基础知识:加密解密算法与编码

密码破解基础

简单密码破解流程

  1. 调试工具使用:使用x64dbg加载程序,观察关键函数调用
  2. 关键点定位
    • 在断点上方寻找jmp和call语句
    • 最后一个被调用的函数通常是check_pass()函数
  3. 寄存器分析
    • 输入密码和正确密码通常被加载到RCX和RAX寄存器进行比较
  4. 修改返回值
    • 找到check_pass()函数的返回值位置(通常通过EAX/RAX寄存器)
    • 将返回值从1(错误)修改为0(正确)来绕过验证

XOR加密破解

  1. 特征识别
    • 程序中存在"mov al, byte ptr [argv] + xor al, byte ptr [key]"的连续指令
  2. 破解原理
    • 如果 X xor Y = Z,则 Y xor Z = X
    • 通过已知密钥和加密结果可以还原原始数据
  3. 实际案例
    • 密钥集:[U、V、W、X、Y、Z、Q、R、S、T]
    • 加密结果:&"7=! (空格)'
    • 通过逐字符异或可以还原原始密码

网络验证破解

网络通信流程分析

  1. 关键函数

    • WSAStartup:初始化winsock DLL
    • Socket:创建套接字
    • Inet_addr:指定IP版本
    • Htons:端口转换(如8080端口)
    • Connect:连接服务器
    • Send:发送数据
    • Recv:接收验证结果
  2. 破解方法

    • 方法一:修改零标志位为1,使比较结果恒为相等
    • 方法二:在strcmp比较前修改寄存器值,使比较双方相同

哈希算法识别

MD5特征

  1. 模数特征:四组模数ab和cd,是1-F的组合
  2. 算法特征
    • 压缩函数执行64轮迭代(4组×16轮)
    • 输出128位哈希值(4个32位寄存器拼接)

SHA-1特征

  1. 算法特征
    • 压缩函数共80轮迭代(4组×20轮)
    • 输出160位哈希值(5个32位寄存器拼接)

编码算法

Base系列编码

  1. 共同特点

    • 将二进制数据转化为可打印字符
    • 是编码算法而非加密算法
    • 本质上是进制转换算法
  2. Base58

    • 码表:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
    • 特点:去除易混淆字符(0,O,I,l等)
    • 应用:Bitcoin钱包地址
    • Base58Check:增加4字节校验码(SHA256前4字节)
  3. Base64

    • 码表:A-Za-z0-9+/
    • 编码方法:每3字节→4字节(3×8=24,24/6=4)
    • 填充规则:原始数据长度模3余1补2=,余2补1=
    • URL安全版本:将+/替换为-_
  4. Base32

    • 码表:A-Z和2-7
    • 编码方法:每5字节→8字节(5×8=40,40/5=8)
    • 特点:不区分大小写,无易混淆字符
  5. Base16

    • 码表:0-9A-F
    • 编码方法:每1字节→2字节(1×8=8,8/4=2)
    • 特点:无填充,数据量扩大一倍

对称加密算法

AES(高级加密标准)

  1. 基本参数

    版本 密钥长度 分组长度 加密轮数 实际密钥长度
    AES-128 4字(32位) 4字 10 128位
    AES-192 6字 4字 12 192位
    AES-256 8字 4字 14 256位
  2. 加密流程

    • 密钥扩展:从初始密钥派生多个轮密钥(44个32位字)
    • 初始轮:AddRoundKey(明文与第一轮密钥异或)
    • 主轮(9轮):
      1. SubBytes:S盒字节替换
      2. ShiftRows:行循环左移
      3. MixColumns:列混合(矩阵乘法)
      4. AddRoundKey:与轮密钥异或
    • 最终轮(第10轮):省略MixColumns
  3. 识别特征

    • S盒查表操作(mov al, byte ptr [sbox+eax])
    • 4×4状态矩阵操作
    • 10/12/14轮加密循环
    • 行移位和列混合操作

DES

  1. 基本参数

    • 分组长度:64位
    • 密钥长度:56位(实际64位,8位校验)
    • 加密轮数:16轮
  2. 加密流程

    • 初始置换(IP)
    • 16轮Feistel网络:
      1. 右半部分扩展(E盒):32位→48位
      2. 与子密钥异或
      3. S盒替换(8组6位→4位,共32位)
      4. P盒置换
    • 最终置换(IP⁻¹)
  3. 子密钥生成

    • PC-1置换(64位→56位)
    • 循环左移(每轮1或2位)
    • PC-2置换(56位→48位)
  4. 识别特征

    • 初始/最终置换
    • 16轮Feistel结构
    • 8个S盒查表
    • PC-1/PC-2置换操作

RC4

  1. 特点

    • 流密码(序列密码)
    • 密钥长度可变(1-256字节)
    • 算法简单,速度快
  2. 加密流程

    • 初始化S盒(256字节):S[i] = i
    • 使用密钥打乱S盒:j = (j + S[i] + key[i % keylen]) % 256
    • 生成密钥流:
      • i = (i + 1) % 256
      • j = (j + S[i]) % 256
      • 交换S[i]和S[j]
      • t = (S[i] + S[j]) % 256
      • 密钥字节k = S[t]
    • 加密:明文与密钥流异或
  3. 识别特征

    • 256字节S盒初始化
    • S盒打乱操作
    • 密钥流生成循环
    • 异或加密操作

国密算法

SM4

  1. 基本参数

    • 分组长度:128位
    • 密钥长度:128位
    • 加密轮数:32轮
  2. 特征识别

    • 固定S盒:0xd6,0x90,0xe9...
    • 固定参数FK:0xa3b1bac6,0x56aa3350...
    • 轮常量CK:0x00070e15,0x1c232a31...
  3. 加密流程

    • 轮函数包含:
      • 非线性τ变换(S盒)
      • 线性变换L(移位和异或)
    • 32轮迭代
    • 解密:轮密钥逆序使用

非对称加密算法

RSA

  1. 密钥生成

    • 选择大质数p和q
    • 计算n = p×q
    • 计算φ(n) = (p-1)(q-1)
    • 选择e(与φ(n)互质)
    • 计算d ≡ e⁻¹ mod φ(n)
    • 公钥:(n,e),私钥:(n,d)
  2. 加密/解密

    • 加密:c ≡ mᵉ mod n
    • 解密:m ≡ cᵈ mod n
  3. 识别特征

    • 大整数运算(数百位)
    • 模幂运算(快速幂算法)
    • 模运算(div指令)
    • 常见密钥长度:1024/2048/4096位

TEA系列加密算法

TEA/XTEA/XXTEA共同特征

  1. delta常量:0x9e3779b9
  2. 基本操作:移位、异或、加法混合运算

TEA

  1. 特征
    • 固定32轮加密
    • 密钥固定索引(key[0]-key[3])
    • 加密公式:y += ((z<<4)+key[0]) ^ (z+sum) ^ ((z>>5)+key[1])

XTEA

  1. 特征
    • 轮数可自定义
    • 密钥动态索引(key[sum&3]或key[(sum>>11)&3])

XXTEA

  1. 特征
    • 支持多数据块加密
    • 复杂MX宏运算:((z>>5^y<<2)+(y>>3^z<<4)) ^ ((sum^y)+(key[(p&3)^e]^z))
    • 轮数公式:6 + 52/n(n为数据块数)

加密算法识别速查表

算法 关键特征 验证方法
XOR 循环中高频xor指令,无复杂运算 取密文与密钥异或验证结果
TEA delta常量0x9e3779b9,固定密钥索引 查找delta常量,验证密钥
XTEA delta常量,密钥依赖sum计算 检查密钥索引是否与sum相关
XXTEA delta常量,多数据块循环 查找多块循环和MX宏运算
AES S盒查表,行移位,列混合 检查S盒和10/12/14轮结构
DES 初始置换,16轮Feistel,8个S盒 查找置换和S盒操作
RC4 256字节S盒初始化与打乱 跟踪S盒初始化和密钥流生成
RSA 大整数模幂运算 查找大整数存储和模运算
SM4 固定FK/CK参数,特定S盒 比对FK/CK和S盒数值
Base64 码表A-Za-z0-9+/,3→4字节 检查填充规则和码表

逆向工程实用技巧

  1. 调试技巧

    • 在关键比较指令前设置断点
    • 修改标志寄存器或关键寄存器值
    • 跟踪函数返回值(通常通过EAX/RAX)
  2. 算法识别

    • 查找特征常量(如TEA的delta)
    • 分析加密循环结构
    • 识别S盒或置换表
  3. 密码破解

    • 对于对称加密,尝试提取密钥
    • 对于非对称加密,分析密钥生成过程
    • 对于编码算法,识别码表和编码规则
  4. 工具使用

    • IDA插件:FindCrypt识别加密算法
    • x64dbg:动态分析程序行为
    • Python脚本:快速验证加密算法
逆向工程基础知识:加密解密算法与编码 密码破解基础 简单密码破解流程 调试工具使用 :使用x64dbg加载程序,观察关键函数调用 关键点定位 : 在断点上方寻找jmp和call语句 最后一个被调用的函数通常是check_ pass()函数 寄存器分析 : 输入密码和正确密码通常被加载到RCX和RAX寄存器进行比较 修改返回值 : 找到check_ pass()函数的返回值位置(通常通过EAX/RAX寄存器) 将返回值从1(错误)修改为0(正确)来绕过验证 XOR加密破解 特征识别 : 程序中存在"mov al, byte ptr [ argv] + xor al, byte ptr [ key ]"的连续指令 破解原理 : 如果 X xor Y = Z,则 Y xor Z = X 通过已知密钥和加密结果可以还原原始数据 实际案例 : 密钥集:[ U、V、W、X、Y、Z、Q、R、S、T ] 加密结果:&"7= ! (空格)' 通过逐字符异或可以还原原始密码 网络验证破解 网络通信流程分析 关键函数 : WSAStartup:初始化winsock DLL Socket:创建套接字 Inet_ addr:指定IP版本 Htons:端口转换(如8080端口) Connect:连接服务器 Send:发送数据 Recv:接收验证结果 破解方法 : 方法一 :修改零标志位为1,使比较结果恒为相等 方法二 :在strcmp比较前修改寄存器值,使比较双方相同 哈希算法识别 MD5特征 模数特征 :四组模数ab和cd,是1-F的组合 算法特征 : 压缩函数执行64轮迭代(4组×16轮) 输出128位哈希值(4个32位寄存器拼接) SHA-1特征 算法特征 : 压缩函数共80轮迭代(4组×20轮) 输出160位哈希值(5个32位寄存器拼接) 编码算法 Base系列编码 共同特点 : 将二进制数据转化为可打印字符 是编码算法而非加密算法 本质上是进制转换算法 Base58 : 码表:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz 特点:去除易混淆字符(0,O,I,l等) 应用:Bitcoin钱包地址 Base58Check:增加4字节校验码(SHA256前4字节) Base64 : 码表:A-Za-z0-9+/ 编码方法:每3字节→4字节(3×8=24,24/6=4) 填充规则:原始数据长度模3余1补2=,余2补1= URL安全版本:将+/替换为-_ Base32 : 码表:A-Z和2-7 编码方法:每5字节→8字节(5×8=40,40/5=8) 特点:不区分大小写,无易混淆字符 Base16 : 码表:0-9A-F 编码方法:每1字节→2字节(1×8=8,8/4=2) 特点:无填充,数据量扩大一倍 对称加密算法 AES(高级加密标准) 基本参数 : | 版本 | 密钥长度 | 分组长度 | 加密轮数 | 实际密钥长度 | |------|---------|---------|---------|------------| | AES-128 | 4字(32位) | 4字 | 10 | 128位 | | AES-192 | 6字 | 4字 | 12 | 192位 | | AES-256 | 8字 | 4字 | 14 | 256位 | 加密流程 : 密钥扩展:从初始密钥派生多个轮密钥(44个32位字) 初始轮:AddRoundKey(明文与第一轮密钥异或) 主轮(9轮): SubBytes:S盒字节替换 ShiftRows:行循环左移 MixColumns:列混合(矩阵乘法) AddRoundKey:与轮密钥异或 最终轮(第10轮):省略MixColumns 识别特征 : S盒查表操作(mov al, byte ptr [ sbox+eax ]) 4×4状态矩阵操作 10/12/14轮加密循环 行移位和列混合操作 DES 基本参数 : 分组长度:64位 密钥长度:56位(实际64位,8位校验) 加密轮数:16轮 加密流程 : 初始置换(IP) 16轮Feistel网络: 右半部分扩展(E盒):32位→48位 与子密钥异或 S盒替换(8组6位→4位,共32位) P盒置换 最终置换(IP⁻¹) 子密钥生成 : PC-1置换(64位→56位) 循环左移(每轮1或2位) PC-2置换(56位→48位) 识别特征 : 初始/最终置换 16轮Feistel结构 8个S盒查表 PC-1/PC-2置换操作 RC4 特点 : 流密码(序列密码) 密钥长度可变(1-256字节) 算法简单,速度快 加密流程 : 初始化S盒(256字节):S[ i ] = i 使用密钥打乱S盒:j = (j + S[ i] + key[ i % keylen ]) % 256 生成密钥流: i = (i + 1) % 256 j = (j + S[ i ]) % 256 交换S[ i]和S[ j ] t = (S[ i] + S[ j ]) % 256 密钥字节k = S[ t ] 加密:明文与密钥流异或 识别特征 : 256字节S盒初始化 S盒打乱操作 密钥流生成循环 异或加密操作 国密算法 SM4 基本参数 : 分组长度:128位 密钥长度:128位 加密轮数:32轮 特征识别 : 固定S盒:0xd6,0x90,0xe9... 固定参数FK:0xa3b1bac6,0x56aa3350... 轮常量CK:0x00070e15,0x1c232a31... 加密流程 : 轮函数包含: 非线性τ变换(S盒) 线性变换L(移位和异或) 32轮迭代 解密:轮密钥逆序使用 非对称加密算法 RSA 密钥生成 : 选择大质数p和q 计算n = p×q 计算φ(n) = (p-1)(q-1) 选择e(与φ(n)互质) 计算d ≡ e⁻¹ mod φ(n) 公钥:(n,e),私钥:(n,d) 加密/解密 : 加密:c ≡ mᵉ mod n 解密:m ≡ cᵈ mod n 识别特征 : 大整数运算(数百位) 模幂运算(快速幂算法) 模运算(div指令) 常见密钥长度:1024/2048/4096位 TEA系列加密算法 TEA/XTEA/XXTEA共同特征 delta常量 :0x9e3779b9 基本操作 :移位、异或、加法混合运算 TEA 特征 : 固定32轮加密 密钥固定索引(key[ 0]-key[ 3 ]) 加密公式:y += ((z<<4)+key[ 0]) ^ (z+sum) ^ ((z>>5)+key[ 1 ]) XTEA 特征 : 轮数可自定义 密钥动态索引(key[ sum&3]或key[ (sum>>11)&3 ]) XXTEA 特征 : 支持多数据块加密 复杂MX宏运算:((z>>5^y<<2)+(y>>3^z<<4)) ^ ((sum^y)+(key[ (p&3)^e ]^z)) 轮数公式:6 + 52/n(n为数据块数) 加密算法识别速查表 | 算法 | 关键特征 | 验证方法 | |------|---------|---------| | XOR | 循环中高频xor指令,无复杂运算 | 取密文与密钥异或验证结果 | | TEA | delta常量0x9e3779b9,固定密钥索引 | 查找delta常量,验证密钥 | | XTEA | delta常量,密钥依赖sum计算 | 检查密钥索引是否与sum相关 | | XXTEA | delta常量,多数据块循环 | 查找多块循环和MX宏运算 | | AES | S盒查表,行移位,列混合 | 检查S盒和10/12/14轮结构 | | DES | 初始置换,16轮Feistel,8个S盒 | 查找置换和S盒操作 | | RC4 | 256字节S盒初始化与打乱 | 跟踪S盒初始化和密钥流生成 | | RSA | 大整数模幂运算 | 查找大整数存储和模运算 | | SM4 | 固定FK/CK参数,特定S盒 | 比对FK/CK和S盒数值 | | Base64 | 码表A-Za-z0-9+/,3→4字节 | 检查填充规则和码表 | 逆向工程实用技巧 调试技巧 : 在关键比较指令前设置断点 修改标志寄存器或关键寄存器值 跟踪函数返回值(通常通过EAX/RAX) 算法识别 : 查找特征常量(如TEA的delta) 分析加密循环结构 识别S盒或置换表 密码破解 : 对于对称加密,尝试提取密钥 对于非对称加密,分析密钥生成过程 对于编码算法,识别码表和编码规则 工具使用 : IDA插件:FindCrypt识别加密算法 x64dbg:动态分析程序行为 Python脚本:快速验证加密算法