HarmonyOS @ohos.security.cryptoFramework使用cipher解密失败?

加密内容为长度为12个字符长度时,使用cipher解密:const output = await cipher.doFinal(null); 这一步会被 catch,没有error信息。

例子:使用testContent1进行cipher加密,字符长度为12,key为AES256类型,加密解密都可以。

const testContent1 = "aaa_bbb_ccc_"; 

加密后的数据:19D2CF481514BA7C3D08F80D5A8960C35AD01F54DEEC6453AF9B42538FEECF96使用testContent2进行cipher加密,字符长度为16,key为AES256类型,加密可以,解密被catch没有错误信息。

const testContent2 = "aaa_bbb_ccc_ddd_"; 

加密后的数据: 203A2C904532ED37C1F25958895E901B8972477F03049230298ED9FCB2F9CCA7

// 解密代码
const AES256 = 'AES256';
const AES_CBC_INIT = 'AES|CBC|PKCS5';
const IV_PARAMETER_LENGTH = 32;
try {
  let symKeyGenerator = cryptoFramework.createSymKeyGenerator(AES256);
  let skeySpec = await symKeyGenerator.convertKey({ data: aesKey });
  let cipher = cryptoFramework.createCipher(AES_CBC_INIT);
  let ivParameter = content.substring(0, IV_PARAMETER_LENGTH);
  const ivparam: cryptoFramework.IvParamsSpec = {
    algName: "IvParamsSpec",
    iv: {
      data: parseHexStr2Byte(ivParameter)
    }
  };
  await cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, skeySpec, ivparam);
  await cipher.update({
    data: parseHexStr2Byte(content.substring(IV_PARAMETER_LENGTH))
  });
  const output = await cipher.doFinal(null);
  const ciphertextBytes = output.data;
  return bufferToString(ciphertextBytes);
} catch (e) {
  LogUtil.error(e);
}
阅读 569
1 个回答

代码使用错误,使用update之后自己做完dofinal需要将所有的结果拼接起来得到最后的结果,如果数据量较少,建议不使用update直接使用dofinal。这个地方报错是因为使用update解密后正好解密完dofinal里面没有结果导致对空数据做解密。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进