HarmonyOS AES加解密报错17630001?

export default class AESUtils {
  static async aesEncryptString(data: string): Promise<string> {
    let symKey = await genSymKeyByData(new Uint8Array(buffer.from('IaR90VTAdg2ZBRYT', 'utf-8').buffer));
    let plainText: cryptoFramework.DataBlob = {
      data: new Uint8Array(buffer.from(data, 'utf-8').buffer)
    };
    let encryptText = await encryptMessagePromise(symKey, plainText);
    return new util.Base64Helper().encodeToString(encryptText.data)
  }

  static async aesDecryptString(data: string): Promise<string> {
    let symKey = await genSymKeyByData(new Uint8Array(buffer.from('IaR90VTAdg2ZBRYT', 'utf-8').buffer))
    let plainText: cryptoFramework.DataBlob = {
      data: new Uint8Array(buffer.from(data, 'utf-8').buffer)
    };
    let decryptText = await decryptMessagePromise(symKey, plainText)
    return new util.Base64Helper().encodeToString(decryptText.data)

  }
}

async function encryptMessagePromise(symKey: cryptoFramework.SymKey, plainText: cryptoFramework.DataBlob) {
  let cipher = cryptoFramework.createCipher('AES128|CBC|PKCS7');
  let iv = genIvParamsSpec();
  await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, iv);
  let cipherData = await cipher.doFinal(plainText);
  return cipherData;
}

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

function genIvParamsSpec() {
  let ivBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from('A-16-Byte-String', 'utf-8').buffer) };
  let ivParamsSpec: cryptoFramework.IvParamsSpec = {
    algName: "IvParamsSpec",
    iv: ivBlob
  };
  return ivParamsSpec;
}


async function genSymKeyByData(symKeyData: Uint8Array) {
  let symKeyBlob: cryptoFramework.DataBlob = { data: symKeyData };
  let aesGenerator = cryptoFramework.createSymKeyGenerator('AES128');
  let symKey = await aesGenerator.convertKey(symKeyBlob);
  return symKey
}

这套代码AES加密没问题,但是解密的时候会出现17630001这个code

阅读 577
1 个回答

这个加密返回的时候使用了base64Utils的encodeToString函数将原本的返回值加密成了base64字符串,然后就直接对加密后的base64字符串进行了解密操作,需要先将加密后的base64字符串解密为uint8Array才行,可参考以下demo修改代码后再次进行尝试:

static async aesDecryptString(data: string,uint8:Uint8Array): Promise<string> {//解密
  let  str =''
  let uint8ArrayKey = new util.Base64Helper().decodeSync(data)//因为之前用base64对其进行了加密,所以如果要使用的话,先要把字符串进行解密还原为uint8Array
  let symKey = await genSymKeyByData(new Uint8Array(buffer.from('IaR90VTAdg2ZBRYT', 'utf-8').buffer))
  let plainText: cryptoFramework.DataBlob = {
    data: uint8ArrayKey
  };
  let decryptText = await decryptMessagePromise(symKey, plainText)
  return new util.Base64Helper().encodeToString(decryptText.data)

}

encodeToString参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-util-V5\#encodetostring9

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进