JS逆向:RSA加密
字数 1270 2025-08-18 11:36:53

JS逆向:RSA加密分析实战教程

一、RSA加密基础认知

在进行JS逆向分析时,了解常见加密方法的特征至关重要:

  1. 常见加密方法的密文长度特征

    • MD5加密:16位或32位
    • SHA1加密:40位
    • RSA加密:通常较长(128位以上),每次加密结果不同
  2. RSA加密的典型JS实现模式

    var o = new JSEncrypt();
    o.setPublicKey("公钥内容");
    o.encrypt("明文内容");
    

二、案例一分析:gm99.com登录密码加密

1. 定位关键代码

  • 直接搜索"password:"快速定位
  • 密码加密流程:a.encode(t.password, s),其中:
    • t.password:用户输入密码
    • s:时间戳

2. 加密过程分析

  • 使用jsencrypt库
  • 典型RSA加密三步:
    1. 创建加密对象
    2. 设置公钥
    3. 执行加密

3. 代码扒取与复现

  • 模块化代码处理

    • 识别模块加载器(call()/apply()方法)
    • 复制相关模块(本例中为模块3和模块4)
  • 环境补全

    // Node.js环境下补全window对象
    var window = global;
    
    // 浏览器环境补全
    var navigator = {
      userAgent: 'Mozilla/5.0...'
    };
    
  • 常见报错处理

    • "ASN1 is not defined":需确保JS解码器环境
    • 在Node.js中应将window = this改为window = global

三、案例二分析:minmetals.com.cn采购信息加密

1. 加密特征识别

  • 加密参数param长度很长→RSA加密可能性大
  • 搜索setPublicKey快速定位加密代码

2. 加密流程解析

  1. 加密对象创建

    t = new v["a"]();
    t.setPublicKey(r); // r为公钥
    
  2. 参数构造

    a = m({
      ...e,  // 原始数据对象
      sign: f(JSON.stringify(e), 32),  // MD5签名
      timeStamp: +new Date()  // 时间戳
    });
    
  3. 长文本加密

    s = t.encryptLong(JSON.stringify(a));
    

3. 关键组件分析

  • MD5签名

    • f(JSON.stringify(e), 32)生成32位签名
    • 可通过在线MD5工具验证
  • 时间戳

    • +new Date()获取当前时间戳
  • 公钥获取

    • 在Console中直接输出r变量获取

4. Webpack模块处理

  1. 识别模块加载器

    v = gb("9816");  // 9816是模块ID
    
  2. 模块依赖分析

    • 9816模块依赖a524模块
    • 需要完整复制所有依赖模块代码
  3. 方法补全顺序

    • 先补全m方法
    • 然后补全m依赖的db方法
    • 最后补全encryptLong及其依赖的w方法

四、完整复现流程

1. 环境搭建

// Node.js环境设置
var window = global;
var navigator = { userAgent: 'Mozilla/5.0...' };

// 加载器设置
var gb;
(function(A){...})({
  // 所有依赖模块
  a524: function(e) {...},
  9816: function(e, t, n) {...}
});

2. 加密函数实现

function getParam() {
  // 1. 准备原始数据
  e = {
    "inviteMethod": "",
    "businessClassfication": "",
    "mc": "",
    "lx": "ZBGG",
    "dwmc": "",
    "pageIndex": 1
  };
  
  // 2. 设置公钥
  r = '-----BEGIN PUBLIC KEY-----\n...';
  
  // 3. MD5签名方法
  function f(string, bit) {...}
  
  // 4. 辅助方法
  function b(A, e, t) {...}
  function w(A) {...}
  function d(A, e) {...}
  
  // 5. 参数构造方法
  function m(A) {
    return {
      ...A,
      sign: f(JSON.stringify(A), 32),
      timeStamp: +new Date()
    };
  }
  
  // 6. 执行加密
  v = gb("9816");
  t = new v["a"]();
  v["a"].prototype.encryptLong = function(A) {...};
  t.setPublicKey(r);
  
  a = m(m({}, e));
  s = t.encryptLong(JSON.stringify(a));
  return s;
}

