Обзор симметричного шифрования в jsrsasign

Симметричное шифрование в jsrsasign реализовано через модуль KJUR.crypto.Cipher, который предоставляет унифицированный интерфейс для работы с блочными алгоритмами, прежде всего AES и DES/3DES. Основная идея заключается в использовании одного и того же ключа для шифрования и расшифрования данных, что делает этот подход быстрым и подходящим для обработки больших объёмов информации.

Внутренняя криптографическая подсистема библиотеки построена вокруг абстракции Cipher, которая инкапсулирует:

  • алгоритм шифрования (AES, DES, 3DES)
  • режим работы (CBC, ECB и др.)
  • способ дополнения блока (padding)
  • формат входных и выходных данных (hex, base64, raw)

Ключевым элементом является строковое описание алгоритма, например:

  • AES
  • AES-CBC
  • DES-CBC
  • 3DES-ECB

В зависимости от выбранной конфигурации библиотека автоматически подбирает соответствующую реализацию.

Базовый принцип работы Cipher

Общий цикл симметричного шифрования в jsrsasign выглядит следующим образом:

  • подготовка ключа (в формате hex или строка)
  • инициализация объекта Cipher с указанием алгоритма
  • передача исходного текста
  • получение зашифрованного результата
  • обратная операция при расшифровании

Важным моментом является то, что библиотека оперирует строками и байтовыми представлениями, скрывая низкоуровневую работу с блоками данных.

Шифрование AES в CBC режиме

Наиболее часто используемый вариант — AES в режиме CBC (Cipher Block Chaining). Этот режим обеспечивает более высокий уровень безопасности по сравнению с ECB, поскольку каждый блок зависит от предыдущего.

Пример типового использования:

var cipher = new KJUR.crypto.Cipher({
  alg: "AES",
  mode: "CBC",
  padding: "pkcs5"
});

var key = "00112233445566778899aabbccddeeff"; // 128-bit key (hex)
var iv  = "0102030405060708"; // 64-bit IV (hex)

var encrypted = cipher.encrypt("Secret message", key, iv);
var decrypted = cipher.decrypt(encrypted, key, iv);

Здесь ключ и IV задаются явно в шестнадцатеричном формате. IV (инициализационный вектор) критически важен для CBC: он предотвращает детерминированность шифрования одинаковых блоков данных.

Поддерживаемые алгоритмы

В jsrsasign симметричное шифрование ограничено классическими блочными алгоритмами:

AES (Advanced Encryption Standard)

Наиболее безопасный и рекомендуемый алгоритм. Поддерживает ключи:

  • 128 бит
  • 192 бит
  • 256 бит

Чаще всего используется AES-256-CBC как баланс между безопасностью и производительностью.

DES и 3DES

Устаревшие алгоритмы, используемые преимущественно в легаси-системах.

  • DES имеет короткий ключ (56 бит) и считается небезопасным
  • 3DES увеличивает стойкость за счёт тройного применения DES, но остаётся медленным

Режимы работы блочных шифров

jsrsasign поддерживает несколько режимов, каждый из которых определяет способ обработки блоков:

CBC (Cipher Block Chaining)

Каждый блок XOR-ится с предыдущим зашифрованным блоком.

Преимущества:

  • высокая безопасность
  • широкое применение

Недостатки:

  • последовательная обработка (не параллелится)

ECB (Electronic Codebook)

Каждый блок шифруется независимо.

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

  • простота реализации
  • высокая скорость

Критический недостаток:

  • одинаковые блоки дают одинаковый результат

В реальных системах используется редко.

Дополнение (Padding)

Так как блочные шифры работают с фиксированными размерами блоков, необходимо дополнение данных до кратного размера.

В jsrsasign применяется:

  • PKCS#5 padding (часто фактически PKCS#7 для AES)

Принцип:

  • добавляются байты, значение которых равно количеству добавленных байтов
  • даже если данные уже кратны блоку, добавляется целый блок padding

Форматы ключей и данных

Библиотека поддерживает несколько форматов представления:

  • hex (наиболее распространённый для ключей)
  • base64 (часто для зашифрованного вывода)
  • string (UTF-8 строки)

