AES в CryptoJS реализуется поверх стандартных криптографических примитивов: симметричного блочного шифра, режима работы (чаще CBC) и механизма дополнения данных. Вся логика полного цикла шифрования строки сводится к нескольким строго связанным этапам: подготовка ключевого материала, преобразование строки в бинарный формат, выполнение шифрования с использованием IV, сериализация результата и обратное восстановление исходного текста.
В среде браузера или Node.js библиотека подключается стандартным образом:
import CryptoJS from "crypto-js";
или
const CryptoJS = require("crypto-js");
Внутри CryptoJS данные почти всегда представлены в виде объектов WordArray. Это промежуточный формат между строкой и бинарным представлением, необходимый для корректной работы AES.
Строка перед шифрованием не может быть использована напрямую. Она преобразуется в UTF-8 представление, а затем в WordArray автоматически внутри методов CryptoJS.
const message = "Секретное сообщение";
AES требует два критически важных элемента:
На практике ключ часто задаётся строкой и преобразуется через хеширование:
const password = "strong-password";
const key = CryptoJS.SHA256(password);
SHA-256 обеспечивает фиксированную длину ключа 256 бит, что соответствует AES-256.
IV должен быть уникальным для каждого шифрования:
const iv = CryptoJS.lib.WordArray.random(16);
16 байт соответствует размеру блока AES.
Основной этап выполняется через
CryptoJS.AES.encrypt.
const encrypted = CryptoJS.AES.encrypt(message, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
mode CBC Режим цепочки блоков. Каждый блок шифруется с учётом предыдущего.
padding PKCS7 Дополняет строку до размера блока AES.
iv Обеспечивает уникальность результата при одинаковом ключе и одинаковом тексте.
Результат encrypt содержит бинарные данные, которые
обычно сериализуются в Base64:
const ciphertext = encrypted.toString();
На этом этапе получается строка, которую можно безопасно хранить или передавать.
В реальных системах IV обязательно сохраняется вместе с шифротекстом.
const payload = {
iv: iv.toString(CryptoJS.enc.Base64),
data: ciphertext
};
Без IV расшифровка становится невозможной.
Обратная операция требует тех же параметров: ключ, IV и шифротекст.
const decrypted = CryptoJS.AES.decrypt(payload.data, key, {
iv: CryptoJS.enc.Base64.parse(payload.iv),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
После расшифровки результат находится в формате WordArray и требует преобразования:
const originalMessage = decrypted.toString(CryptoJS.enc.Utf8);
const CryptoJS = require("crypto-js");
// исходное сообщение
const message = "Секретное сообщение";
// ключ
const password = "strong-password";
const key = CryptoJS.SHA256(password);
// IV
const iv = CryptoJS.lib.WordArray.random(16);
// шифрование
const encrypted = CryptoJS.AES.encrypt(message, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
const ciphertext = encrypted.toString();
// сохранение данных
const payload = {
iv: iv.toString(CryptoJS.enc.Base64),
data: ciphertext
};
// расшифрование
const decrypted = CryptoJS.AES.decrypt(payload.data, key, {
iv: CryptoJS.enc.Base64.parse(payload.iv),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
const original = decrypted.toString(CryptoJS.enc.Utf8);
console.log(original);
CryptoJS не оперирует строками напрямую. Внутренний формат:
CBC (Cipher Block Chaining):
Если длина текста не кратна 16 байтам:
0x01, 0x02…CryptoJS поддерживает несколько форматов вывода:
encrypted.toString(CryptoJS.enc.Base64);
encrypted.toString(CryptoJS.enc.Hex);
Base64 используется чаще из-за компактности.
В реальных приложениях структура выглядит так:
{
iv: "Base64...",
ciphertext: "Base64...",
algorithm: "AES",
mode: "CBC",
padding: "PKCS7"
}
Это позволяет однозначно восстановить параметры шифрования.
При фиксированном IV:
Без IV расшифрование невозможно, даже при наличии ключа.
CryptoJS.AES.encrypt(message, "password")
Такой вариант создаёт внутренную производную ключа, но поведение может отличаться от ожидаемого при SHA-256.
Шифрование и расшифрование обязаны использовать одинаковые:
Более безопасный вариант:
const key = CryptoJS.PBKDF2(password, "salt", {
keySize: 256 / 32,
iterations: 1000
});
Это снижает риск атак на слабые пароли.