| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 | 'use strict';/** * * * @author Mai * @date * @version */const crypto = require('crypto-js');const fs = require('fs');const path = require('path');const encryptSpr = '|----|';const baseKey = crypto.enc.Utf8.parse('Sc3850?Calc888Zh'); // 十六位十六进制数作为密钥const baseIv = crypto.enc.Utf8.parse('Zh888!Sc3850Calc'); // 十六位十六进制数作为密钥偏移量const baseUtils = {    aesDecrypt: function(str, key, iv) {        const encryptedHexStr = crypto.enc.Hex.parse(str);        const src = crypto.enc.Base64.stringify(encryptedHexStr);        const decrypt = crypto.AES.decrypt(src, key, {            iv,            mode: crypto.mode.CBC,            padding: crypto.pad.Pkcs7,        });        const decryptedStr = decrypt.toString(crypto.enc.Utf8);        return decryptedStr.toString();    },    aesEncrypt: function(str, key, iv) {        const src = crypto.enc.Utf8.parse(str);        const encrypted = crypto.AES.encrypt(src, key, {            iv,            mode: crypto.mode.CBC,            padding: crypto.pad.Pkcs7,        });        return encrypted.ciphertext.toString().toUpperCase();    },    md5: function(str) {        return crypto.MD5(str).toString();    },    decryptBuffer: function(buffer) {        try {            const result = [];            const arr = buffer.split(encryptSpr);            const header = JSON.parse(this.aesDecrypt(arr[0], baseKey, baseIv));            header.key = crypto.enc.Hex.parse(header.key);            header.iv = crypto.enc.Hex.parse(header.iv);            arr.shift();            const check = this.md5(arr.join(encryptSpr));            if (check !== header.check) throw '文件被篡改';            for (const a of arr) {                result.push(JSON.parse(this.aesDecrypt(a, header.key, header.iv)));            }            return header.data === 'array' ? result : result[0];        } catch(err) {            throw err;        }    },    getRamdonHeader: function () {        return {            key: crypto.lib.WordArray.random(16),            iv: crypto.lib.WordArray.random(16),        };    },    encryptBuffer: function(data) {        const datas = data instanceof Array ? data : [data];        const header = this.getRamdonHeader();        const arr = [];        for (const d of datas) {            arr.push(this.aesEncrypt(JSON.stringify(d), header.key, header.iv ));        }        header.key = header.key.toString();        header.iv = header.iv.toString();        header.check = this.md5(arr.join(encryptSpr));        header.data = data instanceof Array ? 'array' : 'object';        return this.aesEncrypt(JSON.stringify(header), baseKey, baseIv) + encryptSpr + arr.join(encryptSpr);    },};class baseFile {    doDecrypt(str) {    }    async decrypt(file) {        const str = await fs.readFileSync(file, 'utf-8');        return this.doDecrypt(str);    }    async recursiveMkdirSync(pathName) {        if (!fs.existsSync(pathName)) {            const upperPath = path.dirname(pathName);            if (!fs.existsSync(upperPath)) {                await this.recursiveMkdirSync(upperPath);            }            await fs.mkdirSync(pathName);        }    }    doEncrypt(data) {    }    async encrypt(data, file) {        const buffer = this.doEncrypt(data);        // 检查文件夹是否存在,不存在则直接创建文件夹        const pathName = path.dirname(file);        if (!fs.existsSync(pathName)) await this.recursiveMkdirSync(pathName);        await fs.writeFileSync(file, buffer);    }}class cpd extends baseFile {    doEncrypt(data) {        return baseUtils.encryptBuffer(data);    }    doDecrypt(str) {        return baseUtils.decryptBuffer(str);    }}module.exports = {    cpd};
 |