HarmonyOS 鸿蒙Next cryptoFramework AES 解密结果内容截断

HarmonyOS 鸿蒙Next cryptoFramework AES 解密结果内容截断 正确结果应为{“data=1,data1=2,data2=3”} 目前解密完只剩下{"data=1,data1=2 

加密数据 let result = base64.decodeSync(data);

和解密完数据转字符串 let result = util.TextDecoder.create(“utf-8”).decodeWithStream(new Uint8Array(output.data));

怀疑这两个步骤出现了问题,但是试了其他方式也不对,大家有其他思路吗?

import cryptoFramework from "@ohos.security.cryptoFramework"
import util from '@ohos.util'
import { cipherUtils } from '../utils/HYCipherUtils';

const iv = "1234567890abcdef"

let base = new util.Base64Helper();

export class AES_CBC {
  async aesCBCDecrypt(data,key) {
    data= 'Yx63sA5TtrNJAD3cFRE7dPrfxpo54jhnZPmwy1mxTK0='
    key = 'yagatqxj8t6vvuln'
    let cipherUtil = new cipherUtils();
    let cipherAlgName = 'AES128|CBC|PKCS7';
    let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128')
    let ivParam: cryptoFramework.IvParamsSpec = {
      algName: 'IvParamsSpec',
      iv: {
        data: cipherUtil.encode(iv)
      }
    }
    var cipher;
    return symKeyGenerator.convertKey({
      data:cipherUtil.encode(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(data);
          return cipher.update({
            data: result
          })
        })
        .then(output => {
          let result = util.TextDecoder.create("utf-8").decodeWithStream(new Uint8Array(output.data));
          return new Promise(resolve => {
            resolve(result)
          })
        }).catch(err => {
          return new Promise((_, reject) => {
            reject(err)
          })
        })
    }).catch(err => {
      return new Promise((_, reject) => {
        reject(err)
      })
    })
  }
}
export class cipherUtils {

  // 编码
  encode(str) {
    const arr = [...str]
    const buffer = new Uint8Array(arr.length * 4)
    let index = 0
    for (let i = 0; i < arr.length; i++) {
      const codePoint = arr[i].codePointAt(0)
      // 四字节字符
      if (codePoint >= 0x10000) {
        buffer[index++] = (codePoint >> 18) & 0x7 | 0xf0
        buffer[index++] = (codePoint >> 12) & 0x3f | 0x80
        buffer[index++] = (codePoint >> 6) & 0x3f | 0x80
        buffer[index++] = codePoint & 0x3f | 0x80
      } else if (codePoint >= 0x800) {
        // 三字节字符
        buffer[index++] = (codePoint >> 12) & 0xf | 0xe0
        buffer[index++] = (codePoint >> 6) & 0x3f | 0x80
        buffer[index++] = codePoint & 0x3f | 0x80
      } else if (codePoint >= 0x80) {
        // 两字节字符
        buffer[index++] = (codePoint >> 6) & 0x1f | 0xc0
        buffer[index++] = codePoint & 0x3f | 0x80
      } else {
        // 单字节字符
        buffer[index++] = codePoint
      }
    }
    return buffer.slice(0, index)
  }

  // 解码
  decode(buffer) {
    let str = ''
    for (let i = 0; i < buffer.length; i++) {
      switch (buffer[i] >> 4) {
        case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
        str += String.fromCodePoint(buffer[i])
          break
        case 12: case 13:
        str += String.fromCodePoint(
          ((buffer[i] & 0x1f) << 6) +
            (buffer[i + 1] & 0x3f)
        )
        i++
          break
        case 14:
          str += String.fromCodePoint(
            ((buffer[i] & 0xf) << 12) +
              ((buffer[i + 1] & 0x3f) << 6) +
              (buffer[i + 2] & 0x3f)
          )
          i += 2
          break
        case 15:
          str += String.fromCodePoint(
            ((buffer[i] & 0x7) << 18) +
              ((buffer[i + 1] & 0x3f) << 12) +
              ((buffer[i + 2] & 0x3f) << 6) +
              (buffer[i + 3] & 0x3f)
          )
          i += 3
          break
      }
    }
    return str
  }
}

更多关于HarmonyOS 鸿蒙Next cryptoFramework AES 解密结果内容截断的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

找到问题了,是 key 的值不对,导致解密后数据被截取

更多关于HarmonyOS 鸿蒙Next cryptoFramework AES 解密结果内容截断的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,使用cryptoFramework进行AES解密时,如果遇到解密结果内容截断的问题,可能是由于以下原因导致的:

  1. 填充模式不匹配:AES加密通常需要指定填充模式(如PKCS7)。如果加密时使用了填充模式,而解密时未正确设置相同的填充模式,可能导致解密结果不正确或截断。

  2. 数据长度问题:AES加密要求数据长度必须是块大小的整数倍(AES块大小为128位,即16字节)。如果加密数据长度不符合要求,可能会导致解密时数据截断。

  3. 解码问题:加密后的数据通常是二进制格式,如果在解密前对数据进行了编码(如Base64),解密时需要先进行相应的解码操作,否则可能导致解密失败或结果截断。

  4. 密钥或IV不匹配:AES加密需要密钥和初始化向量(IV),如果解密时使用的密钥或IV与加密时不一致,会导致解密失败或结果不正确。

  5. API使用错误:在使用cryptoFramework进行解密时,可能未正确调用API或参数设置不当,导致解密结果截断。

检查以上几点,确保加密和解密时使用的参数和流程一致,以避免解密结果截断的问题。

回到顶部