加密微妙解密参数未键入“CryptoKey”

Posted

技术标签:

【中文标题】加密微妙解密参数未键入“CryptoKey”【英文标题】:Crypto Subtle Decrypt Parameter Not Type "CryptoKey" 【发布时间】:2021-05-19 19:16:12 【问题描述】:

我正在尝试decrypt a string using SubtleCrypto 那是pre-generated。

我得到的不是解密文本,而是错误:无法在“SubtleCrypto”上执行“解密”:参数 2 不是“CryptoKey”类型。

console.log(window.crypto.subtle.decrypt(name:"AES-CBC", iv:"", "1234567890123456", "i4+WxNH8XYMnAm7RsRkfOw=="));

我已尝试研究该错误,但没有遇到与此类基本示例相关的任何内容。我做错了什么?

【问题讨论】:

【参考方案1】:

参数类型错误:IV和数据必须传递为BufferSource,key为CryptoKey,见SubtleCrypto.decrypt()SubtleCrypto.importKey()返回一个CryptoKey,用于导入密钥。

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 -----------------------------------------------

// https://***.com/a/11058858
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;


// https://***.com/a/21797381/9014097
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;

【讨论】:

以上是关于加密微妙解密参数未键入“CryptoKey”的主要内容,如果未能解决你的问题,请参考以下文章

【参数加密】前后端分离请求参数加密与响应结果加密处理

Springboot yml配置参数加密 ,jasypt自定义解密器

URL内 参数加密解密

PHP带参数可逆的加密解密函数,可用于cookie的加密解密

加密/解密 - iphone 到 java - BadPaddingException:给定最终块未正确填充

通过php base64函数进行加密解密