5

我创建了一个传递两个缓冲区的密码。buf1 是它们的键,一个 32 字节的缓冲区,而 buf2 是 IV,也是一个 32 字节的缓冲区,我将其切片为仅使用 16 个字节。文档说 cipher.update 和 cipher.final 在未指定任何内容时返回一个缓冲区。这实际上是我希望发生的事情。虽然我想我可以做一个新的 Buffer(crypted, 'binary') 来转换它,但我想知道我是否做错了什么。

> var cipher = crypto.createCipheriv('aes-256-cbc', buf1, buf2.slice(0,16));
undefined
> var crypted = cipher.update(new Buffer('this is some test'));
undefined
> crypted += cipher.final();
'!t\u001f\u0004>.\u0012\u0001���K\u001bSiA�]3\u0017�6�&�.��\u0015�V?'
0> Buffer.isBuffer(crypted)
false

http://nodejs.org/api/crypto.html#crypto_class_cipher

我正在使用 node.js 版本 0.10.10,它是最新的稳定版,据说与链接的文档相匹配:

$ node -v
v0.10.10

这是文档错误还是我的错误?我知道使用 v0.8 pbkdf2 返回二进制字符串而不是缓冲区,现在使用 0.10.10 它返回文档所述的缓冲区。我希望 cipher 也可以使用缓冲区而不是使用二进制来处理这一切......以保持一致性。

4

1 回答 1

8

您正在使用+=它将缓冲区转换为字符串来连接它们。您的代码应该更像这样:

var cipher = crypto.createCipheriv('aes-256-cbc', buf1, buf2.slice(0,16));
var cryptedBuffers = [cipher.update(new Buffer('this is some test'))];
cryptedBuffers.push(cipher.final());

// at this point `cryptedBuffers` is an array of buffers which you can turn 
// into a single buffer by doing

var crypted = Buffer.concat(cryptedBuffers);
于 2013-06-07T18:59:26.117 回答