首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Webcrypto AES-CBC解密:操作错误-由于特定于操作的原因,操作失败

Webcrypto AES-CBC解密:操作错误-由于特定于操作的原因,操作失败
EN

Stack Overflow用户
提问于 2018-07-04 19:24:01
回答 1查看 3.4K关注 0票数 3

我有以下代码来使用Javascript Webcrypto-API解密AES加密的数据,但它会产生一个"OperationError“,并显示消息"The operation failed for an operation-specific reason":

代码语言:javascript
复制
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();

有人能帮我吗?感谢大家的支持!

EN

回答 1

Stack Overflow用户

发布于 2018-07-24 12:50:56

您不需要说明您正在使用的浏览器和版本,每个版本都支持不同的算法集。

如果您想快速测试每个支持的内容,请参阅:https://peculiarventures.github.io/pv-webcrypto-tests/

话虽如此,我的第一个想法是,除非有必要与只使用CBC的现有系统进行互操作,否则我不会使用CBC。相反,你应该看看AES-GCM,它是一种身份验证的加密模式,可以防止普通CBC不会受到的某些攻击,而且在使用时也不容易出错。

以下是GCM的加密示例:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51172513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档