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:" "}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

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);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
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;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
分享
微博
QQ
微信
回复
2024-12-25 11:44:48
相关问题
中文字符串的编解码,有人知道吗?
1323浏览 • 1回复 待解决
AES解密字符串是否需要分段
951浏览 • 1回复 待解决
关于加密字符串相关问题
976浏览 • 1回复 待解决
HarmonyOS 加密字符串格式转换
744浏览 • 1回复 待解决
检查字符串是否以给定的字符串开头
1382浏览 • 1回复 待解决
HarmonyOS 十六进制字符转明文字符串
687浏览 • 1回复 待解决
字符串反射
627浏览 • 1回复 待解决
HarmonyOS 字符串Md5加密问题
587浏览 • 1回复 待解决
检查字符串是否以给定的字符串结尾
1158浏览 • 1回复 待解决
HarmonyOS 替换字符串
940浏览 • 1回复 待解决
HarmonyOS 字符串显示异常
1075浏览 • 1回复 待解决
HarmonyOS字符串替换问题
1650浏览 • 1回复 待解决
HarmonyOS 替换字符串问题
1018浏览 • 1回复 待解决
HarmonyOS ASCII转字符串
747浏览 • 1回复 待解决