3. 执行验证

a = getParam();
console.log(a);

五、关键技巧总结

  1. 快速定位技巧

    • 搜索关键词:password, encrypt, setPublicKey
    • 观察网络请求中的加密参数特征
  2. 模块化代码处理

    • 识别加载器(通常包含call/apply)
    • 按需复制依赖模块
    • 注意模块ID类型(数字不加引号,字符串需加引号)
  3. 环境补全原则

    • 浏览器对象:window, navigator, document等
    • Node.js环境特殊处理:window = global
  4. 调试技巧

    • 在关键位置打debugger断点
    • 使用Console输出中间变量值
    • 对比在线加密工具验证加密结果
  5. 加密方法识别

    • 通过密文长度初步判断
    • 观察是否有设置公钥/私钥的操作
    • 注意是否有初始化向量(IV)等特征

通过以上详细分析和步骤拆解,可以系统性地掌握JS逆向中RSA加密的分析方法和复现技巧。实际应用中需根据具体网站情况灵活调整策略。

JS逆向:RSA加密分析实战教程 一、RSA加密基础认知 在进行JS逆向分析时,了解常见加密方法的特征至关重要: 常见加密方法的密文长度特征 : MD5加密:16位或32位 SHA1加密:40位 RSA加密:通常较长(128位以上),每次加密结果不同 RSA加密的典型JS实现模式 : 二、案例一分析:gm99.com登录密码加密 1. 定位关键代码 直接搜索"password:"快速定位 密码加密流程: a.encode(t.password, s) ,其中: t.password :用户输入密码 s :时间戳 2. 加密过程分析 使用jsencrypt库 典型RSA加密三步: 创建加密对象 设置公钥 执行加密 3. 代码扒取与复现 模块化代码处理 : 识别模块加载器(call()/apply()方法) 复制相关模块(本例中为模块3和模块4) 环境补全 : 常见报错处理 : "ASN1 is not defined":需确保JS解码器环境 在Node.js中应将 window = this 改为 window = global 三、案例二分析:minmetals.com.cn采购信息加密 1. 加密特征识别 加密参数param长度很长→RSA加密可能性大 搜索 setPublicKey 快速定位加密代码 2. 加密流程解析 加密对象创建 : 参数构造 : 长文本加密 : 3. 关键组件分析 MD5签名 : f(JSON.stringify(e), 32) 生成32位签名 可通过在线MD5工具验证 时间戳 : +new Date() 获取当前时间戳 公钥获取 : 在Console中直接输出 r 变量获取 4. Webpack模块处理 识别模块加载器 : 模块依赖分析 : 9816模块依赖a524模块 需要完整复制所有依赖模块代码 方法补全顺序 : 先补全 m 方法 然后补全 m 依赖的 d 和 b 方法 最后补全 encryptLong 及其依赖的 w 方法 四、完整复现流程 1. 环境搭建 2. 加密函数实现 3. 执行验证 五、关键技巧总结 快速定位技巧 : 搜索关键词: password , encrypt , setPublicKey 观察网络请求中的加密参数特征 模块化代码处理 : 识别加载器(通常包含call/apply) 按需复制依赖模块 注意模块ID类型(数字不加引号,字符串需加引号) 环境补全原则 : 浏览器对象:window, navigator, document等 Node.js环境特殊处理: window = global 调试技巧 : 在关键位置打debugger断点 使用Console输出中间变量值 对比在线加密工具验证加密结果 加密方法识别 : 通过密文长度初步判断 观察是否有设置公钥/私钥的操作 注意是否有初始化向量(IV)等特征 通过以上详细分析和步骤拆解,可以系统性地掌握JS逆向中RSA加密的分析方法和复现技巧。实际应用中需根据具体网站情况灵活调整策略。