Decrypt: примеры (JAVASCRIPT)
decrypt(algorithm (object, string), key (CryptoKey), data (BufferSource)): PromiseОсновная информация о функции decrypt
В JavaScript нет встроенной функции с именем decrypt. Под этим термином обычно понимают пользовательские или библиотечные функции для расшифровки данных. Наиболее часто используется crypto.subtle.decrypt() из Web Crypto API, который предоставляет низкоуровневые криптографические примитивы.
Аргументы crypto.subtle.decrypt()
- algorithm: Объект, определяющий алгоритм шифрования и параметры (например, AES-GCM, RSA-OAEP).
- key: CryptoKey - ключ, который будет использоваться для расшифровки.
- data: ArrayBuffer, TypedArray или DataView, содержащие зашифрованные данные.
Возвращаемое значение
Функция возвращает Promise, который выполняется с ArrayBuffer, содержащим расшифрованные данные. В случае ошибки (неверный ключ, поврежденные данные, неверный алгоритм) Promise отклоняется.
Область применения
Используется для безопасной расшифровки данных, ранее зашифрованных на стороне клиента или сервера, в контексте веб-приложений (HTTPS, безопасное хранение).
Примеры использования функции decrypt
Расшифровка с использованием AES-GCM
Пример асинхронной расшифровки текста:
async function decryptAESGCM(encryptedData, key, iv) {
const algorithm = { name: 'AES-GCM', iv: iv };
try {
const decrypted = await crypto.subtle.decrypt(algorithm, key, encryptedData);
return new TextDecoder().decode(decrypted);
} catch (e) {
console.error('Ошибка расшифровки:', e);
}
}
// Пример вызова (предполагается, что encryptedData, key и iv уже определены):
// const result = await decryptAESGCM(encryptedDataBuffer, secretKey, initializationVector);// Результат: // 'Секретное сообщение'
Расшифровка с использованием RSA-OAEP
async function decryptRSAOAEP(encryptedData, privateKey) {
const algorithm = { name: 'RSA-OAEP' };
const decrypted = await crypto.subtle.decrypt(algorithm, privateKey, encryptedData);
return new TextDecoder().decode(decrypted);
}Похожие функции в JavaScript
- crypto.subtle.encrypt(): Функция для шифрования данных. Применяется вместе с decrypt для полного цикла.
- Сторонние библиотеки (CryptoJS, Forge): Предоставляют упрощенные API для симметричного и асимметричного шифрования. CryptoJS использует строковый ввод/вывод, что удобнее для работы с текстом.
- Node.js Crypto Module: В среде Node.js доступен модуль crypto с методами createDecipheriv и createDecipher (устаревший). Эти функции синхронны и имеют другой API.
Web Crypto API предпочтительнее для веб-приложений из-за интеграции с браузером и поддержки. CryptoJS удобна для простых задач или совместимости. Node.js Crypto используется в серверной разработке.
Аналоги функции в других языках
Python (cryptography)
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
# Расшифровка AES-GCM
def decrypt_aes_gcm(ciphertext, key, iv, tag):
decryptor = Cipher(algorithms.AES(key), modes.GCM(iv, tag), default_backend()).decryptor()
return decryptor.update(ciphertext) + decryptor.finalize()PHP
// Расшифровка AES-256-GCM
function decrypt_aes_gcm($ciphertext, $key, $iv, $tag) {
$plaintext = openssl_decrypt($ciphertext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
return $plaintext;
}C (OpenSSL)
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
EVP_DecryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, key, iv);
EVP_DecryptUpdate(ctx, NULL, &len, aad, aad_len);
EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len);
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, tag_len, tag);
EVP_DecryptFinal_ex(ctx, plaintext + len, &len);
EVP_CIPHER_CTX_free(ctx);Основные отличия: синтаксис, обработка ошибок (исключения vs коды ошибок), управление памятью (вручную в C). Web Crypto API работает асинхронно, тогда как многие другие реализации синхронны.
Распространенные ошибки
Несоответствие алгоритма или параметров
// Шифрование с одним IV, расшифровка с другим
const encryptAlg = { name: 'AES-GCM', iv: iv1 };
const decryptAlg = { name: 'AES-GCM', iv: iv2 }; // Ошибка!
// Приведет к отклонению PromiseDOMException: Operation error
Использование неверного ключа
// Попытка расшифровать данные ключом, не соответствующим ключу шифрования
const wrongKey = await crypto.subtle.generateKey(
{ name: 'AES-GCM', length: 256 },
true,
['encrypt', 'decrypt']
);
// decrypt с wrongKey завершится ошибкойНекорректный тип данных
// Передача строки вместо ArrayBuffer
await crypto.subtle.decrypt(algorithm, key, 'зашифрованные данные'); // ОшибкаTypeError: Provided data must be an ArrayBuffer
Изменения в Web Crypto API
Спецификация Web Crypto API стабильна, но добавляется поддержка новых алгоритмов. Недавно была добавлена поддержка AES-KW (Key Wrap). Метод crypto.subtle.decrypt не менял сигнатуру, но изменились требования безопасности в браузерах: контексты без безопасного происхождения (non-secure origins) могут иметь ограниченный доступ к криптографическим примитивам.
Расширенные примеры использования
Расшифровка с дополнительными аутентифицированными данными (AAD)
async function decryptWithAAD(encryptedData, key, iv, aad) {
const algorithm = {
name: 'AES-GCM',
iv: iv,
additionalData: aad // ArrayBuffer с дополнительными данными
};
return await crypto.subtle.decrypt(algorithm, key, encryptedData);
}Обработка потокового шифрования (частичная расшифровка)
Web Crypto API не поддерживает потоковую расшифровку напрямую. Реализуется через разделение данных на блоки:
async function streamDecrypt(chunks, key, iv) {
const algorithm = { name: 'AES-CTR', counter: iv, length: 64 };
let decryptedChunks = [];
for (let chunk of chunks) {
const decrypted = await crypto.subtle.decrypt(algorithm, key, chunk);
decryptedChunks.push(decrypted);
}
return decryptedChunks;
}Использование с ключами, импортированными из формата JWK
async function decryptWithJWK(encryptedData, jwkKey) {
const key = await crypto.subtle.importKey(
'jwk',
jwkKey,
{ name: 'AES-GCM' },
false,
['decrypt']
);
return crypto.subtle.decrypt({ name: 'AES-GCM', iv: new Uint8Array(12) }, key, encryptedData);
}Расшифровка RSA с использованием OAEP и хеширования SHA-512
async function decryptRSAOAEP_SHA512(encryptedData, privateKey) {
const algorithm = {
name: 'RSA-OAEP',
hash: { name: 'SHA-512' } // Можно указать хеш-функцию
};
return await crypto.subtle.decrypt(algorithm, privateKey, encryptedData);
}