Шестнадцатеричный ключ 3DES в функции шифрования Javascript

У меня есть функция javascript, использующая CryptoJS для шифрования 8-байтового блока с использованием ключа 3DES.

Функция работает с ключом 01010101010101010101010101010101, но не работает с ключом ADADADADADAD0101ADADADADADAD0202.

    function enc3DES(keyHex){

    var block = "040502CFFFFEFDEE";

    var encrypted = CryptoJS.DES.encrypt(CryptoJS.enc.Hex.parse(block), CryptoJS.enc.Hex.parse(keyHex), {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });

        encrypted = encrypted.ciphertext.toString();
        return encrypted.substr(0, 8*2).toUpperCase();
    }

Используя приведенную выше функцию enc3DES(): Блок 040502CFFFFEFDEE, зашифрованный с помощью ключа 01010101010101010101010101010101, представляет собой C9478CAA27ABA56A, и этот вывод правильный.

Но тот же блок 040502CFFFFEFDEE, зашифрованный ключом ADADADADADAD0101ADADADADADAD0202, представляет собой A413ABD86D52DFFB, и этот вывод неверен, правильным будет F6A1C5ACA15A50C3.

Не могли бы вы помочь мне понять, почему функция работает нормально только с первой клавишей?

Как узнать, что второе верно? Что вы проверяете против?

zero298 24.06.2019 21:21

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

Caique Castro 24.06.2019 22:24

Пожалуйста, отвечайте на ответы. У вас, кажется, есть очень разумный ответ ниже, чего-то в нем не хватает?

Maarten Bodewes 27.06.2019 12:53

Я не смог проверить это сейчас, решение сработало

Caique Castro 28.06.2019 19:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
471
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • 3DES (или Тройной DES) не является ДЕС. Поэтому CryptoJS.DES нужно заменить на CryptoJS.TripleDES.

  • Ключ 3DES состоит из 3 связанных ключей DES (K1, K2, K3). Есть три варианты ключей: 3TDEA (все три ключа разные), 2TDEA (2 ключа разные и K1 = K3) и третий случай, когда все ключи идентичны, что дает тот же шифротекст, что и DES. Первый ключ

    01010101010101010101010101010101 
    

    соответствует третьему варианту (все ключи идентичны), ключ

    ADADADADADAD0101ADADADADADAD0202 
    

    соответствует второму варианту (2TDEA). Поскольку CryptoJS ожидает от 3DES 24-байтового ключа, ключи

    010101010101010101010101010101010101010101010101
    

    а также

    ADADADADADAD0101ADADADADADAD0202ADADADADADAD0101 
    

    необходимо использовать.

  • Поскольку открытый текст и зашифрованный текст имеют одинаковую длину, заполнение не может быть Pkcs7. Вместо Pkcs7 можно использовать ZeroPadding или, если открытый текст всегда является целым числом, кратным размеру блока (8 байт для 3DES), NoPadding. Если заполнение изменено, то может быть возвращен весь зашифрованный текст (вместо подстроки).

Другие вопросы по теме