Javascript 使用crypto nodejs解密大文件
我正在描述一个大文件(450mb) 我正在使用fs.createReadStream读取文件,并使用crypto js进行解密 该文件已用UTF8加密 文件的内容是JSON 我的功能:Javascript 使用crypto nodejs解密大文件,javascript,node.js,cryptojs,Javascript,Node.js,Cryptojs,我正在描述一个大文件(450mb) 我正在使用fs.createReadStream读取文件,并使用crypto js进行解密 该文件已用UTF8加密 文件的内容是JSON 我的功能: function decryptFile(srcDir, fileName, destDir) { let encryptedPath = path.join(srcDir, fileName); let decryptedPath = path.join(destDir, fileName).
function decryptFile(srcDir, fileName, destDir) {
let encryptedPath = path.join(srcDir, fileName);
let decryptedPath = path.join(destDir, fileName).replace('.xam', '.json');
console.log('DECRYPTING XAM FILE ' + encryptedPath + ' TO ' + decryptedPath);
const input = fs.createReadStream(encryptedPath);
input.once('readable', () => {
const decipher = crypto.createDecipher('xxx-xxx-xxx', 'XxxX');
const output = fs.createWriteStream(decryptedPath);
input.pipe(decipher).pipe(output).on('finish', () => {
console.log('FILE DECRYPTED');
}).on('error', error => {
console.log(error);
});
});
}
Error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
at Decipher._flush (crypto.js:158:28)
at Decipher.prefinish (_stream_transform.js:137:10)
at emitNone (events.js:106:13)
at Decipher.emit (events.js:208:7)
at prefinish (_stream_writable.js:602:14)
at finishMaybe (_stream_writable.js:610:5)
at afterWrite (_stream_writable.js:464:3)
at onwrite (_stream_writable.js:454:7)
at Decipher.afterTransform (_stream_transform.js:90:3)
at Decipher._transform (crypto.js:153:3)
更新
错误:
function decryptFile(srcDir, fileName, destDir) {
let encryptedPath = path.join(srcDir, fileName);
let decryptedPath = path.join(destDir, fileName).replace('.xam', '.json');
console.log('DECRYPTING XAM FILE ' + encryptedPath + ' TO ' + decryptedPath);
const input = fs.createReadStream(encryptedPath);
input.once('readable', () => {
const decipher = crypto.createDecipher('xxx-xxx-xxx', 'XxxX');
const output = fs.createWriteStream(decryptedPath);
input.pipe(decipher).pipe(output).on('finish', () => {
console.log('FILE DECRYPTED');
}).on('error', error => {
console.log(error);
});
});
}
Error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
at Decipher._flush (crypto.js:158:28)
at Decipher.prefinish (_stream_transform.js:137:10)
at emitNone (events.js:106:13)
at Decipher.emit (events.js:208:7)
at prefinish (_stream_writable.js:602:14)
at finishMaybe (_stream_writable.js:610:5)
at afterWrite (_stream_writable.js:464:3)
at onwrite (_stream_writable.js:454:7)
at Decipher.afterTransform (_stream_transform.js:90:3)
at Decipher._transform (crypto.js:153:3)
更新标题我已经实现了相同的功能来模拟您的问题。我也犯了同样的错误。您遇到了一个已知问题。请遵循本指南。它起作用了。测试它
const crypto2 = require('crypto');
var fs = require('fs');
function decryptFile(fileName) {
const input = fs.createReadStream(fileName+'.encrypted');
const output = fs.createWriteStream(fileName+'.unencrypted');
const initVect = crypto2.randomBytes(16);
const CIPHER_KEY = new Buffer('12345678901234567890123456789012');
const decipher = crypto2.createDecipheriv('aes-256-cbc', CIPHER_KEY, initVect);
input.pipe(decipher).pipe(output).on('finish', () => {
console.log('FILE DECRYPTED');
}).on('error', error => {
console.log(error);
});
}
function encryptFile(fileName) {
const initVect = crypto2.randomBytes(16);
const CIPHER_KEY = new Buffer('12345678901234567890123456789012');
var aes = crypto2.createCipheriv('aes-256-cbc', CIPHER_KEY, initVect);
const input = fs.createReadStream(fileName);
const output = fs.createWriteStream(fileName+'.encrypted');
input
.pipe(aes)
.pipe(output)
.on('finish', function () {
console.log('done encrypting');
});
}
encryptFile('cas_01.cas');
//decryptFile('cas_01.cas');
我已经实现了同样的方法来模拟您的问题。我也犯了同样的错误。您遇到了一个已知问题。请遵循本指南。它起作用了。测试它
const crypto2 = require('crypto');
var fs = require('fs');
function decryptFile(fileName) {
const input = fs.createReadStream(fileName+'.encrypted');
const output = fs.createWriteStream(fileName+'.unencrypted');
const initVect = crypto2.randomBytes(16);
const CIPHER_KEY = new Buffer('12345678901234567890123456789012');
const decipher = crypto2.createDecipheriv('aes-256-cbc', CIPHER_KEY, initVect);
input.pipe(decipher).pipe(output).on('finish', () => {
console.log('FILE DECRYPTED');
}).on('error', error => {
console.log(error);
});
}
function encryptFile(fileName) {
const initVect = crypto2.randomBytes(16);
const CIPHER_KEY = new Buffer('12345678901234567890123456789012');
var aes = crypto2.createCipheriv('aes-256-cbc', CIPHER_KEY, initVect);
const input = fs.createReadStream(fileName);
const output = fs.createWriteStream(fileName+'.encrypted');
input
.pipe(aes)
.pipe(output)
.on('finish', function () {
console.log('done encrypting');
});
}
encryptFile('cas_01.cas');
//decryptFile('cas_01.cas');
我唯一不清楚的是。。。说到cryptojs,你的意思很可能是新版本的nodeyes中的内置加密模块,我的错……你需要使用iv函数。我简化了很多只是为了模拟。但它是有效的。我唯一不清楚的是。。。说到cryptojs,你的意思很可能是新版本的nodeyes中的内置加密模块,我的错……你需要使用iv函数。我简化了很多只是为了模拟。很抱歉,我没有看到你的实现我用java加密,使用AES/ECB/PKCS5Padding没有测试它,但这里有一个确切的答案:我使用crypto.createDecipheriv('AES-128-ECB',CIPHER_KEY,initVect),正如你所说。但生成了另一个错误:错误:无效IV长度检查最后一个链接。我们/他们都有相同的问题。长度取决于方法。抱歉,我没有看到您的实现我用java加密,使用AES/ECB/PKCS5Padding没有测试它,但下面是确切的答案:我使用crypto.createDecipheriv('AES-128-ECB',CIPHER_KEY,initVect),正如您所说。但生成了另一个错误:错误:无效IV长度检查最后一个链接。我们/他们都有相同的问题。长度取决于方法。