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

1

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

  • Простой текст: ----------------------------------------------- ----
    • не кодировать
  • Ключ: ------------------------------------
    • не кодировать
  • Алгоритм шифрования: 3DES, режим CBC с симметричным ключом
  • Инициировать вектор: ------------------------------
    • Я знал, что "iv должен быть формой гекса"

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

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

Я использую эту библиотеку: 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();
}

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

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

Вопрос: Как мне достичь желаемого результата?

Теги:
encryption
cbc-mode
apigee
3des

1 ответ

1
Лучший ответ

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

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

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

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

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

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

EDIT: код, используемый для получения желаемого результата. Обратите внимание на преобразование из 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);
  • 0
    Огромное спасибо. Но я не понимаю этого: «Измените свой существующий код, чтобы фактически использовать IV». это означает, что я должен использовать iv = '0000000000000000' правильно?
  • 0
    Посмотрите в коде вы разместили. У вас есть iv: key .
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню