HarmonyOS AES加密中文字符串,解密出来时空字符串

AES中文加密,解密出来的数据为空

com.hessi...nymocire  D     aes加密原文:, "{name:"张三"}"
com.hessi...nymocire  I     xx cipher algName: AES128|CBC|PKCS5
com.hessi...nymocire  D     aes加密数据:, ZkQQVV126FtQ/jaxWoKeGg==
com.hessi...nymocire  I     xx cipher algName: AES128|CBC|PKCS5
com.hessi...nymocire  D     aes解密数据:, {name:" "}

AES加解密代码如下:

/**
 * Uint8Array 转  String
 * @param input
 */
function uint8Array2String(input: Uint8Array) {
  let textDecoder = util.TextDecoder.create("utf-8", { ignoreBOM: true })
  return textDecoder.decodeWithStream(input, { stream: false });
}

// AES加密promise形式调用
async function aesCBCEncrypt(plaintext, key, iv): Promise<string> {
  let cipherAlgName = 'AES128|CBC|PKCS5';
  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128')
  let ivParam: cryptoFramework.IvParamsSpec = {
    algName: 'IvParamsSpec',
    iv: {
      data: stringToUint8Array(iv)
    }
  }
  var 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.ENCRYPT_MODE, symKey, ivParam)
      .then(() => {
        return cipher.doFinal({
          data: stringToUint8Array(plaintext)
        })
      })
      .then(output => {
        let base64 = new util.Base64Helper();
        let result = base64.encodeToStringSync(output.data);
        return new Promise((resolve) => {
          resolve(result)
        })
      }).catch(err => {
        return new Promise((_, reject) => {
          reject(err)
        })
      })
  }).catch(err => {
    return new Promise((_, reject) => {
      reject(err)
    })
  })
}

/**
 * AES解密
 * @param encrypttext
 * @param key
 * @param iv
 * @returns
 */
async function aesCBCDecrypt(encrypttext, key, iv) {
  let cipherAlgName = 'AES128|CBC|PKCS5'
  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128')
  let ivParam: cryptoFramework.IvParamsSpec = {
    algName: 'IvParamsSpec',
    iv: {
      data: stringToUint8Array(iv, 16)
    }
  }
  var cipher;

  return symKeyGenerator.convertKey({
    data: stringToUint8Array(key, 16)
  }).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(encrypttext);
        return cipher.doFinal({
          data: result
        })
      })
      .then(output => {
        let result = uint8Array2String(output.data)
        return new Promise((resolve) => {
          resolve(result)
        })
      }).catch(err => {
        return new Promise((_, reject) => {
          reject(err)
        })
      })
  }).catch(err => {
    return new Promise((_, reject) => {
      reject(err)
    })
  })
}

// 把密钥、明文等转换成输入数据需要的格式
function stringToUint8Array(str, len = null) {
  let arr = [];
  if (len == null) {
    len = str.length
  }
  for (let i = 0; i < len; i++) {
    arr.push(str.charCodeAt(i))
  }
  return new Uint8Array(arr);
}
HarmonyOS
2024-12-25 08:16:49
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
shlp

可以参考这个demo:

