Расшифровка Webcrypto AES-CBC: ошибка операции — операция не удалась по причине, связанной с операцией

У меня есть следующий код для расшифровки зашифрованных данных AES с помощью Javascript Webcrypto-API, но он приводит к ошибке OperationError с сообщением «Операция не удалась по причине, связанной с операцией»:

function loadHexToArrybuffer(hex)
{
	return new Uint8Array(hex.match(/[\da-f]{2}/gi).map(h => parseInt(h, 16)));
}

var iv = loadHexToArrybuffer("47b79d24e3ec47c528abdaed8f3fafde");
var rawKey = loadHexToArrybuffer("8af4d72873e4016cd73a1d5b851e9cb2");
var encryptedData = loadHexToArrybuffer("2bb7a12a7e59f9fa3c3d4ff0eb502cde3187338cc3137af785995b364fc5b3fe9c208f225c7472bb3de55de18a665863f63030d652b870c4610a70bc771e8bc584df7c3bd2ce3fc1940115e556178e740891f7cac450204a4959916ac9c9cd5aedd92cc7e74a7a581a6d47a6c29fb46eee13ffd3f70616844f8e2bb929c60ad9")

async function test()
{
	var algorithm = {name: "AES-CBC", iv: iv};
	var key = await window.crypto.subtle.importKey("raw", rawKey, algorithm, false, ["decrypt"]);

	try
	{
		var decrypted = await window.crypto.subtle.decrypt(algorithm, key, encryptedData);
	}
	catch (e)
	{
		console.log(e); // OperationError: The operation failed for an operation-specific reason
	}
}

test();

Может ли кто-нибудь помочь мне здесь? Спасибо впереди!


person Tonke    schedule 04.07.2018    source источник
comment
Я не могу воспроизвести вашу ошибку (Safari 11.1.1). Код, кажется, работает нормально здесь. Я получаю CbTxsJz5GY6ID70a9Ji1UbhorbDmFEv0FtA58KBiAvCXpBa+D/2uDZv7acbgZtRvLbhAnHenYaJqHIy8WwYaipQsYjB13Ofnvkb5jRVNCdpNbIZ0zcJ8AzrCScPvZ+dF8hZbtsjAmdeBFxWGhd3TdAfJVvo7gn94ndir8A== в расшифрованном буфере в base64.   -  person Touffy    schedule 04.07.2018
comment
Обратите внимание, что из соображений безопасности вы всегда будете получать бесполезную ошибку operationError независимо от того, что пойдет не так с Web Crypto API.   -  person Touffy    schedule 04.07.2018
comment
О, это имеет смысл! Спасибо за отзыв, я получаю эту ошибку как в последней версии Firefox, так и в Chromium. Результат может быть правильным, так как я заменил реальные данные случайно сгенерированными.   -  person Tonke    schedule 04.07.2018
comment
Странный. Я воспроизвожу ошибку в Chrome. Я не понимаю, почему.   -  person Touffy    schedule 04.07.2018
comment
Я только что проверил, WebKitGTK+ 2.20.3 тоже работает.   -  person Tonke    schedule 04.07.2018
comment
Есть ли режим отладки, чтобы получить более описательное сообщение об ошибке?   -  person Tonke    schedule 04.07.2018


Ответы (1)


Вы не указываете, какой браузер и версию вы используете, каждая версия поддерживает свой набор алгоритмов.

Если вы хотите быстро проверить, что поддерживает каждый из них, см.: https://peculiarventures.github.io/pv-webcrypto-tests/

С учетом сказанного, моя первая мысль заключалась в том, что я бы не стал использовать CBC, если только не требуется взаимодействие с существующей системой, которая использует только CBC. Вместо этого вам следует взглянуть на AES-GCM, это аутентифицированный режим шифрования, который защищает от определенных атак, которые не будет выполняться обычным CBC, и менее подвержен ошибкам при использовании.

Вот пример шифрования GCM:

window.crypto.subtle.encrypt(
    {
        name: "AES-GCM",

        //Don't re-use initialization vectors!
        //Always generate a new iv every time your encrypt!
        //Recommended to use 12 bytes length
        iv: window.crypto.getRandomValues(new Uint8Array(12)),

        //Additional authentication data (optional)
        additionalData: ArrayBuffer,

        //Tag length (optional)
        tagLength: 128, //can be 32, 64, 96, 104, 112, 120 or 128 (default)
    },
    key, //from generateKey or importKey above
    data //ArrayBuffer of data you want to encrypt
)
.then(function(encrypted){
    //returns an ArrayBuffer containing the encrypted data
    console.log(new Uint8Array(encrypted));
})
.catch(function(err){
    console.error(err);
});

Если вам нужно использовать CBC, вот несколько хороших примеров использования: https://github.com/diafygi/webcrypto-examples#aes-cbc

person rmhrisk    schedule 24.07.2018