精易论坛

标题: node环境下的js改写 [打印本页]

作者: panjunfu    时间: 昨天 17:41
标题: node环境下的js改写
node环境下可以正常执行的js代码如下(在decode函数里面传入正确的参数,可以得到正确的结果),怎么将下面的代码改成能在wt-js工具里面执行,或者怎么能实现在易里面调用这个代码,求大佬指点。

const crypto = require('crypto');

var base64hash = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
function atob(s) {
    s = s.replace(/\s|=/g, '');
    var cur, prev, mod, i = 0, result = [];
    while (i < s.length) {
        cur = base64hash.indexOf(s.charAt(i));
        mod = i % 4;
        switch (mod) {
            case 0: break;
            case 1: result.push(String.fromCharCode(prev << 2 | cur >> 4)); break;
            case 2: result.push(String.fromCharCode((prev & 0x0f) << 4 | cur >> 2)); break;
            case 3: result.push(String.fromCharCode((prev & 3) << 6 | cur)); break;
        }
        prev = cur;
        i++;
    }
    return result.join('');
}

function B(e) {
    let t = e.words.length;
    let n = new Uint8Array(e.sigBytes);
    let r = 0;
    for (let i = 0; i < t; i++) {
        let word = e.words;
        let a = [word >> 24 & 255, word >> 16 & 255, word >> 8 & 255, word & 255];
        for (let t = 0; t < 4 && r < e.sigBytes; t++) n[r++] = a[t];
    }
    return n;
}

function V(e) {
    let t = e.replace(/-/g, '+').replace(/_/g, '/');
    while (t.length % 4) t += '=';
    let n = atob(t);
    let r = n.length;
    let i = new Uint8Array(r);
    for (let e = 0; e < r; e++) i[e] = n.charCodeAt(e);
    return i;
}

async function decryptAES(key, data, iv) {
    let c = crypto.createSecretKey(key, 'raw');
    let d = crypto.createDecipheriv('aes-128-gcm', c, iv);
    d.setAuthTag(data.slice(data.length - 16));
    let res = d.update(data.slice(0, data.length - 16), null, 'utf8') + d.final('utf8');
    return res;
}

function md5(str) {
    let hash = crypto.createHash('md5').update(str).digest();
    let words = [];
    for (let i = 0; i < 16; i += 4) {
        words.push((hash << 24) | (hash[i + 1] << 16) | (hash[i + 2] << 8) | hash[i + 3]);
    }
    return { words, sigBytes: 16 };
}

async function decode(main, par, tt, range = 5, salt = "EncryptKeyByRoss") {
    let buf = V(main);
    let iv = buf.slice(0, 12);
    let body = buf.slice(12);

    for (let i = 0; i <= range; i++) {
               try {
            let key2 = md5(`${ip}-${salt}-${time + i}`);
            let res2 = await decryptAES(B(key2), body, iv);
             console.log("结果:", JSON.parse(res2));
            return;
        } catch {}
    }
    console.log("\n❌ 失败");
}



作者: haoren1212    时间: 昨天 17:41
panjunfu 发表于 2026-6-5 20:39
大概的代码流程知道是这么一回事,AES只用过CBC,ECB这几种,尤其KEY和IV是字节集的就更加蒙圈了,还有那 ...

你需要提供加密数据和解密后的数据
作者: haoren1212    时间: 昨天 19:31
标准的Base64,解码后数据前 12 字节是初始化向量 (IV),剩余部分是密文 + 认证标签(后 16 字节是 GCM 的 Tag)。在 range 范围内(默认 0~5)尝试不同时间偏移,构造字符串:ip - salt - (time + i),并对该字符串做 MD5 得到 16 字节密钥。简单说就是不同时间偏移进行构建数据,然后进行ma5编码。AES‑128‑GCM用上面生成的密钥、IV 和密文(含 Tag)进行解密。base64和md5精易模块,密钥的字符串构建需要你自己仿写,AES‑128‑GCM论坛有
作者: panjunfu    时间: 昨天 20:39
haoren1212 发表于 2026-6-5 19:31
标准的Base64,解码后数据前 12 字节是初始化向量 (IV),剩余部分是密文 + 认证标签(后 16 字节是 GCM 的  ...

大概的代码流程知道是这么一回事,AES只用过CBC,ECB这几种,尤其KEY和IV是字节集的就更加蒙圈了,还有那个md5的结果好像也不是字符串吧,那个base64解码我看代码里面是atob,不知道和精易的编码_BASE64解码是不是一样,大佬能不能写个简单的例子




欢迎光临 精易论坛 (https://bbs.ijingyi.com/) Powered by Discuz! X3.4