Вы не указываете, какой браузер и версию используете, каждая версия поддерживает свой набор алгоритмов.
Если вы хотите быстрый тест на то, что поддерживает каждый, смотрите: 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