javascript - Node 加密解密流抛出 EVP_DecryptFinal_ex :wrong final block length if stream will be interrupted

标签 javascript node.js encryption stream aes

我有一个 node.js 客户端,它从另一台主机下载并解密 AES 加密文件。

var base64 = require('base64-stream');
var crypto = require('crypto');
var aes = crypto.createDecipher('aes-256-cbc', crypto.createHash('sha256').update(pass).digest('hex'));

// file stream
var file = fs.createWriteStream(params.target);
var base64reader = base64.decode();
response.pipe(base64reader)  // decode base64
        .pipe(aes)              // decrypt
        .pipe(file);            // write in file

// on last data chunk received: file load complete
aes.on('end', function (chunk) {
    if (typeof params.success !== 'undefined')
        params.success();
});

如果其他主机在完成请求之前意外关闭了他的连接,上面的代码会抛出这个错误:

TypeError: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
    at Decipher.Cipher._flush (crypto.js:262:27)
    at Decipher.eval (_stream_transform.js:130:12)
    at Decipher.g (events.js:187:16)
    at Decipher.EventEmitter.emit (events.js:95:17)
    at prefinish (_stream_writable.js:427:12)
    at finishMaybe (_stream_writable.js:435:7)
    at afterWrite (_stream_writable.js:317:3)
    at onwrite (_stream_writable.js:307:7)
    at WritableState.onwrite (_stream_writable.js:100:5)
    at afterTransform (_stream_transform.js:99:5)
    at TransformState.afterTransform (_stream_transform.js:74:12)
    at Decipher.Cipher._transform (crypto.js:258:3)
    at Decipher.Transform._read (_stream_transform.js:179:10)
    at Decipher.Readable.read (_stream_readable.js:334:10)
    at flow (_stream_readable.js:743:26)
    at WriteStream.eval (_stream_readable.js:601:7)

我尝试添加一个 aes.on('error', function(() {...}); 处理程序但它不会被调用。我也尝试添加

response.on('end', function() { aes.emit('close'); });
response.on('close', function() { aes.emit('close'); });

然后 aes.on('end', ...);不会被调用。将 aes.emit('end') 添加到此语句没有任何意义,因为在出​​现导致上述错误的错误时也会调用它。

response.on('end', function() { aes.emit('end'); aes.emit('close'); });
response.on('close', function() { aes.emit('end'); aes.emit('close'); });

有没有人知道我如何捕获这个错误?

非常感谢!!

最佳答案

这是 node.js v0.11.9 中的一个错误,已在 v0.11.13 中解决。然后 aes.on('error', ...) 将被正确调用。

关于javascript - Node 加密解密流抛出 EVP_DecryptFinal_ex :wrong final block length if stream will be interrupted,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25302390/

相关文章:

javascript - Angular 2 - MEAN MongoDB NodeJS

javascript - 如何在 JavaScript 响应中使用 image_tag?

javascript - 为什么这个关键字不能用其他东西代替?

javascript - 如何在悬停时重叠 Owl Carousel 中的元素?

node.js - 从 Firebase 函数访问 Google 网站验证 API

node.js - Maven 前端构建在生成源阶段运行两次

node.js - HTTP 代理错误状态码

java - 密码学 : AES/CTR Decryption

windows - NetTcpBinding(读取 WindowsStreamSecurityBindingElement)如何加密/签署消息?

typescript - Go中 typescript 解密中的AES加密