TripleDES: Encrypt (.Net) - Расшифровать (CryptoJS)

У меня есть приложение C #, которое использует следующие методы для шифрования и дешифрования паролей в базе данных:

public static string Encrypt(string input, string key)
{
    TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();
    tripleDES.Key = UTF8Encoding.UTF8.GetBytes(key);
    tripleDES.Mode = CipherMode.ECB;
    tripleDES.Padding = PaddingMode.PKCS7;
    ICryptoTransform cTransform = tripleDES.CreateEncryptor();

    byte[] inputArray = UTF8Encoding.UTF8.GetBytes(input);

    byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);
    tripleDES.Clear();

    return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}

public static string Decrypt(string input, string key)
{
    byte[] inputArray = Convert.FromBase64String(input);

    TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();
    tripleDES.Key = UTF8Encoding.UTF8.GetBytes(key);
    tripleDES.Mode = CipherMode.ECB;
    tripleDES.Padding = PaddingMode.PKCS7;
    ICryptoTransform cTransform = tripleDES.CreateDecryptor();

    byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);
    tripleDES.Clear();

    return UTF8Encoding.UTF8.GetString(resultArray);
}

Поэтому, если я зашифрую пароль testing с помощью ключа 0123456789012345, результат будет +dc6bsOFg00=.

Теперь мне нужно прочитать эти пароли из приложения NodeJS (используя CryptoJS), но я не уверен, как это сделать, поскольку в C # шифрование побайтно-ориентировано (обратите внимание, что в коде оба input и key преобразуются в byte[]), тогда как в CryptoJS он более ориентирован на строки.

Я безуспешно пытался использовать эту функцию JavaScript:

var CryptoJS = require("crypto-js");

function decrypt(input, key) {
    var inputArray = new Buffer(input, 'base64');
    var inputString = inputArray.toString();
    var resultArray = CryptoJS.TripleDES.decrypt(inputString, key, {'mode': CryptoJS.mode.ECB, 'pad': CryptoJS.pad.Pkcs7});
    return resultArray.toString();
}

console.log(decrypt("+dc6bsOFg00=", "0123456789012345"));

Обновление: я знаю, что шифрование паролей - плохая идея и что Triple DES - не лучший алгоритм, но приложение C # не может быть изменено (по крайней мере, для сейчас), поэтому я не могу изменить способ шифрования паролей, я должен прочитать их в том виде, в каком они есть сейчас.


person user2800789    schedule 15.11.2016    source источник
comment
Не шифруйте пароли, когда злоумышленник получит БД, он также получит ключ шифрования. Обходите HMAC со случайной солью в течение примерно 100 мс и сохраните соль с помощью хэша. Используйте такие функции, как password_hash, PBKDF2, Bcrypt и аналогичные функции. Дело в том, чтобы злоумышленник тратил много времени на поиск паролей перебором.   -  person zaph    schedule 15.11.2016
comment
Лучше не использовать 3DES, а использовать AES. Ключ 3DES составляет 24 байта, ключ в вопросе - 16 байтов. Не используйте режим ECB, это небезопасно, см. режим ECB, прокрутите вниз до Пингвина.   -  person zaph    schedule 15.11.2016
comment
Лучше просто использовать встроенный модуль crypto вместо модуля сторонний модуль.   -  person mscdex    schedule 15.11.2016
comment
Когда вы вызываете inputArray.toString(), по умолчанию используется кодировка UTF-8. Может быть, это должно быть inputArray.toString('binary') вместо этого?   -  person RogerN    schedule 16.11.2016
comment
Нет необходимости в этом, вы дали свой совет, не нужно углубляться в детали. Давайте сохраним позитив, единственный результат - долгая дискуссия в комментариях, которая ни к чему не приведет (да, я был там). Я думаю, @RogerN, кстати, добился этого.   -  person Maarten Bodewes    schedule 16.11.2016


Ответы (1)


(Размещено от имени OP).

Спасибо за предложение, но использование inputArray.toString('binary') не помогло.

В конце концов я решил свою проблему с помощью Edge.js: поскольку у меня есть код Из методов C #, используемых для шифрования и дешифрования, я могу использовать Edge.js для выполнения этих методов из приложения Node.

person Community    schedule 17.11.2016