Что не так с этой простой криптографической функцией NodeJS? - PullRequest
2 голосов
/ 12 мая 2011

Я пытаюсь выполнить шифрование AES CBC с нулевым заполнением строки запроса URL.Я использую основной криптомодуль NodeJS.Это для использования с http://www.blackoutrugby.com/game/help.documentation.php#category=35

У меня есть ключ и IV.При тестировании следующей функции я не получаю строку, возвращаемую полностью.Я считаю, что это связано с заполнением, но я не уверен, как правильно применять его.

Если это заполнение, может кто-нибудь показать мне, как я должен применять его?Если нет, то где я иду не так?Также имеет значение cipher.final () для этого пользовательского случая?

Обновление: Я сейчас включил cipher.final (), и все отлично работает с двоичным форматом, но base64 дает мне усеченныйрезультат.https://github.com/denishoctor/BlackoutRugbyNode/blob/master/crypto2.js - мой полный пример кода.Ниже приведена криптографическая функция:

function cryptoTest(data, key, iv, format) {
   var cipher = crypto.createCipheriv('aes-128-cbc', key, iv);
   var cipherChunks = [];
   cipherChunks.push(cipher.update(data, 'utf8', format));
   cipherChunks.push(cipher.final());

   var decipher = crypto.createDecipheriv('aes-128-cbc', key, iv);
   var plainChunks = [];
   for (var i = 0;i < cipherChunks.length;i++) {
        plainChunks.push(decipher.update(cipherChunks[i], format, 'utf8'));
   }
   plainChunks.push(decipher.final());

   return {
       "encrypted": cipherChunks.join(''),
       "decrypted": plainChunks.join('')
   };
}

Спасибо,
Денис

Ответы [ 2 ]

5 голосов
/ 18 мая 2011

Вы не помещаете зашифрованный текст, возвращенный cipher.final, в расшифровщик. Вот упрощенный пример. Вам необходимо собирать возвращаемые значения при каждом вызове cipher.update, а также cipher.final и следить за тем, чтобы каждый из этих объектов помещался в decipher.update.

ОБНОВЛЕНИЕ : вот версия, которая отлично работает с binary или hex в качестве кодировки для зашифрованного текста, но не работает с base64. Я понятия не имею, почему это так, но если у вас все в порядке с шестнадцатеричным, это должно работать нормально.

ОБНОВЛЕНИЕ 2 : похоже, base64 - ошибка в самом узле. См. этот ответ на аналогичный вопрос .

    var crypto = require('crypto');

    var data = "I am the clear text data";
    console.log('Original cleartext: ' + data);
    var algorithm = 'aes-128-cbc';
    var key = 'mysecretkey';
    var clearEncoding = 'utf8';
    var cipherEncoding = 'hex';
    //If the next line is uncommented, the final cleartext is wrong.
    //cipherEncoding = 'base64';
    var cipher = crypto.createCipher(algorithm, key);
    var cipherChunks = [];
    cipherChunks.push(cipher.update(data, clearEncoding, cipherEncoding));
    cipherChunks.push(cipher.final(cipherEncoding));
    console.log(cipherEncoding + ' ciphertext: ' + cipherChunks.join(''));
    var decipher = crypto.createDecipher(algorithm, key);
    var plainChunks = [];
    for (var i = 0;i < cipherChunks.length;i++) {
      plainChunks.push(decipher.update(cipherChunks[i], cipherEncoding, clearEncoding));

    }
    plainChunks.push(decipher.final(clearEncoding));
    console.log("UTF8 plaintext deciphered: " + plainChunks.join(''));
0 голосов
/ 23 сентября 2013

https://github.com/tugrul/node-mcrypt

Так что у меня такие же проблемы. Я создал привязки к Mcrypt

...