HarmonyOS 加密程序崩溃

//加密
function tcpEncrypt(value: string, iv: string, key: string): Uint8Array {
  let cipher = cryptoFramework.createCipher('AES128|CBC|NoPadding');
  let siv = genIvParamsSpec(iv);
  let symKey = genSymKeyByData(StrUtil.strToUint8Array(key));
  cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, siv);
  let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(value, 'utf-8').buffer) };
  let cipherData = cipher.doFinalSync(plainText);这一行崩溃
  return cipherData.data;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

崩溃日志:

Error message:do final fail!
Error code:
  Stacktrace:
    at tcpEncrypt (entry/src/main/ets/utils/Aes.ets:116:20)
    at tcpEncryptData (entry/src/main/ets/utils/Aes.ets:14:10)
    at toBuffer (entry/src/main/ets/utils/SQHeaderEx.ets:81:33)
    at send (entry/src/main/ets/utils/TcpSocket.ets:96:20)
    at getTcpPublicKey (entry/src/main/ets/utils/CommonUtil.ets:60:5)
    at anonymous (entry/src/main/ets/utils/TcpSocket.ets:42:7)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
HarmonyOS
2025-01-10 07:23:08
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
aquaa

用NoPadding时加密原始数据必须自行保持对齐32字节整数倍,否则会报错,代码中需要自行检测原始数据转换成Uint8Array格式后长度是否为32的倍数以及自行补齐,然后解密时还得操心去除补齐内容,因此可以考虑使用PKCS7替代。

import { buffer, util } from '@kit.ArkTS';
import { cryptoFramework } from '@kit.CryptoArchitectureKit';

@Entry
@Component
struct Index3 {
  @State message: string = 'Hello World';
  stringToUint8Array(str: string) {
    return new Uint8Array(buffer.from(str, 'utf-8').buffer);
  }

  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;
  }

  async encryptMessage(src: string, cbc_keys: string, iv_keys: string) {
    try {
      let plainText: cryptoFramework.DataBlob = { data: this.stringToUint8Array(src) };
      let iv: cryptoFramework.IvParamsSpec = {
        algName: 'IvParamsSpec',
        iv: {
          data: this.stringToUint8Array(iv_keys)
        }
      }
      let symAlgName = 'AES128';
      let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
      let dataUint8Array = this.stringToUint8Array(cbc_keys)
      let keyBlob: cryptoFramework.DataBlob = { data: dataUint8Array }
      let promiseSymKey: cryptoFramework.SymKey = await symKeyGenerator.convertKey(keyBlob)
      let cipher = cryptoFramework.createCipher('AES128|CBC|NoPadding');
      await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, promiseSymKey, iv);
      let cipherData = await cipher.doFinalSync(plainText);
      return (new util.Base64Helper()).encodeToStringSync(cipherData.data);
    } catch (err) {
      console.info(err)
      return ""
    }
  }

  async decodeString(input: string, cbc_keys: string, iv_keys: string) {
    if (input == '') {
      return ''
    }
    let base = new util.Base64Helper();
    let decoder = cryptoFramework.createCipher('AES128|CBC|NoPadding');
    let iv: cryptoFramework.IvParamsSpec = {
      algName: 'IvParamsSpec',
      iv: {
        data: this.stringToUint8Array(iv_keys)
      }
    }
    let symAlgName = 'AES128';
    let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
    let dataUint8Array = this.stringToUint8Array(cbc_keys)
    let keyBlob: cryptoFramework.DataBlob = { data: dataUint8Array }
    let promiseSymKey: cryptoFramework.SymKey = await symKeyGenerator.convertKey(keyBlob)
    await decoder.init(cryptoFramework.CryptoMode.DECRYPT_MODE, promiseSymKey, iv);
    let plainText: cryptoFramework.DataBlob = { data: base.decodeSync(input) }
    let decryptData: cryptoFramework.DataBlob = { data: new Uint8Array() }
    try {
      decryptData = await decoder.doFinal(plainText);
    } catch (e) {
      console.log('=======e', JSON.stringify(e))
    }
    return this.uint8ArrayToString(decryptData.data).toString();
  }

  async aboutToAppear() {
    let key = '62ac6afdd993c395';
    let iv = 'e593c395b953c508';
    let data = '01234567890123456789012345678912';
    let encrypted = await this.encryptMessage(data, key, iv);
    console.log('加密:' + encrypted);
    let newdata = await this.decodeString(encrypted, key, iv);
    console.log('解密:' + newdata);
  }

  build() {
  }
}
  • 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.
分享
微博
QQ
微信
回复
2025-01-10 10:08:40
相关问题
HarmonyOS 引用so库程序崩溃
659浏览 • 1回复 待解决
以下代码导致程序崩溃
979浏览 • 1回复 待解决
程序打开直接崩溃了,如何定位问题
3658浏览 • 1回复 待解决
HarmonyOS AES加密/RSA加密问题
783浏览 • 1回复 待解决
HarmonyOS使用HashMap崩溃
1062浏览 • 1回复 待解决
HarmonyOS sendable崩溃问题
442浏览 • 1回复 待解决
HarmonyOS RAS加密,AES加密和解密
582浏览 • 1回复 待解决
HarmonyOS线程池使用崩溃
1118浏览 • 1回复 待解决
HarmonyOS 崩溃收集问题咨询
997浏览 • 1回复 待解决
HarmonyOS 运行Flutter项目崩溃
801浏览 • 1回复 待解决
HarmonyOS 关于质量-崩溃服务
556浏览 • 1回复 待解决
HarmonyOS 全局崩溃捕获问题
717浏览 • 1回复 待解决
HarmonyOS 崩溃日志的收集
547浏览 • 1回复 待解决
HarmonyOS AES加密
571浏览 • 1回复 待解决