首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Nodejs中使用Crypto对二进制数据进行加解密

如何在Nodejs中使用Crypto对二进制数据进行加解密
EN

Stack Overflow用户
提问于 2018-05-25 17:43:20
回答 2查看 1.5K关注 0票数 0

我有一个新的使用加密加密音频数据在NodeJs。当我试图解密数据时,我得到了一些错误输出。这是我的测试代码。

代码语言:javascript
复制
function encrypt (buf, key) {
    const cipher = crypto.createCipheriv('des-ecb', key, new Buffer(0))
    let c = cipher.update(Buffer.from(buf))
    c += cipher.final('binary')
    return c
 }

function decrypt (buf, key) {
    const cipher = crypto.createDecipheriv('des-ecb', key, new Buffer(0))
    let c = cipher.update(buf)
    c += cipher.final('binary')
    return c
}


let pcmbuf = fs.readFileSync("test.pcm")
let enc = encrypt(pcmbuf,gen_key())
let dec = decrypt(enc,gen_key())
fs.writeFileSync('dec.pcm',dec)

当我运行这段代码时,它产生了一个错误。细节看起来就像是贝洛特。

代码语言:javascript
复制
internal/crypto/cipher.js:104
  var ret = this._handle.final();
                         ^

Error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
    at Decipheriv.final (internal/crypto/cipher.js:104:26)
    at decrypt (/home/zsc/asr-js/test.js:60:17)
    at Object.<anonymous> (/home/zsc/asr-js/test.js:67:11)
    at Module._compile (module.js:660:30)
    at Object.Module._extensions..js (module.js:671:10)
    at Module.load (module.js:573:32)
    at tryModuleLoad (module.js:513:12)
    at Function.Module._load (module.js:505:3)
    at Function.Module.runMain (module.js:701:10)
    at startup (bootstrap_node.js:190:16)

我怎么才能解决这个问题。谢谢你回答我的问题!

EN

回答 2

Stack Overflow用户

发布于 2019-02-07 10:19:05

显然,问题出在不同语言的加密/解密的padding...because上……答案是node.js github问题页面上的here

引用答案

因此,在创建

实例后调用decrypt.setAutoPadding(false);将使其正常工作:

代码语言:javascript
复制
var crypto = require('crypto');

//the encrypted result
var theCipher = "ccZmMULq3tlzAY+iafZz+96xz+qFsAuGpEjhN7CckJTcdBT03fgobfSVGCGYzILyPNSA3e3msUqHUTCpv8kRnWvFdLv9c+GTEhg+Lj5dOThGDHtkQX2j5bd6Eubw9/l+Lcwj0PeyW0ZoVkB5Nnp1yCnmKAn2Euliq+IurgthT+wln6cQmTjXfL4IB5VxwUEb72FcbeiCfbKxa+MxxbcQTCpli3ErSptwdp9on2k87JTPFqyyMmMRFA9VgOXpHNe43IwFzME01DyHZ+Rp/eQguTmY9FtkFIZeD2e2nrbbDbW6tlk/KOtdhGVIlIGMPNS5m8LYqlrGZlJU3JythEy+J0z1wW1owjVe9Yto2OtUe8WeKI744enBKAX4FnD4My7+/XRjbF5kf6loT9lqeMCdXFb3LDej3GVcKWbJuZjXmD4="

var key = "abcdefghijklmnopqrstuvwx"

var decrypt = crypto.createDecipheriv('des-ede3', key, "");

//Add the auto padding here....IT HAVE TO BE after creating the decipher immeditely
decrypt.setAutoPadding(false);

var s = decrypt.update(theCipher, 'base64', 'utf8');

console.log(s + decrypt.final('utf8'));
票数 2
EN

Stack Overflow用户

发布于 2018-05-29 10:53:36

终于来了。我找到了解决那个案子的办法。将二进制编码的字符串作为参数传递,而不是传递buffer。代码如下。

代码语言:javascript
复制
function encrypt (buf, key) {
    const cipher = crypto.createCipheriv('des-ecb', key, new Buffer(0))
    let c = cipher.update(buf,'binary','base64')
    c += cipher.final('base64')
    return c
 }

function decrypt (buf, key) {
    const cipher = crypto.createDecipheriv('des-ecb', key, new Buffer(0))
    let c = cipher.update(buf,'base64','base64')
    c += cipher.final('base64')
    return c
}

let pcmbuf = fs.readFileSync("test.pcm")
let enc = encrypt(pcmbuf.toString('binary'),gen_key())
let dec = decrypt(enc,gen_key())
fs.writeFileSync('dec.pcm',Buffer.from(dec,'base64'))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50526175

复制
相关文章

相似问题

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