Работа с ключами и векторами инициализации

В библиотеке Jsrsasign ключи являются центральным элементом всей криптографической инфраструктуры. Они используются для асимметричного шифрования, цифровой подписи, проверки подписи, а также для обмена ключами и интеграции с симметричными алгоритмами.

Основные типы ключей, поддерживаемые библиотекой:

  • RSA (Rivest–Shamir–Adleman)
  • EC (Elliptic Curve Cryptography)
  • DSA (частично, в зависимости от версии и сборки)

Форматы представления ключей

Jsrsasign работает с несколькими стандартными форматами ключей:

PEM (Privacy Enhanced Mail)

Наиболее распространённый формат:

-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----

или

-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----

PEM используется для импорта и экспорта ключей в большинстве криптографических сценариев.


PKCS#1 и PKCS#8

  • PKCS#1 — формат исключительно для RSA ключей
  • PKCS#8 — универсальный формат для приватных ключей (RSA, EC и др.)

PKCS#8 чаще применяется в современных системах, так как поддерживает расширяемость.


JWK (JSON Web Key)

Формат JSON, активно используемый в веб-приложениях:

{
  "kty": "RSA",
  "n": "...",
  "e": "AQAB",
  "d": "..."
}

Jsrsasign поддерживает конвертацию между PEM и JWK, что удобно при работе с JWT.


Генерация ключевых пар

В Jsrsasign генерация RSA ключей выполняется через KEYUTIL.

Пример генерации RSA ключа

var rsaKey = KEYUTIL.generateKeypair("RSA", 2048);

var privateKey = rsaKey.prvKeyObj;
var publicKey = rsaKey.pubKeyObj;

Параметры:

  • RSA — тип алгоритма
  • 2048 — длина ключа в битах (минимально безопасный уровень)

Для повышенной безопасности используется 3072 или 4096 бит.


Импорт ключей

Импорт из PEM строки

var pem = `
-----BEGIN PRIVATE KEY-----
MIIEv...
-----END PRIVATE KEY-----
`;

var keyObj = KEYUTIL.getKey(pem);

Функция KEYUTIL.getKey автоматически определяет тип ключа и формат.


Импорт из JWK

var jwk = {
  kty: "RSA",
  n: "...",
  e: "AQAB",
  d: "..."
};

var keyObj = KEYUTIL.getKey(jwk);

Экспорт ключей

В PEM формат

var pemPrivate = KEYUTIL.getPEM(privateKey, "PKCS8PRV");
var pemPublic = KEYUTIL.getPEM(publicKey);

Типы экспорта:

  • PKCS1PRV — RSA приватный ключ PKCS#1
  • PKCS8PRV — универсальный приватный ключ
  • PKCS8PUB — публичный ключ

В JWK формат

var jwk = KEYUTIL.getJWK(privateKey);

Экспорт JWK особенно важен для JWT-инфраструктур и OAuth 2.0 систем.


Работа с RSA ключами

RSA ключи используются для:

  • цифровой подписи (RSA-SHA256)
  • проверки подписи
  • шифрования небольших данных (например, симметричных ключей)

Подпись данных приватным ключом

var sig = new KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
sig.init(privateKey);
sig.updateString("data to sign");
var signature = sig.sign();

Проверка подписи публичным ключом

var sig = new KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
sig.init(publicKey);
sig.updateString("data to sign");

var isValid = sig.verify(signature);

Работа с EC ключами

Elliptic Curve ключи компактнее RSA и используются в:

  • ECDSA подписи
  • TLS-сертификатах
  • WebAuthn

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

var ecKey = KEYUTIL.generateKeypair("EC", "secp256r1");

Популярные кривые:

  • secp256r1 (P-256)
  • secp384r1
  • secp521r1

Подпись EC ключом

var sig = new KJUR.crypto.Signature({ "alg": "SHA256withECDSA" });
sig.init(ecKey.prvKeyObj);
sig.updateString("message");

