官方HarmonyOS鸿蒙Next cryptoFramework框架

官方HarmonyOS鸿蒙Next cryptoFramework框架

使用官方的cryptoFramework框架加密解密时(模式"AES256|ECB|PKCS7",其他模式也试进,对称加解密都会出现下面的问题):

加密12个汉字以内的,解密无问题,稍长一些,解密就出现乱码,英文文本长时也出现相同问题,不知道是bug,还是我用的方法不对?

import cryptoFramework from '@ohos.security.cryptoFramework'
import util from '@ohos.util'

const transformation = "AES256|ECB|PKCS7"
const algName = 'AES256' //加密算法的名称
var globalCiper: cryptoFramework.Cipher
var resultDataBlob: cryptoFramework.DataBlob

/**
 * DES加密
 * @param input 要加密的内容
 * @param passWord 加密用的密码,AES256对应密码长度32位
 */
export async function encrypt(input: string, passWord: string): Promise<string> {
  let keyU8Arr: Uint8Array = Converter.string2U8Array(passWord)
  let keyDataBlob: cryptoFramework.DataBlob = { data: keyU8Arr }
  // 对称加密必须用symKey
  // 创建对称密钥生成器
  let symKeyGenerator = cryptoFramework.createSymKeyGenerator(algName)
  //等这个序列执行完毕再往下执行
  await symKeyGenerator.convertKey(keyDataBlob)
    .then((key) => {
      //console.info(`convertKey, ${key.format}, ${key.algName}`)
      //创建cipher对象
      globalCiper = cryptoFramework.createCipher(transformation)
      //let ivDataBlob = { data: keyU8Arr }
      //DES|CBC时用到的第三个参数
      //let iv: cryptoFramework.IvParamsSpec = { algName: 'IvParamsSpec', iv: ivDataBlob }
      //ciphter初始化
      //这个返回结果将作为下一个then中加调的主体
      return globalCiper.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, key, null)
    })
    .then(() => {
      //要加密码的内容
      let contentDataBlob = { data:Converter.string2U8Array(input) }
      return globalCiper.update(contentDataBlob)
    }, (err) => {
      console.log('ciphter.init err:' + JSON.stringify(err))
    }
    )
    .then((data) => {
      return globalCiper.doFinal(data ? data : null)
    }, (err) => {
      console.log('ciphter.update err:' + JSON.stringify(err))
    }).then((finalOutputDataBlob) => { //加密后的内容
      if (finalOutputDataBlob) resultDataBlob = finalOutputDataBlob
    }, (err) => {
      console.log('ciphter.dofinal err:' + JSON.stringify(err))
    })
    .catch((err) => {
      console.info('=========catch error' + err + '=========')
    })
    .finally(() => {
      console.info('=========加密过程结束=========')
    })
  let base64 = new util.Base64Helper
  return new Promise<string>((success, fail) => {
    success(base64.encodeToStringSync(resultDataBlob.data)) //成功时的返回值
  })
}

/**
 * DES加密
 * @param encryptContent 待解密的内容
 * @param passWord 加密用的密码,3DES192对应密码长度24位
 */
export async function decrypt(encryptContent: string, passWord: string): Promise<string> {
  let keyU8Arr: Uint8Array = Converter.string2U8Array(passWord)
  let keyDataBlob: cryptoFramework.DataBlob = { data: keyU8Arr }
  // 对称加密必须用symKey
  // 创建对称密钥生成器
  let symKeyGenerator = cryptoFramework.createSymKeyGenerator(algName)
  //等这个序列执行完毕再往下执行
  await symKeyGenerator.convertKey(keyDataBlob)
    .then((key) => {
      //console.info(`convertKey, ${key.format}, ${key.algName}`)
      //创建cipher对象
      globalCiper = cryptoFramework.createCipher(transformation)
      //let ivDataBlob = { data: keyU8Arr }
      //DES|CBC时用到的第三个参数
      //let iv: cryptoFramework.IvParamsSpec = { algName: 'IvParamsSpec', iv: ivDataBlob }
      //ciphter初始化
      //这个返回结果将作为下一个then中加调的主体
      return globalCiper.init(cryptoFramework.CryptoMode.DECRYPT_MODE, key, null)
    })
    .then(() => {
      let base64 = new util.Base64Helper()
      //要解密的内容
      let descriptArr: Uint8Array = base64.decodeSync(encryptContent)
      let contentDataBlob = { data: descriptArr }
      return globalCiper.update(contentDataBlob)
    }, (err) => {
      console.log('ciphter.init err:' + JSON.stringify(err))
    }
    )
    .then((data) => {
      return globalCiper.doFinal(data ? data : null)
    }, (err) => {
      console.log('ciphter.update err:' + JSON.stringify(err))
    }).then((finalOutputDataBlob) => { //加密后的内容
      if (finalOutputDataBlob) resultDataBlob = finalOutputDataBlob
    }, (err) => {
      console.log('ciphter.dofinal err:' + JSON.stringify(err))
    })
    .catch((err) => {
      console.info('=========catch error' + err + '=========')
    })
    .finally(() => {
      console.info('=========解密过程结束=========')
    })
  let base64 = new util.Base64Helper()
  return new Promise<string>((success, fail) => {
    success(Converter.u8Array2String(resultDataBlob.data)) //成功时的返回值
  })
}

export default class Converter{
  static string2U8Array(str:string):Uint8Array{
    let encoder=new util.TextEncoder
    return encoder.encodeInto(str)
  }
  static u8Array2String(u8Arr:Uint8Array):string{
    let decoder=new util.TextDecoder()
    return decoder.decode(u8Arr)
  }
}

更多关于官方HarmonyOS鸿蒙Next cryptoFramework框架的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于官方HarmonyOS鸿蒙Next cryptoFramework框架的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS鸿蒙Next的cryptoFramework是华为提供的加密框架,支持多种加密算法和操作,包括对称加密、非对称加密、哈希、消息认证码(MAC)等。开发者可通过该框架实现数据加密、解密、签名、验签等安全功能,确保应用数据的安全性。cryptoFramework与HarmonyOS系统深度集成,提供高性能、低功耗的加密服务,适用于多种设备类型,如手机、平板、智能穿戴等。

回到顶部