HarmonyOS \[MSI\] GCM 模式加密,cipher.update时报错?

根据以下代码:

const cipher = cryptoFramework.createCipher("AES128|GCM|PKCS7");
const symKey = await genSymKeyByData(key);
const ivBlob: cryptoFramework.DataBlob = { data: new Uint8Array(Array(12).fill(0)) };
const aadBlob: cryptoFramework.DataBlob = { data: new Uint8Array(Array(8).fill(0)) };
const tagBlob: cryptoFramework.DataBlob = { data: new Uint8Array(Array(16).fill(0)) };
let gcmParamsSpec: cryptoFramework.GcmParamsSpec = {
  iv: ivBlob,
  aad: aadBlob,
  // 此处先写成空,下方会重制
  authTag: tagBlob,
  algName: "GcmParamsSpec",
};
const plainTextBlob: cryptoFramework.DataBlob = { data: plainText };
await cipher.init(
  cryptoFramework.CryptoMode.ENCRYPT_MODE,
  symKey,
  gcmParamsSpec
);
try{
  let encryptUpdate = await cipher.update(plainTextBlob);
}catch(e){
  console.log(e);
}
// gcm模式加密doFinal时传入空,获得tag数据,并更新至gcmParams对象中。
gcmParamsSpec.authTag = await cipher.doFinal(null);

在cipher.update报错,build context for update fail!

传入的plainText 为音频文件的内容

阅读 500
1 个回答

参考demo:

export async function aesGcmEncrypt(text: string, key: string): Promise<string> {
  let globalResult = ""
  try {
    let cipherAlgName = 'AES128|GCM|PKCS7';
    let symAlgName = 'AES128';
    let globalCipher = cryptoFramework.createCipher(cipherAlgName);
    let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
    let dataUint8Array = stringToUint8Array(key)
    let keyBlob: cryptoFramework.DataBlob = { data: dataUint8Array }
    let promiseSymKey = await symKeyGenerator.convertKey(keyBlob)

    gcmParamsSpec.iv = { data: stringToUint8Array("asdfghjklzxcvbnm") } //16位

    await globalCipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, promiseSymKey, gcmParamsSpec);
    let result = await globalCipher.update({ data: stringToUint8Array(text) })
    gcmParamsSpec.authTag = await globalCipher.doFinal({ data: stringToUint8Array(text) })
    globalResult = uint8ArrayToHexStr(result.data)
    console.log("globalResult => HEX" + globalResult)
  } catch (err) {
    console.log(err.message)
  }
  return globalResult;
}