【发布时间】:2017-04-01 13:32:48
【问题描述】:
我正在尝试使用“des-cbc”算法在 Node.js 7.5.0 中执行加密。根据RFC 1423,这个算法需要一个64位的加密密钥,以及一个64位的初始化向量。
我正在尝试使用由 8 个 Latin-1 字符组成的键和 iv;但是,Node 说“错误:IV 长度无效”。下面是一些示例代码:
let crypto = require('crypto');
let key = '\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8',
iv = '\xb8\xb7\xb6\xb5\xb4\xb3\xb2\xb1';
let cipher = crypto.createCipheriv('des-cbc', Buffer.from(key), Buffer.from(iv));
如果我将 iv 更改为 8 个 ASCII 字符,那么 Node 会说,“错误:无效的密钥长度”:
let crypto = require('crypto');
let key = '\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8',
iv = 'abcdefgh';
let cipher = crypto.createCipheriv('des-cbc', Buffer.from(key), Buffer.from(iv));
但如果 key 和 iv 都是 8 个 ASCII 字符,它可以工作:
let crypto = require('crypto');
let key = 'hgfedcba',
iv = 'abcdefgh';
let cipher = crypto.createCipheriv('des-cbc', Buffer.from(key), Buffer.from(iv));
为什么不能将 Latin-1 字符用于 key 和 iv?
【问题讨论】:
-
你应该使用
Buffer.from(key, "binary") -
不要使用 DES 它不安全,已经被 AES 取代,使用 AES 本质上是一样的。此外,DES 不使用每个字节的 lsb,因此
xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8实际上是\xb0\xb2\xb2\xb4\xb4\xb6\xb6\xb8。 -
或者你会使用一个数组:
const buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);。我假设当前缓冲区被解释为字符串而不是二进制数组(我假设 Artjom 会这样做)。 -
@ArtjomB.:谢谢,这正是我所需要的。如果您添加这是一个答案,我会将其标记为已接受。
标签: node.js cryptography des cbc-mode