Decrypt: примеры (JAVASCRIPT)

Расшифровка информации с помощью JavaScript
Раздел: Crypto, Шифрование
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 }; // Ошибка!
// Приведет к отклонению Promise
DOMException: 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)

Пример javascript
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 не поддерживает потоковую расшифровку напрямую. Реализуется через разделение данных на блоки:

Пример javascript
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

Пример javascript
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

Пример javascript
async function decryptRSAOAEP_SHA512(encryptedData, privateKey) {
    const algorithm = {
        name: 'RSA-OAEP',
        hash: { name: 'SHA-512' } // Можно указать хеш-функцию
    };
    return await crypto.subtle.decrypt(algorithm, privateKey, encryptedData);
}

JS decrypt function comments

En
Decrypt Decrypts encrypted data