В библиотеке jsrsasign AES реализуется через модуль
KJUR.crypto.Cipher, который предоставляет унифицированный
интерфейс для симметричного шифрования. AES (Advanced Encryption
Standard) используется в различных режимах работы, которые определяют
способ обработки блоков данных.
Ключевые особенности AES в контексте jsrsasign:
Основная точка входа:
var cipher = new KJUR.crypto.Cipher({
alg: "AES",
mode: "CBC", // может быть CBC, CTR, GCM
key: keyHex,
iv: ivHex
});
AES требует корректного размера ключа и инициализирующего вектора (IV).
var keyHex = KJUR.crypto.Util.getRandomHexOfNbytes(32); // AES-256
var ivHex = KJUR.crypto.Util.getRandomHexOfNbytes(16); // всегда 16 байт для AES
IV не является секретом, но должен быть уникальным для каждого шифрования в режимах CBC и GCM.
CBC является классическим режимом блочного шифрования. Каждый блок входных данных XOR-ится с предыдущим зашифрованным блоком.
var cipher = new KJUR.crypto.Cipher({
alg: "AES",
mode: "CBC",
key: keyHex,
iv: ivHex
});
var encryptedHex = cipher.encrypt("Hello world");
var decipher = new KJUR.crypto.Cipher({
alg: "AES",
mode: "CBC",
key: keyHex,
iv: ivHex
});
var decryptedText = decipher.decrypt(encryptedHex);
CBC требует выравнивания блока (16 байт). В jsrsasign обычно применяется PKCS#5/PKCS#7 padding автоматически. Это важно учитывать при совместимости с другими библиотеками.
CTR превращает блочный шифр в потоковый. Вместо цепочки блоков используется счётчик, который шифруется и XOR-ится с данными.
var cipher = new KJUR.crypto.Cipher({
alg: "AES",
mode: "CTR",
key: keyHex,
iv: ivHex
});
var encryptedHex = cipher.encrypt("Hello world");
var decipher = new KJUR.crypto.Cipher({
alg: "AES",
mode: "CTR",
key: keyHex,
iv: ivHex
});
var decryptedText = decipher.decrypt(encryptedHex);
CTR критически зависит от уникальности IV. Повторное использование IV с тем же ключом приводит к раскрытию XOR-структуры данных.
GCM объединяет CTR-шифрование и механизм аутентификации данных (AEAD — Authenticated Encryption with Associated Data).
var cipher = new KJUR.crypto.Cipher({
alg: "AES",
mode: "GCM",
key: keyHex,
iv: ivHex,
aad: "header-data"
});
var encryptedHex = cipher.encrypt("Hello world");
var tag = cipher.getAuthTag();
var decipher = new KJUR.crypto.Cipher({
alg: "AES",
mode: "GCM",
key: keyHex,
iv: ivHex,
aad: "header-data",
authTag: tag
});
var decryptedText = decipher.decrypt(encryptedHex);
AAD позволяет защищать метаданные без их шифрования. Например:
Изменение AAD делает расшифровку невозможной, даже если ciphertext не изменён.
Одна из критических ошибок:
// опасная практика
var ivHex = "0000000000000000";
IV должен быть уникальным для каждого сообщения.
AES принимает строго:
Несоответствие приводит к ошибкам или снижению безопасности.
Без проверки tag расшифровка теряет смысл:
decipher.getAuthTag(); // обязательно проверять
jsrsasign использует hex-представление как основной формат:
var plainHex = KJUR.crypto.Util.utf8tohex("test");
var encryptedHex = cipher.encryptHex(plainHex);
Для обратного преобразования:
var text = KJUR.crypto.Util.hex2utf8(decryptedHex);
AES часто используется вместе с:
KJUR.crypto.Signature (подпись данных)KEYUTIL (управление ключами)KJUR.jws (JWT обработка)Пример комбинированного подхода:
var sig = new KJUR.crypto.Signature({ alg: "SHA256withRSA" });
sig.init(privateKey);
sig.updateString(encryptedData);
var signature = sig.sign();
Типовые ошибки:
Диагностика обычно сводится к проверке входных параметров:
console.log(keyHex.length);
console.log(ivHex.length);
При взаимодействии с OpenSSL, WebCrypto или CryptoJS важно учитывать:
Особенно часто несовместимость возникает в GCM из-за различий в упаковке tag и ciphertext.