Симметричное шифрование в Jsrsasign строится вокруг использования блочных алгоритмов, где один и тот же секретный ключ применяется и для шифрования, и для расшифрования данных. Основу составляют AES и, в более старых сценариях, DES/3DES. В современных реализациях предпочтение практически всегда отдается AES как более устойчивому и производительному варианту.
В библиотеке Jsrsasign симметричные операции выполняются через объект
KJUR.crypto.Cipher, который инкапсулирует логику работы с
ключами, режимами и дополнением (padding).
Пример базового шифрования AES:
var data = "секретное сообщение";
var password = "mySecretKey";
var encrypted = KJUR.crypto.Cipher.encrypt(data, password, "AES");
var decrypted = KJUR.crypto.Cipher.decrypt(encrypted, password, "AES");
Внутренне библиотека преобразует пароль в ключ нужной длины, применяет стандартные алгоритмы расширения ключа и выполняет блочное преобразование данных.
Симметричные алгоритмы в Jsrsasign поддерживают различные режимы работы блоков:
На практике наиболее часто используется CBC, поскольку он обеспечивает баланс между безопасностью и простотой реализации.
При использовании CBC обязательно наличие вектора инициализации (IV):
var cipher = new KJUR.crypto.Cipher({
alg: "AES",
mode: "CBC",
iv: "00112233445566778899aabbccddeeff"
});
var enc = cipher.encrypt("plaintext", "password");
IV не является секретным, но должен быть уникальным для каждой операции шифрования.
RSA в Jsrsasign используется для защиты небольших объемов данных, чаще всего — ключей симметричного шифрования. Основная особенность RSA заключается в разделении ключей:
Jsrsasign предоставляет утилиты KEYUTIL для работы с
ключами в формате PEM.
var pubKey = KEYUTIL.getKey(pubPEM);
var enc = pubKey.encrypt("secret data");
Расшифрование выполняется через приватный ключ:
var privKey = KEYUTIL.getKey(privPEM, "password");
var dec = privKey.decrypt(enc);
RSA в чистом виде ограничен размером данных, которые можно зашифровать. Это связано с длиной ключа и используемым паддингом (PKCS#1 v1.5 или OAEP).
При работе с реальными системами применяется комбинированный подход: симметричный алгоритм используется для данных, а асимметричный — для защиты ключа.
Схема выглядит следующим образом:
Пример логики:
var aesKey = KJUR.crypto.Util.getRandomHexOfNbytes(16);
var encData = KJUR.crypto.Cipher.encrypt(message, aesKey, "AES");
var rsa = KEYUTIL.getKey(pubPEM);
var encKey = rsa.encrypt(aesKey);
На стороне получателя сначала расшифровывается ключ RSA, затем используется AES-дешифрование.
Jsrsasign поддерживает стандарты криптографических сообщений PKCS#7 / CMS, которые используются в корпоративных системах и инфраструктуре PKI.
Объект KJUR.asn1.cms.EnvelopedData позволяет формировать
зашифрованные контейнеры, содержащие:
Создание CMS EnvelopedData:
var cms = new KJUR.asn1.cms.EnvelopedData({
content: "Hello world",
certs: [certPEM],
cipher: "aes256"
});
var result = cms.getContentInfo();
Такие структуры часто применяются в электронных документах, где требуется совместимость с внешними криптографическими системами.
Результаты криптографических операций редко используются в «сыром» виде. Jsrsasign активно применяет кодирование:
Например, AES-шифрование может возвращать Base64-строку:
var enc = KJUR.crypto.Cipher.encrypt("data", "key", "AES");
var base64 = hextob64(enc);
При работе с RSA и CMS почти всегда используется Base64 как стандартный транспортный формат.
Jsrsasign поддерживает несколько форматов ключей:
Работа с ключами осуществляется через KEYUTIL:
var key = KEYUTIL.getKey(pemKey);
Для приватных ключей с паролем используется дополнительный параметр:
var privKey = KEYUTIL.getKey(pemPrivate, "password");
При выполнении AES-операций библиотека последовательно выполняет:
Padding чаще всего реализуется по стандарту PKCS#7, где недостающие байты заполняются значением длины добавленных байтов.
RSA-шифрование ограничено размером блока:
Попытка зашифровать больший объем данных приводит к ошибке переполнения блока.
Симметричные алгоритмы не имеют таких ограничений, но требуют строгого контроля ключей и IV.
При использовании криптографических функций Jsrsasign критичны следующие аспекты:
Особое значение имеет корректное разделение обязанностей алгоритмов: симметричное шифрование должно обрабатывать данные, асимметричное — только ключевой материал.
Jsrsasign ориентирован на обработку данных в памяти, поэтому при шифровании больших объемов применяются стратегии разбиения:
Это особенно важно при работе в браузерной среде, где ограничены ресурсы памяти и отсутствует полноценный потоковый I/O.
Шифрование в Jsrsasign редко используется изолированно. Оно обычно является частью более широкого процесса:
Каждый уровень добавляет собственную абстракцию поверх базовых AES и RSA операций, формируя единый криптографический стек.