参考:

https://cryptojs.gitbook.io/docs

1. 简介

在前端页面中,涉及 AES,DES 加密解密时,一般使用的前端模块是Crypto-js,那么了解Crypto-js的加密解密过程,和操作对象,有利于减少前端页面的跟栈工作,可以从加密,解密的中间对象中,快速还原KEYIV,和密文

2. 原理图

669fda3c0aa4d.png

简单概括加密解密的过程,Crypto-js模块的工作原理是:

  • 从各种编码的 字符串,解析转换为CryptoJS.lib.WordArray字节数组对象;

  • CryptoJS.lib.WordArray字节数组对象.toString(CryptoJS.enc.Utf8(Base64\Hex))方法编码转换为各种编码的 字符串;

本质就是字符串和加密对象的相互转换,掌握关键方法就可以,在加密端点出,通过中间变量还原关键参数

3. 加密、解密的实现

3.1. 加密、解密的函数执行写法

const CryptoJS = require('crypto-js');

function aes_encrypt(text, key, iv, mode, padding) {
  const encrypted_text = CryptoJS.AES.encrypt(text, key, {
    iv: iv,
    mode: mode,
    padding: CryptoJS.pad[padding]
  }).toString();
  return encrypted_text;
}

function aes_decrypt(encrypted_text, key, iv, mode, padding) {
  const decrypted_bytes = CryptoJS.AES.decrypt(encrypted_text, key, {
    iv: iv,
    mode: mode,
    padding: CryptoJS.pad[padding]
  });
  const decrypted_text = decrypted_bytes.toString(CryptoJS.enc.Utf8);
  return decrypted_text;
}

一般情况,我们下完断点后,可以在 text,key,iv 参数上看见字节数组对象的值,见下图:

还原 key 值 n 的 utf-8 字符串

669fd9a32126d.png

669fd9ce16b0e.png669fd9cf1af36.png

3.2. 还原函数

注意 key 和 iv 编码时,不一定是 UTF8 这里可能需要转换

// 方式1 找到 key 和 iv 的数组值,带入还原
//let res = CryptoJS.lib.WordArray.create(xxx.words).toString(cryptoJS.enc.Utf8)
let res = CryptoJS.lib.WordArray.create([1148467306,964118391, 624314466,2019968622]).toString(cryptoJS.enc.Utf8)
console.log(res)

// 方式2 直接从 key 和 iv 的值进行还原
let res = CryptoJS.enc.Utf8.stringify(parse_res)
console.log(res)

特殊情况:

  • 有时候我们对 iv 参数进行逆向还原时,会报错,这种情况需要考虑是否是因为 iv 为空;

669fd9cf14198.png

文章作者: Mark
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 有限进步
脚本/工具 JavaScript 爬虫
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