Заполнение PKCS5 с криптографией node.js

Документы для шифрования node.js указывают, что заполнение автоматически вставляется во входной поток. У меня есть простая тестовая программа, которая должна вычислить хэш SHA1 открытого текста, а затем зашифровать этот 20-байтовый хеш, используя AES-256/CBC с дополнением PKCS5. Вот мой тестовый код:

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-байтовым. Что мне не хватает?


person Greg R    schedule 28.05.2014    source источник
comment
Была такая же проблема. Отличный вопрос и ответ.   -  person Geek Stocks    schedule 03.12.2016


Ответы (1)


Во-первых, вы отбрасываете первую часть зашифрованного содержимого, игнорируя возвращаемое значение aesCipher.update(). Кроме того, поскольку ваш update() не указывает выходную кодировку, он возвращает буфер, а ваш final() возвращает «двоичную» строку. Вместо этого вы можете попробовать:

var encrypted = Buffer.concat([
  aesCipher.update(sha1, "binary"),
  aesCipher.final()
]);
person mscdex    schedule 28.05.2014
comment
Спасибо. В этом была проблема. Мне было непонятно, что cipher.final() не будет генерировать все зашифрованное содержимое. - person Greg R; 28.05.2014
comment
Благодарю вас! Это помогло мне решить аналогичную проблему с расшифровкой, когда я видел частично расшифрованные строки. Решил аналогичным образом: return Buffer.concat([decipher.update(new Buffer(data, 'base64')),decipher.final()]).toString('utf8') - person Stano; 23.08.2017
comment
Я согласен, @GregR - документы Node здесь кажутся не очень ясными: метод cipher.update() можно вызывать несколько раз с новыми данными, пока не будет вызван cipher.final(). Насколько я понял, final() будет накапливать все вызовы update(). - person Stano; 23.08.2017