加密微妙解密参数不是类型 "CryptoKey"
Crypto Subtle Decrypt Parameter Not Type "CryptoKey"
我正在尝试 decrypt a string using SubtleCrypto that was pre-generated。
我得到的不是解密文本,而是错误:无法在 'SubtleCrypto' 上执行 'decrypt':参数 2 不是 'CryptoKey' 类型。
console.log(window.crypto.subtle.decrypt({name:"AES-CBC", iv:""}, "1234567890123456", "i4+WxNH8XYMnAm7RsRkfOw=="));
我已经尝试研究错误,但没有发现与此类基本示例相关的任何内容。我做错了什么?
参数类型错误:IV 和数据必须作为 BufferSource
, the key as CryptoKey
, see SubtleCrypto.decrypt()
. A CryptoKey
is returned by SubtleCrypto.importKey()
传递,用于导入密钥。
WebCrypto API(低级别API)不提供对数据转换的支持,例如Base64 编码的数据或字符串 BufferSource
,因此必须使用其他辅助方法。
以下代码解密密文:
var keyData = str2ab("1234567890123456");
var iv = new Uint8Array(16).buffer;
var ciphertext = b642ab("i4+WxNH8XYMnAm7RsRkfOw==");
(async () => {
var decrypted = await decrypt();
var decryptedStr = new TextDecoder().decode(decrypted);
console.log(decryptedStr);
})();
async function decrypt() {
var key = await importKey();
try {
return await crypto.subtle.decrypt(
{ name: "AES-CBC", iv: iv },
key,
ciphertext
);
} catch (ex) {
console.error("Error: Name: ", ex.name, ", Message: ", ex.message);
}
}
async function importKey() {
var key = await crypto.subtle.importKey(
"raw",
keyData,
{ name: "AES-CBC" },
true,
["decrypt", "encrypt"]
);
return key;
}
// Helper -----------------------------------------------
//
function str2ab(str) {
const buf = new ArrayBuffer(str.length);
const bufView = new Uint8Array(buf);
for (let i = 0, strLen = str.length; i < strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
//
function b642ab(base64) {
var binary_string = window.atob(base64);
var len = binary_string.length;
var bytes = new Uint8Array(len);
for (var i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
return bytes.buffer;
}
我正在尝试 decrypt a string using SubtleCrypto that was pre-generated。
我得到的不是解密文本,而是错误:无法在 'SubtleCrypto' 上执行 'decrypt':参数 2 不是 'CryptoKey' 类型。
console.log(window.crypto.subtle.decrypt({name:"AES-CBC", iv:""}, "1234567890123456", "i4+WxNH8XYMnAm7RsRkfOw=="));
我已经尝试研究错误,但没有发现与此类基本示例相关的任何内容。我做错了什么?
参数类型错误:IV 和数据必须作为 BufferSource
, the key as CryptoKey
, see SubtleCrypto.decrypt()
. A CryptoKey
is returned by SubtleCrypto.importKey()
传递,用于导入密钥。
WebCrypto API(低级别API)不提供对数据转换的支持,例如Base64 编码的数据或字符串 BufferSource
,因此必须使用其他辅助方法。
以下代码解密密文:
var keyData = str2ab("1234567890123456");
var iv = new Uint8Array(16).buffer;
var ciphertext = b642ab("i4+WxNH8XYMnAm7RsRkfOw==");
(async () => {
var decrypted = await decrypt();
var decryptedStr = new TextDecoder().decode(decrypted);
console.log(decryptedStr);
})();
async function decrypt() {
var key = await importKey();
try {
return await crypto.subtle.decrypt(
{ name: "AES-CBC", iv: iv },
key,
ciphertext
);
} catch (ex) {
console.error("Error: Name: ", ex.name, ", Message: ", ex.message);
}
}
async function importKey() {
var key = await crypto.subtle.importKey(
"raw",
keyData,
{ name: "AES-CBC" },
true,
["decrypt", "encrypt"]
);
return key;
}
// Helper -----------------------------------------------
//
function str2ab(str) {
const buf = new ArrayBuffer(str.length);
const bufView = new Uint8Array(buf);
for (let i = 0, strLen = str.length; i < strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
//
function b642ab(base64) {
var binary_string = window.atob(base64);
var len = binary_string.length;
var bytes = new Uint8Array(len);
for (var i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
return bytes.buffer;
}