HarmonyOS 怎样使用 AESAES256|CBC|PKCS7 256长度加密?

在ArkTS API 11版本中 怎样使用 AESAES256|CBC|PKCS7 256长度加密,可以提供例子吗?

看官方文档以及论坛上都是 128长度的,没有找到256长度加密的例子

阅读 752
1 个回答

AES加解密可以参考文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/crypto-aes-sym-encrypt-decrypt-cbc-0000001774120462

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/huks-encryption-decryption-arkts-0000001821000325

256长度加解密的demo可以参考以下代码:

/**
 * 请求加密
 * @param json 参数
 * @param key 秘钥
 * @returns {string} 密文
 */
function requestEncrypt(json, key = AppConstant.SECRET) {
  let cipherAlgName = 'AES256|CBC|PKCS7';
  //创建秘钥生成器
  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256')

  let ivParam: cryptoFramework.IvParamsSpec = {
    algName: 'IvParamsSpec',
    iv: {
      //如果项目需要就将空字符替换
      data: stringToUint8Array('', 32)
    }
  }
  let cipher;

  //convertKey方法是通过秘钥生成symKey
  return symKeyGenerator.convertKey({
    data: stringToUint8Array(key)
  }).then(symKey => {
    try {
      //创建cipher
      cipher = cryptoFramework.createCipher(cipherAlgName);
      console.info(`xx cipher algName: ${cipher.algName}`);
    } catch (error) {
      console.error(`xx createCipher failed, ${error.code}, ${error.message}`);
      return null
    }
    //创建cipher之后才能初始化
    return cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, ivParam)
      .then(() => {
        //创建cipher且初始化之后才能执行doFinal
        return cipher.doFinal({
          data: stringToUint8Array(JSON.stringify(json))
        })
      })
      .then(output => {
        let base64 = new util.Base64Helper();
        let result = base64.encodeToStringSync(output.data);
        return new Promise((resolve) => {
          resolve(result)
        })
      }).catch(e => {
        return new Promise((_, reject) => {
          reject(e)
        })
      })
  }).catch(e => {
    return new Promise((_, reject) => {
      reject(e)
    })
  })
}


/**
 *把密钥、明文等转换成输入数据需要的格式
 */
function stringToUint8Array(str, len = null) {
  let arr = [];
  if (len == null) {
    len = str.length
  }
  for (let i = 0; i < len; i++) {
    if (str.length > i) {
      arr.push(str.charCodeAt(i))
    } else {
      arr.push(0)
    }
  }
  return new Uint8Array(arr);
}
/**
 * 解密
 * @param str 密文
 * @param key 私钥
 * @returns {*|string} 明文
 */
function decrypt(str, key = AppConstant.SECRET) {
  let cipherAlgName = 'AES256|CBC|PKCS7';
  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256')
  let ivParam: cryptoFramework.IvParamsSpec = {
    algName: 'IvParamsSpec',
    iv: {
      data: stringToUint8Array('', 32)
    }
  }
  let cipher;

  return symKeyGenerator.convertKey({
    data: stringToUint8Array(key)
  }).then(symKey => {
    try {
      cipher = cryptoFramework.createCipher(cipherAlgName);
      console.info(`xx cipher algName: ${cipher.algName}`);
    } catch (error) {
      console.error(`xx createCipher failed, ${error.code}, ${error.message}`);
      return null
    }
    return cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, ivParam)
      .then(() => {
        let base64 = new util.Base64Helper();
        let result = base64.decodeSync(str);
        return cipher.doFinal({
          data: result
        })
      })
      .then(output => {
        let result = uint8ArrayToString(output.data)
        return new Promise((resolve) => {
          resolve(result)
        })
      }).catch(e => {
        return new Promise((_, reject) => {
          reject(e)
        })
      })
  }).catch(e => {
    return new Promise((_, reject) => {
      reject(e)
    })
  })
}
/*
 *解密内容转换成字符串
 */
function uint8ArrayToString(array) {
  let arrayString = '';
  for (let i = 0; i < array.length; i++) {
    arrayString += String.fromCharCode(array[i]);
  }
  return arrayString;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进