HarmonyOS AES目前加密成功,但是解密时出现crash

@Entry
@Component
struct Index {
  aboutToAppear(): void {
    AesUtils.encryptCBC('测试hello', 'newaircloud_vjow9Dej#JDj4[oIDF', (str: string) => {
      this.str = str
    })
  }

  @State str?: string = ''
  @State str2?: string = ''

  build() {
    Column() {
      Text('AES加密:' + this.str)
        .height(100)
        .backgroundColor(Color.Pink)
        .onClick(() => {
          AesUtils.encryptCBC('测试hello', 'newaircloud_vjow9Dej#JDj4[oIDF', (str: string) => {
            this.str = str
          })
        })

      Text('AES解密:' + this.str2)
        .height(100)
        .backgroundColor(Color.Pink)
        .onClick(() => {
          AesUtils.decryptCBC(this.str!, 'newaircloud_vjow9Dej#JDj4[oIDF', (str: string) => {
            this.str2 = str
          })
        })

    }
  }
}
  • 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.

以下是工具类代码:

export class AesUtils {
  static async encryptCBC(message: string, pk: string, callBack: Function) {
    try {
      let base64 = new util.Base64Helper();
      let dataUnit = AesUtils.doMdBySync(pk)

      let symKey = await AesUtils.genSymKeyByData(dataUnit);
      let newBuf = buffer.from(buffer.from(message, 'utf-8').buffer);
      let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(newBuf.buffer) };
      let encryptText = await AesUtils.encryptMessagePromise(symKey, plainText);
      let encrypt = base64.encodeToStringSync(encryptText.data)
      if (callBack) {
        callBack(encrypt)
      }

    } catch (error) {
      console.error(JSON.stringify(error));
      if (callBack) {
        let str = JSON.stringify(error)
        callBack(str)
      }
    }
  }

  public static async decryptCBC(message: string, pk: string, callBack: Function) {
    try {
      let dataUnit = AesUtils.doMdBySync(pk)

      let symKey = await AesUtils.genSymKeyByData(dataUnit);
      let newBuf = buffer.from(buffer.from(message, 'utf-8').buffer);
      let encryptText: cryptoFramework.DataBlob = { data: new Uint8Array(newBuf.buffer) };

      let decryptText = await AesUtils.decryptMessagePromise(symKey, encryptText);
      if (decryptText.data.toString()) {
        let decrypt = buffer.from(decryptText.data).toString('utf-8')
        if (callBack) {
          callBack(decrypt)
        }
      } else {
        if (callBack) {
          callBack('decrypt failed')
        }
      }

    } catch (error) {
      if (callBack) {
        let str = JSON.stringify(error)
        callBack('decrypt failed' + str)
      }
    }
  }

  // key生成
  private static async genSymKeyByData(symKeyData: Uint8Array) {
    let symKeyBlob: cryptoFramework.DataBlob = { data: symKeyData };
    let aesGenerator = cryptoFramework.createSymKeyGenerator('AES256');
    let symKey = await aesGenerator.convertKey(symKeyBlob);
    console.info('convertKey success:');
    return symKey;
  }

  // 加密消息
  private static async encryptMessagePromise(symKey: cryptoFramework.SymKey, plainText: cryptoFramework.DataBlob) {
    let cipher = cryptoFramework.createCipher('AES256|CBC|PKCS7');
    let iv = AesUtils.genIvParamsSpec();
    await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, iv);
    let cipherData = await cipher.doFinal(plainText);
    return cipherData;
  }

  // 解密消息
  private static async decryptMessagePromise(symKey: cryptoFramework.SymKey, cipherText: cryptoFramework.DataBlob) {
    let decoder = cryptoFramework.createCipher('AES256|CBC|PKCS7');
    let iv = AesUtils.genIvParamsSpec();
    await decoder.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, iv);
    let decryptData = await decoder.doFinal(cipherText);
    return decryptData;
  }

  private static doMdBySync(key: string): Uint8Array {
    let mdAlgName = 'SHA256'; // 摘要算法名
    let md = cryptoFramework.createMd(mdAlgName);
    let firstArray = new Uint8Array(buffer.from(key, 'utf-8').buffer)
    md.updateSync({ data: firstArray });
    let mdResult = md.digestSync();
    let data = new util.Base64Helper().encodeToStringSync(mdResult.data)
    console.info('[Sync]:Md result base64:' + data);
    let hex = buffer.from(mdResult.data).toString('hex')
    console.info('Md result hex:' + hex);
    let mdLen = md.getMdLength();
    console.info("md len: " + mdLen);

    return mdResult.data
  }

  // iv生成
  private static genIvParamsSpec(): cryptoFramework.IvParamsSpec {
    let arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // 16 bytes
    let dataIv = new Uint8Array(arr);
    let ivBlob: cryptoFramework.DataBlob = { data: dataIv };
    let ivParamsSpec: cryptoFramework.IvParamsSpec = {
      algName: "IvParamsSpec",
      iv: ivBlob
    };
    return ivParamsSpec;
  }
}
  • 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.
HarmonyOS
2024-12-23 15:11:23
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
fox280

由于传入数据为base64加密,解码前要base64进行一次decodeSync。

分享
微博
QQ
微信
回复
2024-12-23 19:47:51


相关问题
HarmonyOS RAS加密AES加密解密
682浏览 • 1回复 待解决
HarmonyOS ArkTS中如何使用AES加密解密
736浏览 • 1回复 待解决
使用AES解密,一直在报解密异常
1258浏览 • 1回复 待解决
HarmonyOS AES加密
687浏览 • 1回复 待解决
HarmonyOS AES加密/RSA加密问题
959浏览 • 1回复 待解决
HarmonyOS AES解密问题
938浏览 • 1回复 待解决
HarmonyOS AES解密报错
1331浏览 • 1回复 待解决
HarmonyOS AES解密咨询
1071浏览 • 1回复 待解决
HarmonyOS AES加密相关
664浏览 • 1回复 待解决
HarmonyOS 使用AES加密失败
784浏览 • 1回复 待解决
HarmonyOS AES-CBC加解密
853浏览 • 1回复 待解决
HarmonyOS AES CBC加密问题
1213浏览 • 1回复 待解决
HarmonyOS AES加密编码问题
600浏览 • 1回复 待解决
HarmonyOS AES加密算法demo
925浏览 • 1回复 待解决
HarmonyOS AES解密报错17630001
999浏览 • 1回复 待解决
如何使用AES ECB 加密方式?
879浏览 • 1回复 待解决
HarmonyOS AES解密与java无法通用
1267浏览 • 1回复 待解决
HarmonyOS app Crash但是找不到错误原因
1071浏览 • 1回复 待解决