import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { buffer, HashMap, util, xml } from '@kit.ArkTS';
let key = 'ZkQQVV126FtQ/jaxWoKeGg=='
let cipherAlgName = 'AES128|CBC|PKCS7';
let symAlgName = 'AES128';
let base64Helper = new util.Base64Helper;
@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  private fileDir: string = ''

  build() {
    Column() {
      Scroll() {
        Text(this.message)
          .id('HelloWorld')
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .alignRules({
            center: { anchor: '__container__', align: VerticalAlign.Center },
            middle: { anchor: '__container__', align: HorizontalAlign.Center }
          })
      }

      Button('加解密数据')
        .onClick(() => {
          let str =  '{name:"张三"}'
          let xmlContent1 = stringToUint8Array(str)
          //加密文件
          let plainText1: cryptoFramework.DataBlob = { data: xmlContent1 };
          this.aesEcryptAll(plainText1, key)
        })

    }
    .height('100%')
    .width('100%')
  }

  async AES_CBC_Update(plainText: cryptoFramework.DataBlob) {
    //解密
    await this.aesDecryptAll(plainText, key);
  }

  async aesEcryptAll(globalCipherText: cryptoFramework.DataBlob, key: string) {
    let globalPlainText = "";
    try {
      let globalCipher = cryptoFramework.createCipher(cipherAlgName);
      let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
      /*
      * 偏移量
      * */
      let cbcParamsSpec: cryptoFramework.IvParamsSpec = {
        iv: { data: stringToUint8Array("your-iv-your-iva") },
        algName: 'IvParamsSpec'
      };
      let dataUint8Array = base64Helper.decodeSync(key)
      let keyBlob: cryptoFramework.DataBlob = { data: dataUint8Array }
      let promiseSymKey = await symKeyGenerator.convertKey(keyBlob)
      await globalCipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, promiseSymKey, cbcParamsSpec);
      let updateOutput = await globalCipher.update(globalCipherText);
      let finalOutput = await globalCipher.doFinal(null);
      //let plainText: cryptoFramework.DataBlob = { data: finalOutput };

      this.AES_CBC_Update(finalOutput)//加密之后紧跟着加密
      globalPlainText = uint8ArrayToString(finalOutput.data)

    } catch (err) {
      console.log(err.message)
    }
  }

  // 解密
  async aesDecryptAll(globalCipherText: cryptoFramework.DataBlob, key: string) {
    let globalPlainText = "";
    try {
      let globalCipher = cryptoFramework.createCipher(cipherAlgName);
      let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
      /*
      * 偏移量
      * */
      let cbcParamsSpec: cryptoFramework.IvParamsSpec = {
        iv: { data: stringToUint8Array("your-iv-your-iva") },
        algName: 'IvParamsSpec'
      };
      let dataUint8Array = base64Helper.decodeSync(key)
      let keyBlob: cryptoFramework.DataBlob = { data: dataUint8Array }
      let promiseSymKey = await symKeyGenerator.convertKey(keyBlob)
      await globalCipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, promiseSymKey, cbcParamsSpec);
      let updateOutput = await globalCipher.update(globalCipherText);
      let finalOutput = await globalCipher.doFinal(null);
      globalPlainText = uint8ArrayToString(finalOutput.data)      //解密后的明文
    } catch (err) {
      console.log(err.message)
    }
  }
}
// 字符串转成字节流
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;
}
分享
微博
QQ
微信
回复
2024-12-25 11:44:48
相关问题
中文字符串的编解码,有人知道吗?
909浏览 • 1回复 待解决
AES解密字符串是否需要分段
689浏览 • 1回复 待解决
关于加密字符串相关问题
517浏览 • 1回复 待解决
HarmonyOS 加密字符串格式转换
374浏览 • 1回复 待解决
检查字符串是否以给定的字符串开头
822浏览 • 1回复 待解决
字符串反射
251浏览 • 1回复 待解决
HarmonyOS 十六进制字符转明文字符串
351浏览 • 1回复 待解决
HarmonyOS 字符串Md5加密问题
263浏览 • 1回复 待解决
检查字符串是否以给定的字符串结尾
636浏览 • 1回复 待解决
HarmonyOS 替换字符串
367浏览 • 1回复 待解决
HarmonyOS 字符串显示异常
712浏览 • 1回复 待解决
HarmonyOS字符串替换问题
1172浏览 • 1回复 待解决
HarmonyOS ASCII转字符串
284浏览 • 1回复 待解决
HarmonyOS 字符串转图片
361浏览 • 1回复 待解决
HarmonyOS 字符串编码问题
316浏览 • 1回复 待解决
HarmonyOS 替换字符串问题
416浏览 • 1回复 待解决