icryptor
Version:
Encrypt tools for private accounts
88 lines (72 loc) • 2.12 kB
JavaScript
const path = require('path')
const adm_zip = require('adm-zip')
const readline = require('readline-sync')
const chacha = require('chacha-js')
const blake2b = require('blake2b')
const fs = require('fs')
const program = require('commander')
function b2b(data) {
var h=blake2b(32)
h.update(data)
return Buffer.from(h.digest())
}
var nonce=Buffer.alloc(12)
nonce.fill(0)
function cc(data,key) {
var c=new chacha.ChaCha20(key,nonce)
return c.update(data)
}
program
.version("1.0.1")
.option('-d, --decode [type]', 'decode')
.option('-e, --encode [type]', 'encode')
.option('-p, --password [type]', 'password')
.option('-c, --count [type]', 'encrypt count')
.parse(process.argv);
if(program.encode) {
program.encode= path.resolve(process.cwd(),program.encode)
console.log('encode: '+program.encode)
}
if(program.decode) {
program.decode = path.resolve(process.cwd(),program.decode)
console.log('decode: '+program.decode)
}
if(!program.password) {
program.password=readline.question("Input Password: ",{
hideEchoBack: true,
})
}
if(!program.count) {
program.count = 100
}
var password = Buffer.from(program.password,"binary")
var passwords=[]
for(var i=0; i<program.count; i++) {
if(i===0) {
passwords.push(b2b(password))
} else {
passwords.push(b2b(passwords[i-1]))
}
}
if(program.encode) {
var zip = new adm_zip()
zip.addLocalFolder(program.encode)
zip.writeZip(program.encode+"_zip",true)
var data=fs.readFileSync(program.encode+"_zip")
for(var i=0;i<program.count;i++) {
data=cc(data,passwords[i])
}
fs.writeFileSync(program.encode+"_c",data)
fs.unlinkSync(program.encode+"_zip")
}
if (program.decode) {
var data=fs.readFileSync(program.decode)
for(var i=0;i<program.count;i++) {
data=cc(data,passwords[program.count-i-1])
}
fs.writeFileSync(program.decode+"_zip",data)
var unzip = new adm_zip(program.decode+"_zip")
unzip.extractAllTo(program.decode+"_p",true)
fs.unlinkSync(program.decode+"_zip")
}