这是我第一个关于堆栈溢出的问题。我试图建立一个小工具,我可以用来加密和解密配置文件。我为所有文件生成一个密钥,然后将该密钥传递给加密函数。然后当我去解密时,我从文件中阅读密钥,并将其传递给解密函数。与initVector相同。我可以加密就好,但当我去解密我得到“坏解密”错误。下面是代码。请原谅草率的代码,我是新来的,我只是想让它工作,我会重构和清理它一旦它。谢谢你。
const crypto = require ("crypto")
const fs = require ("fs")
var prompt = require('prompt');
const Crypt = require('./crypt.js')
var eschema = {
properties: {
fpath: {
description: 'Enter path to files to encrypt: ',
type: 'string',
default: "./config/unsafe"
},
epath: {
description: 'Enter path to store encrypted files: ',
type: 'string',
default: "./encrypted"
},
kpath: {
description: 'Enter path to store key and vector files: ',
type: 'string',
default: "./"
}
}
};
var dschema = {
properties: {
fpath: {
description: 'Enter path to files to decrypt: ',
type: 'string',
default: "./encrypted"
},
dpath: {
description: 'Enter path to store decrypted files: ',
type: 'string',
default: "./"
},
vpath: {
description: 'Enter path to key and vector files: ',
type: 'string',
default: "./"
}
}
};
console.log(process.argv[2])
if(process.argv[2] == '-e'){
prompt.start()
prompt.get(eschema, function (err, result){
if(err){
throw err;
}
iv = crypto.randomBytes(16)
k = crypto.randomBytes(32)
let vector = iv.toString('hex').slice(0, 16);
let key = k.toString('hex').slice(0,32)
Crypt.encrypt(key, vector, result.fpath, result.epath)
fs.mkdir(result.epath, (err) => {
if (err) {
throw err;
}
fs.writeFile(result.kpath +`key`, key, err => {
if (err) {
console.error(err)
}
})
fs.writeFile(result.kpath +`vector`, vector, err => {
if (err) {
console.error(err)
}
})
})
})
}else if(process.argv[2] == '-d'){
prompt.start()
prompt.get(dschema, function (err, result){
if(err){
throw err;
}
let key = fs.readFileSync(result.vpath + "key" )
let vector = fs.readFileSync(result.vpath + "vector")
Crypt.decrypt(key, vector, result.fpath)
})
}else{
console.log("Please pass 'encrypt' or 'decrypt'")
}
const crypto = require ("crypto")
const fs = require ("fs")
class Crypt {
encrypt(key, vector, path, epath){
fs.readdir(path, (err, files) => {
if (err) {
throw err
}
console.log(key)
console.log(vector)
files.forEach(file => {
console.log("Encrypting: " + file)
let cipher = crypto.createCipheriv("aes-256-cbc", key, vector);
let rfile = path + "/" + file
let data = fs.readFileSync(rfile)
let encryptedData = cipher.update(data, "utf-8", "hex");
encryptedData += cipher.final("hex");
let eobj = {
vi: vector,
content: encryptedData
}
fs.writeFile(epath + '/' + file + '.enc', encryptedData, err => {
if (err) {
console.error(err)
}
})
})
})
}
decrypt(key, vector, path, dpath){
fs.readdir(path, (err, files) => {
if (err){
throw err
}
console.log("Decrypting:")
console.log(files)
files.forEach(file => {
let rfile = path + "/" + file
let data = fs.readFileSync(rfile)
console.log('Key: ' + key)
console.log('Vector: ' + vector)
let decipher = crypto.createDecipheriv("aes-256-cbc", key, vector);
let decryptedData = decipher.update(data, "hex", "utf-8")
decryptedData += decipher.final("utf8");
console.log("Decrypted message: " + decryptedData);
})
})
}
}
module.exports = new Crypt
1条答案
按热度按时间pgx2nnw81#
解决这个问题的方法是,我没有将向量作为二进制传递,而是作为字符串传递,这导致了这个问题。