【问题标题】:PKCS5 Padding with node.js cryptoPKCS5 填充与 node.js 加密
【发布时间】:2014-07-17 21:33:00
【问题描述】:

node.js crypto 的文档表明填充会自动插入到输入流中。我有一个简单的测试程序,需要计算明文的 SHA1 哈希,然后使用带有 PKCS5 填充的 AES-256/CBC 加密该 20 字节哈希。这是我的测试代码:

var fs = require('fs');
var crypto = require('crypto');

var key = [ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
            0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
            0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
            0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f ];

var iv = [ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
           0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f ];

var test_string = "This is the string I am signing";

// Create SHA1 hash of our string
var sha1Hash = crypto.createHash("sha1");
sha1Hash.update(test_string, "utf8");
var sha1 = sha1Hash.digest();

var aesCipher =
        crypto.createCipheriv("aes-256-cbc", (new Buffer(key)), (new Buffer(iv)));
aesCipher.update(sha1, "binary");
var encrypted = aesCipher.final("binary");

fs.writeFile('data/node_encrypted.bin', encrypted, function (error) {
    if (error)
        throw error;
    console.log("File saved!");
});

但是,这会生成一个长度仅为 23 字节的文件。我希望通过适当的 PKCS5 填充,输出将是 32 字节。我错过了什么?

【问题讨论】:

  • 遇到了同样的问题。很好的问答。

标签: node.js cryptography node-crypto


【解决方案1】:

一方面,您忽略了aesCipher.update() 的返回值,从而丢弃了加密内容的第一部分。此外,由于您的 update() 未指定输出编码,因此它返回一个缓冲区,而您的 final() 则返回一个“二进制”字符串。你可以试试:

var encrypted = Buffer.concat([
  aesCipher.update(sha1, "binary"),
  aesCipher.final()
]);

【讨论】:

  • 谢谢。这就是问题所在。我不清楚 cipher.final() 不会产生整个加密内容。
  • 谢谢!这帮助我解决了一个类似的解密问题,我看到部分解密的字符串。用类似的方法解决了它:return Buffer.concat([decipher.update(new Buffer(data, 'base64')),decipher.final()]).toString('utf8')
  • 我同意,@GregR - Node 文档在这里似乎不太清楚:“在调用 cipher.final() 之前,可以使用新数据多次调用 cipher.update() 方法。 "我的理解是 final() 将累积所有 update() 调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2011-04-27
  • 2019-06-17
  • 2021-01-20
  • 1970-01-01
  • 2022-06-10
  • 2021-08-16
相关资源
最近更新 更多