Triple DES (3DES, TDEA — Triple Data Encryption Algorithm) появился как эволюция алгоритма DES (Data Encryption Standard), который со временем перестал считаться безопасным из-за малой длины ключа (56 бит).
3DES был введён как временное решение, позволяющее сохранить совместимость с DES, но значительно повысить криптостойкость за счёт многократного применения алгоритма.
3DES основан на последовательном применении DES-трансформаций к одному и тому же блоку данных.
На практике используется один из двух вариантов:
Это основной и наиболее распространённый вариант:
C = E_{K_3}(D_{K_2}(E_{K_1}(P)))
Где:
Основные причины распространения:
Особенно активно 3DES применялся в:
Несмотря на улучшения по сравнению с DES, 3DES имеет существенные недостатки:
3DES выполняет DES-трансформацию три раза, что делает его примерно в 3 раза медленнее современных алгоритмов.
Размер блока — 64 бита, что приводит к уязвимости к атаке “birthday attack” при больших объёмах данных.
3DES официально считается устаревшим в современных криптографических стандартах (NIST постепенно выводит его из использования).
Несмотря на 112-битную стойкость, алгоритм не соответствует современным требованиям (AES даёт существенно лучший уровень защиты).
Библиотека Crypto-js поддерживает 3DES через модуль
CryptoJS.TripleDES.
import CryptoJS from "crypto-js";
const message = "Секретное сообщение";
const key = "my-secret-key";
const encrypted = CryptoJS.TripleDES.encrypt(message, key).toString();
console.log(encrypted);
const decrypted = CryptoJS.TripleDES.decrypt(encrypted, key)
.toString(CryptoJS.enc.Utf8);
console.log(decrypted);
Crypto-js автоматически применяет:
Пример явного задания параметров:
const encrypted = CryptoJS.TripleDES.encrypt(message, "password123", {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
Для более строгого контроля используется объектный формат:
const key = CryptoJS.enc.Utf8.parse("123456789012345678901234");
const iv = CryptoJS.enc.Utf8.parse("12345678");
const encrypted = CryptoJS.TripleDES.encrypt(message, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
Как и DES, 3DES может использовать разные режимы:
const encrypted = CryptoJS.TripleDES.encrypt(message, key, {
mode: CryptoJS.mode.CBC,
iv: iv,
padding: CryptoJS.pad.Pkcs7
});
Современные рекомендации:
3DES допустим только в случае:
| Параметр | 3DES | AES |
|---|---|---|
| Размер блока | 64 бита | 128 бит |
| Производительность | Низкая | Высокая |
| Безопасность | Устаревшая | Современная |
| Рекомендуется | Нет | Да |
Типичные сценарии:
CryptoJS.TripleDES.encrypt(data, "password");
Проблема: неявная генерация ключа → непредсказуемость
CBC без IV приводит к уязвимостям при повторном шифровании одинаковых данных.
Использование:
mode: CryptoJS.mode.ECB
создаёт детерминированный шифротекст → утечка структуры данных
Использование допустимо только при:
Во всех остальных случаях выбор очевиден — AES.