У меня есть функция 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.
Не могли бы вы помочь мне понять, почему функция работает нормально только с первой клавишей?
Используя любое другое программное обеспечение или инструмент, который запускает алгоритм 3DES, невозможно расшифровать вывод, сгенерированный функцией.
Пожалуйста, отвечайте на ответы. У вас, кажется, есть очень разумный ответ ниже, чего-то в нем не хватает?
Я не смог проверить это сейчас, решение сработало



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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. Если заполнение изменено, то может быть возвращен весь зашифрованный текст (вместо подстроки).
Как узнать, что второе верно? Что вы проверяете против?