HarmonyOS 鸿蒙Next Aes解密Hex输出问题

发布于 1周前 作者 zlyuanteng 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next Aes解密Hex输出问题

使用AES解密时,一直在报解密异常,然后我这边排查了下我们的解密要用Hex方式输出解密,其他方式都是解密失败

代码:

import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { buffer, util } from '@kit.ArkTS';
const key: string = '';
const AES128: string = 'AES128';
const AES128_PKCS7: string = 'AES128|CBC|PKCS7';
const iv: string = '';
/**

 AES加解密工具实现类
 */
let base = new util.Base64Helper();
export class AESUtils{
  // 解密
  async aesDecrypt(message: string, callback:(result: string) => void) {
    let globalResult = ""
    try {
      let globalCipher = cryptoFramework.createCipher(AES128_PKCS7);
      let symKeyGenerator = cryptoFramework.createSymKeyGenerator(AES128);

      let dataUint8Array =HexStrTouint8Array(key)
      let keyBlob: cryptoFramework.DataBlob = { data: dataUint8Array }
      let promiseSymKey = await symKeyGenerator.convertKey(keyBlob)
      // /*设置偏移量 */
      let globalCbcParams = genCBCParamsSpec();
      await globalCipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, promiseSymKey, globalCbcParams);
      let plainText: cryptoFramework.DataBlob = { data: base.decodeSync(message) }
      let result = await globalCipher.doFinal(plainText)
      globalResult = uint8ArrayToString(result.data);
      callback(globalResult)
      console.log("test---解密==》"+globalResult)
    }catch (err){
      console.log(err.message)
    }
  }

}

function genCBCParamsSpec() {
  // let arr =
  let dataIv = new Uint8Array(HexStrTouint8Array(iv));
  let ivBlob: cryptoFramework.DataBlob = {
    data: dataIv
  };

  let cbcParamsSpec: cryptoFramework.IvParamsSpec = {
    iv: ivBlob,
    algName: 'IvParamsSpec'
  };
  return cbcParamsSpec;
}
//十六进制转Uint8Array
function HexStrTouint8Array(data: string): Uint8Array {
  return new Uint8Array(buffer.from(data, 'hex').buffer);;
}
// 字符串转成字节流
function stringToUint8Array(str: string) {
  return new Uint8Array(buffer.from(str,'utf-8').buffer);
}
// 字节流转成可理解的字符串
function uint8ArrayToString(array:Uint8Array) {
  // 将UTF-8编码转换成Unicode编码
  let out: string = "";
  let index: number = 0;
  let len: number = array.length;
  while (index < len) {
    let character = array[index++];
    switch(character >> 4) {
      case 0:
      case 1:
      case 2:
      case 3:
      case 4:
      case 5:
      case 6:
      case 7:
        out += String.fromCharCode(character);
        break;
      case 12:
      case 13:
        out += String.fromCharCode(((character & 0x1F) << 6) | (array[index++] & 0x3F));
        break;
      case 14:
        out += String.fromCharCode(((character & 0x0F) << 12) | ((array[index++] & 0x3F) << 6) | ((array[index++] & 0x3F) << 0));
        break;
      default:
        break;
    }
  }
  return out;
}

function uint8ArrayToHexStr(data: Uint8Array): string {
  let hexString = "";
  let i: number;
  for (i = 0; i < data.length; i++) {
    let char = ('00' + data[i].toString(16)).slice(-2);
    hexString += char;
  }
  return hexString;
}

解密后报错信息: 错误描述:Error: convert sym key failed.[@605fbf34](/user/605fbf34)


更多关于HarmonyOS 鸿蒙Next Aes解密Hex输出问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复
可以参考下:

let str= "n+lm3P3aQ/MdESLxsvLvSA=="

这是base64格式数据,传入使用 new util.Base64Helper().decodeSync(str)

let str= '9aba2f2ecb9a3508e3c0c70346e91e0d'

这是十六进制数据,传入时使用new Uint8Array(buffer.from(data, 'hex').buffer)

更多关于HarmonyOS 鸿蒙Next Aes解密Hex输出问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS 鸿蒙Next Aes解密Hex输出问题,这里提供直接的操作说明:

在HarmonyOS环境下进行Aes解密并输出Hex格式的结果,通常涉及以下几个步骤:

  1. 初始化Aes解密上下文: 使用系统提供的Aes解密API,根据密钥和模式(如CBC、ECB等)初始化解密上下文。

  2. 设置输入数据: 确保输入数据为正确的加密Hex字符串,需先将其转换为字节数组。可以使用系统内置的Hex解码函数完成此转换。

  3. 执行解密操作: 将解码后的字节数组作为输入,调用Aes解密函数进行解密。确保传入正确的初始化向量(IV,如适用)。

  4. 获取并转换解密结果: 解密完成后,获取解密后的字节数组,并使用系统提供的Hex编码函数将其转换为Hex字符串输出。

  5. 错误处理: 检查解密过程中可能出现的错误码,如解密失败,需根据错误码进行相应处理。

以上步骤为HarmonyOS环境下Aes解密并输出Hex格式结果的直接操作路径。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部