var sigValue = sig.sign();

Ключи и их сериализация

Jsrsasign хранит ключи в виде объектов RSAKey или KJUR.crypto.ECDSA.

Ключевые свойства:

  • n, e — RSA публичные параметры
  • d — RSA приватный экспонент
  • curveName — EC кривая
  • pubKeyHex — публичное представление

Безопасное хранение ключей

При работе с Jsrsasign важно учитывать:

  • приватные ключи не должны попадать в клиентский лог
  • PEM можно шифровать паролем (PKCS#8 encrypted)
  • JWK следует хранить только в защищённых хранилищах

Векторы инициализации (IV) в симметричных алгоритмах

Вектор инициализации используется в симметричном шифровании для повышения криптографической стойкости. В Jsrsasign IV применяется в алгоритмах:

  • AES-CBC
  • AES-GCM
  • 3DES (устаревшие сценарии)

Роль IV в криптографии

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

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

Генерация IV в Jsrsasign

Для генерации случайных значений используется KJUR.crypto.Util

var ivHex = KJUR.crypto.Util.getRandomHexOfNbytes(16);

16 байт = 128 бит (стандарт для AES-CBC)


Использование IV в AES-CBC

var aes = new KJUR.crypto.Cipher({
  alg: "AES",
  mode: "CBC",
  iv: ivHex
});

Шифрование с IV

var encrypted = aes.encrypt("AES ключ", "секретные данные");

Дешифрование с тем же IV

var decrypted = aes.decrypt("AES ключ", encrypted);

Важно: IV должен быть одинаковым при шифровании и расшифровании.


IV в AES-GCM

В режиме GCM IV часто называется nonce.

var iv = KJUR.crypto.Util.getRandomHexOfNbytes(12);

12 байт — рекомендуемый размер для GCM.


Шифрование AES-GCM

var cipher = new KJUR.crypto.Cipher({
  alg: "AES",
  mode: "GCM",
  iv: iv
});

Ошибки при работе с IV

Типичные ошибки:

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

Связь ключей и IV в симметричной криптографии

Ключ и IV выполняют разные функции:

  • ключ — определяет математическую трансформацию данных
  • IV — обеспечивает уникальность шифрования

Даже при одинаковом ключе разные IV дают разные шифротексты.


Хранение IV вместе с шифротекстом

Частая практика — объединение:

IV + ciphertext

или

base64(iv + encrypted)

Это позволяет использовать IV при расшифровке без отдельной передачи.


Использование ключей RSA для защиты IV и AES ключей

Гибридная схема:

  1. Генерация AES ключа
  2. Шифрование данных AES
  3. Шифрование AES ключа RSA публичным ключом
  4. Передача IV отдельно или внутри сообщения

Пример гибридной схемы

var aesKey = "random-aes-key";
var iv = KJUR.crypto.Util.getRandomHexOfNbytes(16);

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

var encryptedData = cipher.encrypt(aesKey, "data");

Влияние качества ключей и IV на безопасность

Критические параметры:

  • длина RSA ключа (минимум 2048 бит)
  • случайность генерации IV
  • отсутствие повторного использования параметров
  • корректный выбор алгоритма (SHA-256 и выше)

Конвертация ключей для интеграции

Jsrsasign часто используется в связке с:

  • JWT (JSON Web Token)
  • Web Crypto API
  • Node.js crypto

Поэтому конвертация ключей между PEM и JWK становится обязательной операцией при интеграции систем.


Пример преобразования для JWT

var key = KEYUTIL.getKey(pemPrivate);

var jwk = KEYUTIL.getJWK(key);

Работа с ключами в реальных системах

В прикладных сценариях ключи используются в:

  • API подписи запросов
  • OAuth авторизации
  • TLS-цепочках сертификатов
  • WebSocket защищённых соединениях

IV при этом используется внутри транспортного или прикладного уровня шифрования, а ключи — на уровне идентификации и криптографической подписи.