加密文件:
1、注意crypto的方法,createCipheriv中的参数algorithm必须为"aes-128-cbc"
2、encryptStream.setAutoPadding(true);
3、文件可压缩,也可不压缩gzip
var crypto = require("crypto"); //用来加密
var fs = require("fs");
var zlib = require("zlib"); //用来压缩
const path = require("path");
let myfiles = [];
const courseName = "xx060101jzlgcnl";
const resDir =
__dirname + "/dist_electron/static/t/" + courseName + "/mp4/fhd";
const desDir =
__dirname + "/dist_electron/static/t/" + courseName + "/mp4/fhd";
console.time("mp4Encrypt");
const files = fs.readdirSync(resDir);
for (let i = 0; i < files.length; i++) {
const file = files[i];
const states = fs.statSync(resDir + "/" + file);
const extname = path.extname(file);
if (
!states.isDirectory() &&
(extname == ".m3u8" || extname == ".ts" || extname == ".mp4")
) {
myfiles.push(file);
}
}
walk(resDir, desDir, courseName, 0, myfiles);
console.timeEnd("mp4Encrypt");
function walk(resDir, desDir, courseName, i, files) {
const consts = {
cryptkey: "填写自己的cryptkey",
iv: "填写自己的iv",
};
var encryptStream = crypto.createCipheriv(
"aes-128-cbc",
consts.cryptkey,
consts.iv
);
encryptStream.setAutoPadding(true);
var gzip = zlib.createGzip();
const file = files[i];
const states = fs.statSync(resDir + "/" + file);
console.log(resDir + "/" + file);
const extname = path.extname(file);
if (
!states.isDirectory() &&
(extname == ".m3u8" || extname == ".ts" || extname == ".mp4")
) {
var readStream = fs.createReadStream(resDir + "/" + file);
var writeStream = fs.createWriteStream(desDir + "/" + file + ".kd");
readStream //读取
.pipe(encryptStream) //加密
.pipe(gzip) //压缩
.pipe(writeStream) //写入
.on("finish", function () {
//写入结束的回调
console.log("done");
readStream.close();
i++;
if (i < files.length) {
walk(resDir, desDir, courseName, i, files);
}
});
}
}
解密视频文件:
1、注意解密方法 createDecipheriv
2、修改cryptkey 和 iv
var crypto = require("crypto"); //用来加密
var fs = require("fs");
var zlib = require("zlib"); //用来压缩
const path = require("path");
let myfiles = [];
const courseName = "xx060101jzlgcnl";
const resDir =
__dirname + "/dist_electron/static/t/" + courseName + "/mp4/fhd";
const desDir =
__dirname + "/dist_electron/static/t/" + courseName + "/mp4/fhd";
console.time("mp4Dencrypt");
const files = fs.readdirSync(resDir);
if (files.length > 0) {
for (let i = 0; i < files.length; i++) {
const file = files[i];
const states = fs.statSync(resDir + "/" + file);
const extname = path.extname(file);
if (!states.isDirectory() && extname == ".kd") {
myfiles.push(file);
}
}
if (myfiles.length > 0) {
walk(resDir, desDir, courseName, 0, myfiles);
}
}
console.timeEnd("mp4Dencrypt");
function walk(resDir, desDir, courseName, i, files) {
const consts = {
cryptkey: "填写自己的cryptkey",
iv: "填写自己的iv",
};
var decryptStream = crypto.createDecipheriv(
"aes-128-cbc",
consts.cryptkey,
consts.iv
);
decryptStream.setAutoPadding(true);
var gzip = zlib.createGunzip(); //解压
const file = files[i];
const states = fs.statSync(resDir + "/" + file);
const extname = path.extname(file);
if (!states.isDirectory()) {
console.log(resDir + "/" + file);
//*
var readStream = fs.createReadStream(resDir + "/" + file);
var writeStream = fs.createWriteStream(
desDir + "/" + file.replace(".kd", "")
);
readStream //读取
.pipe(gzip) //解压
.pipe(decryptStream) //解密
.pipe(writeStream) //将解密
.on("finish", function () {
//解压后的回调
console.log("done");
i++;
if (i < files.length) {
walk(resDir, desDir, courseName, i, files);
}
});
//*/
}
}