首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果流将被中断,则节点解密流抛出EVP_DecryptFinal_ex:wrong最终块长度

如果流将被中断,则节点解密流抛出EVP_DecryptFinal_ex:wrong最终块长度
EN

Stack Overflow用户
提问于 2014-08-14 15:30:31
回答 1查看 378关注 0票数 2

我有一个node.js客户端下载和解密加密的文件从另一个主机。

代码语言:javascript
运行
复制
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();
});

如果另一台主机在完成请求之前意外关闭了连接,则上面的代码将抛出此错误:

代码语言:javascript
运行
复制
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(() {...}));处理程序,但它不会被调用。我还试着添加

代码语言:javascript
运行
复制
response.on('end', function() { aes.emit('close'); });
response.on('close', function() { aes.emit('close'); });

但是aes.on('end',...);将不会被调用。将aes.emit('end')添加到该语句没有任何意义,因为如果出现导致上述错误的错误,也会调用该语句。

代码语言:javascript
运行
复制
response.on('end', function() { aes.emit('end'); aes.emit('close'); });
response.on('close', function() { aes.emit('end'); aes.emit('close'); });

有谁知道如何捕捉这个错误吗?

非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2014-08-14 20:10:45

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25302390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档