В библиотеке CryptoJS модуль enc отвечает за
преобразование данных между различными представлениями. Все
криптографические операции внутри CryptoJS работают с внутренним типом
данных WordArray, поэтому любые входные и выходные значения
должны быть корректно закодированы или декодированы.
Пространство имён CryptoJS.enc содержит набор
кодировщиков (encoders), каждый из которых реализует два базовых
метода:
parse(string) — преобразует строку в
WordArraystringify(wordArray) — преобразует
WordArray обратно в строкуЭто позволяет гибко управлять представлением данных при шифровании, хэшировании и других операциях.
WordArrayWordArray — ключевая структура данных в CryptoJS. Она
представляет собой массив 32-битных слов (words) и длину в
байтах (sigBytes).
Пример структуры:
{
words: [0x12345678, 0x90abcdef],
sigBytes: 8
}
Особенности:
words содержит 4 байтаsigBytes указывает фактическое количество значимых
байтовCryptoJS.enc.Utf8)Наиболее часто используемая кодировка для строк.
WordArray:const wordArray = CryptoJS.enc.Utf8.parse("Hello");
const str = CryptoJS.enc.Utf8.stringify(wordArray);
Особенности:
CryptoJS.SHA256("text"))CryptoJS.enc.Hex)Представляет данные в шестнадцатеричном виде.
const hash = CryptoJS.SHA256("Hello");
const hexString = hash.toString(CryptoJS.enc.Hex);
Результат:
185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
const wordArray = CryptoJS.enc.Hex.parse(hexString);
Особенности:
CryptoJS.enc.Base64)Используется для компактного текстового представления бинарных данных.
const wordArray = CryptoJS.enc.Utf8.parse("Hello");
const base64 = CryptoJS.enc.Base64.stringify(wordArray);
Результат:
SGVsbG8=
const parsed = CryptoJS.enc.Base64.parse(base64);
const original = CryptoJS.enc.Utf8.stringify(parsed);
Особенности:
CryptoJS.enc.Latin1)Работает с однобайтовыми символами (ISO-8859-1).
const wordArray = CryptoJS.enc.Latin1.parse("Hello");
const str = CryptoJS.enc.Latin1.stringify(wordArray);
Особенности:
CryptoJS.enc.Utf16)Поддерживает 16-битные символы.
const wordArray = CryptoJS.enc.Utf16.parse("Hello");
const str = CryptoJS.enc.Utf16.stringify(wordArray);
Особенности:
CryptoJS автоматически применяет UTF-8 при передаче строки:
const hash = CryptoJS.SHA256("Пример");
Эквивалентно:
const wordArray = CryptoJS.enc.Utf8.parse("Пример");
const hash = CryptoJS.SHA256(wordArray);
Вывод можно изменить:
hash.toString(CryptoJS.enc.Base64);
hash.toString(CryptoJS.enc.Hex);
При шифровании строки:
const encrypted = CryptoJS.AES.encrypt("Secret", "key");
CryptoJS:
const data = CryptoJS.enc.Utf8.parse("Secret");
const key = CryptoJS.enc.Hex.parse("00112233445566778899aabbccddeeff");
const encrypted = CryptoJS.AES.encrypt(data, key, {
iv: CryptoJS.enc.Hex.parse("00000000000000000000000000000000")
});
Возможна цепочка преобразований:
const utf8 = CryptoJS.enc.Utf8.parse("Hello");
const hex = CryptoJS.enc.Hex.stringify(utf8);
const base64 = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(hex));
Такие операции полезны при:
CryptoJS позволяет создавать кастомные кодировщики:
CryptoJS.enc.Custom = {
stringify: function (wordArray) {
// логика преобразования
},
parse: function (str) {
// обратная логика
}
};
Требования:
stringify должен возвращать строкуparse должен возвращать WordArray1. Несоответствие кодировок
// Ошибка: строка интерпретируется неверно
CryptoJS.enc.Hex.parse("Привет");
2. Потеря данных при Latin1
CryptoJS.enc.Latin1.parse("Привет"); // некорректно
3. Двойное кодирование
const base64 = CryptoJS.enc.Base64.stringify(
CryptoJS.enc.Utf8.parse("Hello")
);
Если затем снова применять parse/stringify
без необходимости — возникает путаница.
Модуль enc тесно интегрирован с:
CryptoJS.lib.WordArrayCryptoJS.algo.* (алгоритмы)CryptoJS.format.* (форматы вывода)Пример взаимодействия:
const hash = CryptoJS.algo.SHA256.create();
hash.update(CryptoJS.enc.Utf8.parse("data"));
const result = hash.finalize().toString(CryptoJS.enc.Hex);
parse и stringify —
относительно дешёвые операцииCryptoJS.encПространство имён CryptoJS.enc выполняет роль моста
между:
WordArray)Без корректного понимания кодировок невозможно безопасно и предсказуемо использовать криптографические функции библиотеки.