前端逆向中 AES,DES 使用 Crypto-js 模块加密时,如果快速找到 key 和 iv 值
参考:
https://cryptojs.gitbook.io/docs
1. 简介
在前端页面中,涉及 AES,DES 加密解密时,一般使用的前端模块是Crypto-js
,那么了解Crypto-js
的加密解密过程,和操作对象,有利于减少前端页面的跟栈工作,可以从加密,解密的中间对象中,快速还原KEY
,IV
,和密文
2. 原理图
简单概括加密解密的过程,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 字符串
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 为空;
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
有限进步!
喜欢就支持一下吧
打赏
微信
支付宝