Как зашифровать текст с помощью 3DES, режим CBC с использованием Javascript на APIGEE

Вот моя информация:

  • Plain Text: ---------------------------------------------------
    • do not encode
  • Key: ------------------------------------
    • do not encode
  • Алгоритм шифрования: 3DES, режим CBC с симметричным ключом
  • Init Vector : ------------------------------
    • I knew only "iv must be hexa form"

Желаемый результат:

----------------------------------------------------------------------------

Я использую эту библиотеку: https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/tripledes.js

Моя функция шифрования:

function encryptByDES(message, key){
  var iv = CryptoJS.lib.WordArray.create(8);
  var encrypted = CryptoJS.TripleDES.encrypt(message, key, {
    iv: key,
    mode: CryptoJS.mode.CBC
  });
  return encrypted.toString();
}

Фактический результат:

----------------------------------------------------------------------------

Вопрос. Как добиться желаемого результата?


person Bell    schedule 05.01.2018    source источник


Ответы (1)


Есть ряд странностей и проблем с вашими входами/выходами и кодом:

  • У вас есть открытый текст Base64, который вы передаете как простой UTF8 (???), ключ в кодировке UTF8 и IV в шестнадцатеричном кодировании. В идеале вы должны использовать одну кодировку для всех трех значений. Я рекомендую base64, если вы не можете работать с простым двоичным кодом.

  • Вы используете фиксированный IV, который представляет ряд уязвимостей, которые могут привести к восстановлению открытого текста. Всегда случайным образом генерируйте IV для каждой операции шифрования.

  • Вы передаете ключ как IV во время шифрования, поэтому IV, который вы создаете, все равно не используется. Никогда не используйте ключ в качестве IV.

Я решил вашу проблему и дал желаемый результат, но я не собираюсь публиковать код, так как вы ничего не узнаете. Вместо этого я расскажу вам, что вам нужно сделать, чтобы исправить то, что у вас есть:

  • Измените существующий код, чтобы фактически использовать IV.
  • Передайте открытый текст и ключ как двоичные данные в функцию шифрования, используя CryptoJS.enc.Utf8.parse для получения каждого из них в виде двоичных слов.
  • Выведите результат в шестнадцатеричном формате, а не в формате base64.

РЕДАКТИРОВАТЬ: код, используемый для получения желаемого результата. Обратите внимание на преобразование из base64 в hex для переменной output:

let iv = CryptoJS.enc.Hex.parse("0000000000000000");
let pt = CryptoJS.enc.Utf8.parse("MjAxODAxMDQwOTM5MzgxMjM0NTY3ODkwMTIzNA==");
let key = CryptoJS.enc.Utf8.parse("20180104093938xSpUoDU3Z0");

let result = CryptoJS.TripleDES.encrypt(pt, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC
});

let output = CryptoJS.enc.Hex.stringify(CryptoJS.enc.Base64.parse(result.toString()));
console.log(output);
person Luke Joshua Park    schedule 05.01.2018
comment
Большое спасибо. Но я не понимаю этого. Измените существующий код, чтобы фактически использовать IV. это означает, что я должен использовать iv = '0000000000000000' правильно? - person Bell; 05.01.2018
comment
Посмотрите в коде, который вы разместили. У вас есть iv: key. - person Luke Joshua Park; 05.01.2018
comment
Я так виноват. Я действительно не понимаю. function encryptByDES(message, key){ var binaryMessage = CryptoJS.enc.Utf8.parse(message); var binaryKey = CryptoJS.enc.Utf8.parse(key); var iv = CryptoJS.lib.WordArray.create(8); var encrypted = CryptoJS.TripleDES.encrypt(binaryMessage, binaryKey, { iv: iv, mode: CryptoJS.mode.CBC }); return encrypted.toString(); } Я изменил это. но я не могу получить желаемый результат. Что я пропустил-то, что вы мне сказали? - person Bell; 05.01.2018
comment
Очень близко, молодец. На самом деле вы получаете правильный вывод, он просто закодирован как base64, а не как шестнадцатеричный, как вы хотите. Я отредактировал свой ответ, включив в него код, который я использовал для получения вашего результата. - person Luke Joshua Park; 05.01.2018
comment
Большое спасибо. Я никогда ничего не делаю с 3DES. Это мой первый урок. - person Bell; 05.01.2018
comment
Без проблем. Однако я настоятельно рекомендую вам не использовать этот код в рабочей среде. Это не безопасно удаленно. - person Luke Joshua Park; 05.01.2018