Передача ключа в CryptoJS: строка и WordArray
В криптографических операциях в CryptoJS ключ может передаваться в нескольких форматах. Наиболее распространённые из них — строка (String) и объект WordArray. Несмотря на то, что оба варианта часто приводят к корректной работе алгоритмов, их внутренняя обработка существенно различается.
При передаче ключа как строки он проходит автоматическое преобразование внутри библиотеки. В большинстве случаев используется кодировка UTF-8, если не указано иное.
const key = "secretkey123";
const encrypted = CryptoJS.AES.encrypt("message", key);
Строка в этом случае не является криптографическим объектом. Она интерпретируется как последовательность символов, которая затем преобразуется в байты.
Ключевым моментом является то, что одинаковая строка не всегда гарантирует идентичное бинарное представление в разных контекстах, особенно при наличии нестандартных символов.
WordArray — это основной формат представления бинарных данных в CryptoJS. Он используется как для ключей, так и для IV, хешей и шифртекстов.
Структура WordArray включает:
Пример создания WordArray из строки:
const key = CryptoJS.enc.Utf8.parse("secretkey123");
Также возможны другие кодировки:
CryptoJS.enc.Hex.parse(...)
CryptoJS.enc.Base64.parse(...)
WordArray обеспечивает детерминированность, что критически важно при повторяемом шифровании и дешифровании.
Различие между двумя форматами заключается не только в типе данных, но и в способе интерпретации:
При использовании AES различие между строкой и WordArray становится особенно заметным.
const encrypted = CryptoJS.AES.encrypt("text", "secretkey123");
const decrypted = CryptoJS.AES.decrypt(encrypted, "secretkey123");
Здесь библиотека самостоятельно приводит строку к внутреннему виду, но это поведение скрыто.
const key = CryptoJS.enc.Utf8.parse("secretkey123");
const encrypted = CryptoJS.AES.encrypt("text", key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
const decrypted = CryptoJS.AES.decrypt(encrypted, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
В этом случае отсутствуют скрытые преобразования, и поведение становится полностью предсказуемым.
CryptoJS предоставляет набор энкодеров для явного преобразования:
CryptoJS.enc.Utf8.parse("text")
CryptoJS.enc.Hex.parse("68656c6c6f")
CryptoJS.enc.Base64.parse("aGVsbG8=")
Каждый из этих методов формирует WordArray с корректным sigBytes и внутренним массивом words.
Для обратного преобразования используются методы stringify:
CryptoJS.enc.Utf8.stringify(wordArray)
CryptoJS.enc.Hex.stringify(wordArray)
CryptoJS.enc.Base64.stringify(wordArray)
Это позволяет контролировать формат вывода при работе с зашифрованными данными и ключами.
При работе с криптографическими алгоритмами возникают ситуации, где различие форматов становится критичным:
WordArray устраняет эти проблемы за счёт явного описания бинарной структуры.
const key = "ключ";
const encrypted = CryptoJS.AES.encrypt("data", key);
Из-за UTF-8 преобразования символов результат может отличаться в зависимости от среды выполнения или последующей интерпретации.
Хотя сам по себе формат WordArray не усиливает криптографическую стойкость, он снижает риск ошибок, связанных с:
В криптографических системах предсказуемость обработки данных имеет прямое влияние на корректность реализации протоколов.
В прикладных задачах WordArray чаще применяется в следующих случаях:
Строковый формат чаще используется на уровне API и пользовательского ввода, где требуется удобство, а не строгая бинарная точность.