问题描述
我的密钥:crypto.createHash('sha256').update('mySup3rC00lP4ssWord').digest()
我的四:crypto.randomBytes(16)
我尝试此页面中的方法:https://medium.com/@brandonstilson/lets-encrypt-files-with-node-85037bea8c0e
我使用 aes-256-cbc 解密一个 enc 文件,这是我的加密,文件路径是我的位置
C:\Users\芊翅\AppData\Roaming\vue-electron
function fileRead () {
const AppendInitVect = require('../utils/appendInitVect') // 修改數據
const path = app.getPath('userData') // appData的位址
const cipher = crypto.createCipheriv('aes-256-cbc',Key,initVect)
const appendInitVect = new AppendInitVect(initVect)
const readStream = fs.createReadStream(path + '\\config.json') // 讀檔
const gzipStream = zlib.createGzip() // 壓縮檔案
const writeStream = fs.createWriteStream(path + '\\config.json.enc') // 新檔案
readStream.pipe(gzipStream).pipe(cipher).pipe(appendInitVect).pipe(writeStream) // 壓縮再寫檔
}
这是我的加密文件,看是加密文件! enter image description here
但我的问题开始了...当我解密这个 enc 文件时,它会得到错误 my iv is undefined ,
因为 readIv.on('data',(chunk) => { console.log('data') initVect = chunk // this is not work!!!!initVect is undefiend })
不起作用,所以我的 initVect 无法找到,我该如何修复它?
这是我的解密...
function unFileRead () {
const path = app.getPath('userData') // appData的位址
const readIv = fs.createReadStream(path + '\\config.json.enc',{ end: 15 }) // 創建iv讀取的steam
console.log('decrpt path:',path + '\\config.json.enc')
let initVect
readIv.on('data',(chunk) => {
console.log('data')
initVect = chunk // this is not work!!!!initVect is undefiend
})
console.log('initVect:',initVect)
readIv.on('close',() => {
console.log('hello')
const unzip = zlib.createUnzip()
const readStream = fs.createReadStream(path + '\\config.json.enc',{ start: 16 })
const decipher = crypto.createDecipheriv('aes-256-cbc',initVect)
console.log('decipher:',decipher)
const writeStream = fs.createWriteStream(path + '\\config.json.unenc') // 寫檔
readStream.pipe(decipher).pipe(unzip).pipe(writeStream)
})
}
解决方法
这里要理解的关键是同步和异步代码的区别。 initVect
同步初始化为 undefined
,异步设置。因此,当您尝试在 console.log
和 initVect
回调之外 data
close
时,它仍然是 undefined
,因为该行是同步运行的.
如果您将 console.log('initVect:',initVect)
移到 console.log('hello')
下方,您应该会看到它。
希望有所帮助。