Структура пакета и модульная архитектура

Библиотека Crypto-JS построена по модульному принципу: каждая криптографическая примитивная операция вынесена в отдельный файл, а общая логика объединена через единое пространство имён CryptoJS. Это позволяет подключать только необходимые компоненты и снижать итоговый размер бандла.

Внутренняя структура пакета условно делится на несколько уровней:

  • Ядро (core) — базовые абстракции и утилиты
  • Алгоритмы хеширования — MD5, SHA-1, SHA-2 и др.
  • Симметричное шифрование — AES, DES, TripleDES, RC4
  • Кодировки — Hex, Base64, Latin1, Utf8
  • Режимы работы и паддинги — CBC, CFB, PKCS7 и др.
  • Расширения — HMAC, PBKDF2 и прочие надстройки

Каждый модуль может существовать независимо, но большинство из них опираются на ядро.


Ядро библиотеки

Файл core.js — фундамент всей архитектуры. В нём определены базовые конструкции:

Базовый класс Base

Обеспечивает механизм наследования и расширения:

  • extend() — создание нового объекта с прототипным наследованием
  • create() — фабричный метод для инстанцирования
  • init() — конструктор
  • mixIn() — смешивание свойств
  • clone() — клонирование объекта

Эта система позволяет реализовать объектно-ориентированный стиль без использования классов ES6.

Структура данных WordArray

Ключевой тип данных в Crypto-JS. Представляет массив 32-битных слов:

  • words — массив чисел
  • sigBytes — количество значимых байтов

Особенности:

  • эффективная работа с бинарными данными
  • автоматическое выравнивание
  • поддержка конкатенации (concat)
  • преобразование в строку (toString)

Кодировщики (enc)

Модуль enc содержит стратегии преобразования между строками и WordArray:

  • Hex
  • Latin1
  • Utf8
  • Base64

Каждый кодировщик реализует методы:

  • parse(string) — строка → WordArray
  • stringify(wordArray) — WordArray → строка

Модуль хеширования

Каждый алгоритм реализован как отдельный модуль, например:

  • md5.js
  • sha1.js
  • sha256.js
  • sha512.js

Общая структура алгоритма

Все хеш-функции наследуются от Hasher, который определён в ядре:

  • _doReset() — инициализация состояния
  • _doProcessBlock() — обработка блока данных
  • _doFinalize() — завершение вычисления

Пример архитектуры:

Hasher
 └── SHA256
 └── MD5
 └── SHA1

Каждый алгоритм:

  • работает с блоками фиксированного размера
  • использует внутреннее состояние (hash state)
  • поддерживает потоковую обработку

Потоковый интерфейс

Позволяет обрабатывать данные по частям:

var hasher = CryptoJS.algo.SHA256.create();
hasher.update("part1");
hasher.update("part2");
var hash = hasher.finalize();

Модуль симметричного шифрования

Реализует блочные и потоковые шифры.

Базовый класс Cipher

Определяет общий интерфейс:

  • createEncryptor(key, cfg)
  • createDecryptor(key, cfg)
  • process(data)
  • finalize(data)

Подклассы:

  • BlockCipher — для блочных алгоритмов (AES, DES)
  • StreamCipher — для потоковых (RC4)

Структура AES

Модуль aes.js включает:

  • реализацию алгоритма
  • таблицы подстановок (S-box)
  • ключевое расписание (key schedule)

Режимы работы шифров

Режимы вынесены в отдельные модули:

  • mode-cbc.js
  • mode-cfb.js
  • mode-ctr.js
  • mode-ofb.js
  • mode-ecb.js

Каждый режим:

  • реализует логику обработки блоков
  • управляет состоянием (например, предыдущий блок)
  • взаимодействует с BlockCipher

Пример:

CryptoJS.mode.CBC
CryptoJS.mode.CTR

Паддинги (Padding)

Необходимы для выравнивания данных под размер блока.

