Метод crypto.subtle.encrypt() выполняет шифрование
данных с использованием заданного алгоритма и криптографического ключа.
Он является частью Web Crypto API и относится к интерфейсу
SubtleCrypto, предоставляемому объектом
crypto.subtle в браузерной среде.
Метод работает исключительно с бинарными данными
(ArrayBuffer или типизированные массивы), не поддерживает
строки напрямую и всегда возвращает результат в виде
Promise<ArrayBuffer>.
crypto.subtle.encrypt(algorithm, key, data)
algorithm Объект, описывающий используемый алгоритм шифрования и его параметры. Структура зависит от выбранного алгоритма:
AES-GCMAES-CBCRSA-OAEPChaChaKey (в некоторых реализациях)key Объект CryptoKey, полученный ранее
через crypto.subtle.generateKey, importKey или
deriveKey. Ключ должен иметь назначение
"encrypt".
data Исходные данные для шифрования в формате:
ArrayBufferTypedArrayDataViewШифрование в Web Crypto API происходит в изолированном контексте
браузера и не блокирует основной поток выполнения. Все операции
выполняются асинхронно через Promise.
const encrypted = await crypto.subtle.encrypt(algorithm, key, data);
Результатом всегда является ArrayBuffer, содержащий
зашифрованный текст (ciphertext) и, в зависимости от алгоритма,
дополнительные данные (например, IV или authentication tag в случае
AES-GCM).
Так как API работает только с бинарными данными, строки необходимо предварительно кодировать:
const encoder = new TextEncoder();
const data = encoder.encode("Секретное сообщение");
Обратное преобразование выполняется через TextDecoder
после расшифровки.
AES-GCM является одним из наиболее часто используемых симметричных алгоритмов благодаря встроенной аутентификации данных.
const key = await crypto.subtle.generateKey(
{
name: "AES-GCM",
length: 256
},
true,
["encrypt", "decrypt"]
);
IV (initialization vector) должен быть уникальным для каждого шифрования:
const iv = crypto.getRandomValues(new Uint8Array(12));
const encoder = new TextEncoder();
const data = encoder.encode("Конфиденциальная информация");
const encrypted = await crypto.subtle.encrypt(
{
name: "AES-GCM",
iv: iv
},
key,
data
);
Результат encrypted содержит зашифрованные данные вместе
с аутентификационным тегом.
RSA используется для шифрования небольших объёмов данных или ключей.
const publicKey = await crypto.subtle.importKey(
"jwk",
jwkPublicKey,
{
name: "RSA-OAEP",
hash: "SHA-256"
},
true,
["encrypt"]
);
const encoder = new TextEncoder();
const data = encoder.encode("Сообщение для RSA");
const encrypted = await crypto.subtle.encrypt(
{
name: "RSA-OAEP"
},
publicKey,
data
);
Метод всегда возвращает ArrayBuffer. Для дальнейшей
передачи или хранения часто используется преобразование в Base64:
function arrayBufferToBase64(buffer) {
const bytes = new Uint8Array(buffer);
let binary = "";
for (let i = 0; i < bytes.byteLength; i++) {
binary += String.fromCharCode(bytes[i]);
}
return btoa(binary);
}
Метод может отклонить Promise в следующих случаях:
Если объект algorithm не соответствует поддерживаемому
формату.
Если ключ:
["decrypt"] вместо
["encrypt"])Если data не является
ArrayBuffer-совместимым типом.
Например:
Web Crypto API реализован на уровне браузера и использует нативные криптографические библиотеки, поэтому:
extractable: falseВ алгоритмах типа AES-GCM повторное использование IV с одним ключом приводит к компрометации данных.
RSA не предназначен для больших сообщений. Типичный подход — гибридное шифрование:
extractable: false
снижает риск утечки ключа через exportKey.
crypto.subtle.encrypt() часто используется вместе с:
generateKey() — создание ключейimportKey() — загрузка внешних ключейexportKey() — экспорт (ограниченно)decrypt() — обратная операцияdigest() — хеширование перед шифрованием или для
проверки целостностиРезультирующий ArrayBuffer включает:
Это позволяет одновременно обеспечивать конфиденциальность и целостность данных без дополнительных механизмов.
Приводит к утечке информации о XOR-структуре данных.
Нарушает смысл использования Web Crypto API.
Метод не принимает строки напрямую и всегда требует кодирования.
const key = await crypto.subtle.generateKey(
{ name: "AES-GCM", length: 256 },
true,
["encrypt", "decrypt"]
);
const iv = crypto.getRandomValues(new Uint8Array(12));
const encoder = new TextEncoder();
const data = encoder.encode("Тестовое сообщение");
const encrypted = await crypto.subtle.encrypt(
{ name: "AES-GCM", iv },
key,
data
);
Метод crypto.subtle.encrypt() является базовым
строительным блоком криптографических операций в браузере и определяет
модель безопасного симметричного и асимметричного шифрования в Web
Crypto API.