Пример явного указания формата результата:

cipher.encrypt("text", key, iv, { output: "hex" });
cipher.decrypt(data, key, iv, { input: "hex" });

Генерация ключей

jsrsasign не ограничивает способ генерации ключей, но предоставляет вспомогательные инструменты через KJUR.crypto.Util и KJUR.crypto.PBKDF2.

PBKDF2 для получения ключа из пароля

Используется для преобразования слабых паролей в криптографические ключи.

var salt = "a1b2c3d4";
var password = "myPassword";

var derivedKey = KJUR.crypto.PBKDF2.hashPassword(
  password,
  salt,
  1000,
  32
);

Параметры:

  • salt — случайная соль
  • iterations — количество итераций (усиление стойкости)
  • length — длина ключа в байтах

Внутренние особенности реализации Cipher

KJUR.crypto.Cipher работает как высокоуровневая оболочка над реализациями AES/DES, реализованными в JavaScript. Внутри происходит:

  • преобразование входной строки в байты
  • разбиение на блоки фиксированного размера (16 байт для AES)
  • применение алгоритма шифрования к каждому блоку
  • обработка chaining (в CBC)
  • применение padding
  • сериализация результата

При расшифровке процесс полностью инвертируется, включая удаление padding.

Работа с IV (инициализационным вектором)

IV играет ключевую роль в безопасности CBC. В jsrsasign он:

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

Типичная схема хранения:

IV + ciphertext

или

{ iv: "...", data: "..." }

Практика безопасного использования AES

При работе с jsrsasign важно учитывать несколько криптографических требований:

  • ключ должен иметь достаточную длину (минимум 128 бит)
  • IV не должен повторяться при одном и том же ключе
  • ECB режим следует избегать
  • пароль не должен использоваться напрямую без KDF

Расшифрование данных

Расшифрование выполняется тем же объектом Cipher с идентичными параметрами:

var cipher = new KJUR.crypto.Cipher({
  alg: "AES",
  mode: "CBC",
  padding: "pkcs5"
});

var decrypted = cipher.decrypt(encrypted, key, iv);

Несоответствие параметров приводит к невозможности восстановления данных, так как блочные шифры чувствительны к режиму и padding.

Обработка ошибок и типичные проблемы

При использовании симметричного шифрования в jsrsasign часто возникают следующие ситуации:

Неверный ключ

Если ключ имеет неправильную длину:

  • AES требует строго 16/24/32 байта
  • библиотека может выдавать некорректный результат или ошибку

Неверный IV

В CBC режиме приводит к:

  • искажению первого блока
  • полной невозможности корректного восстановления текста

Несовпадение форматов

Частая проблема:

  • шифрование в hex
  • попытка расшифрования как base64

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

AES в jsrsasign реализован на чистом JavaScript, что делает его:

  • медленнее нативных реализаций (WebCrypto API)
  • достаточно быстрым для небольших и средних объёмов данных
  • ограниченно применимым в высоконагруженных системах

При обработке больших массивов данных предпочтение обычно отдают window.crypto.subtle, однако jsrsasign остаётся удобным для:

  • учебных целей
  • серверных Node.js сценариев без WebCrypto
  • совместимости с криптографическими форматами ASN.1

Взаимодействие с другими модулями jsrsasign

Симметричное шифрование часто используется совместно с:

  • RSA (для передачи ключей AES)
  • HMAC (для контроля целостности)
  • PBKDF2 (для генерации ключей из паролей)

Типичная гибридная схема:

  • данные шифруются AES
  • AES ключ шифруется RSA
  • результат подписывается HMAC

Такой подход обеспечивает баланс между скоростью и безопасностью.

Формирование криптографического контура

При построении защищённого канала с использованием jsrsasign симметричное шифрование занимает центральное место как механизм защиты данных, тогда как асимметричная криптография используется только для обмена ключами.

Внутри прикладных систем AES в jsrsasign применяется как основной инструмент защиты содержимого сообщений, файлов и пользовательских данных благодаря высокой скорости и предсказуемому поведению алгоритма при корректной настройке параметров.