Реализованы как стратегии:

  • Pkcs7 (по умолчанию)
  • AnsiX923
  • Iso10126
  • ZeroPadding
  • NoPadding

Каждый модуль содержит методы:

  • pad(data, blockSize)
  • unpad(data)

Форматы (Format)

Форматы отвечают за представление зашифрованных данных:

  • OpenSSL-совместимый формат
  • кастомные сериализаторы

Стандартный формат:

CryptoJS.format.OpenSSL

Содержит:

  • соль (salt)
  • шифротекст (ciphertext)

Модуль HMAC

Реализует механизм аутентификации сообщений.

Структура:

  • использует любой хеш-алгоритм
  • применяет внутренние ключи (ipad, opad)

Пример:

CryptoJS.HmacSHA256(message, key)

Архитектурно:

Hasher
 └── HMAC
       └── SHA256

PBKDF2 (вывод ключа)

Модуль для генерации ключей из пароля:

  • использует HMAC
  • поддерживает итерации
  • применяет соль

Структура:

CryptoJS.PBKDF2(password, salt, {
    keySize,
    iterations
})

Связь модулей между собой

Модульная архитектура строится на принципе композиции:

  • Cipher использует WordArray
  • режимы используют Cipher
  • паддинги используются внутри режимов
  • HMAC использует Hasher
  • PBKDF2 использует HMAC

Это обеспечивает:

  • слабую связанность
  • гибкость конфигурации
  • расширяемость

Система пространств имён

Все компоненты доступны через единый объект:

CryptoJS

Внутреннее разделение:

  • CryptoJS.lib — базовые классы
  • CryptoJS.enc — кодировки
  • CryptoJS.algo — алгоритмы
  • CryptoJS.mode — режимы
  • CryptoJS.pad — паддинги
  • CryptoJS.format — форматы

Пример:

CryptoJS.algo.SHA256
CryptoJS.enc.Hex
CryptoJS.mode.CBC

Подключение модулей

При использовании через npm или CDN:

  • можно подключить весь пакет
  • или только отдельные модули

Пример модульного подключения:

require('crypto-js/core');
require('crypto-js/sha256');
require('crypto-js/aes');

Это позволяет:

  • уменьшить размер сборки
  • ускорить загрузку
  • использовать tree-shaking

Расширяемость

Архитектура позволяет добавлять собственные алгоритмы:

  • наследование от Hasher или Cipher
  • регистрация в CryptoJS.algo
  • использование стандартных интерфейсов

Пример расширения:

var MyHash = CryptoJS.lib.Hasher.extend({
    _doReset: function () {},
    _doProcessBlock: function () {},
    _doFinalize: function () {}
});

Преимущества модульной архитектуры

  • независимость компонентов
  • повторное использование кода
  • простота тестирования
  • возможность частичной загрузки
  • гибкая настройка криптографических схем

Ограничения архитектуры

  • отсутствие строгой типизации
  • сложность отладки при глубокой композиции
  • зависимость от порядка подключения модулей
  • устаревший стиль (прототипное наследование вместо ES6 классов)

Взаимодействие с современными сборщиками

Crypto-JS может использоваться с:

  • Webpack
  • Rollup
  • Vite

Особенности:

  • не все модули оптимально tree-shake’ятся
  • требуется явный импорт нужных компонентов
  • возможны проблемы с legacy-структурой

Итоговая схема структуры

CryptoJS
 ├── lib
 │    ├── Base
 │    ├── WordArray
 │    └── Hasher
 │
 ├── enc
 │    ├── Hex
 │    ├── Utf8
 │    └── Base64
 │
 ├── algo
 │    ├── SHA256
 │    ├── MD5
 │    └── AES
 │
 ├── mode
 │    ├── CBC
 │    └── CTR
 │
 ├── pad
 │    ├── Pkcs7
 │    └── ZeroPadding
 │
 └── format
      └── OpenSSL

Такая структура делает Crypto-JS гибкой и пригодной как для учебных задач, так и для прикладного использования в веб-разработке.