_decrypt35(data) {
    let result;
    const header = data.slice(0, 14);
    const iv = data.slice(14, 26);
    const tag = data.slice(data.length - 16);
    data = data.slice(26, data.length - 16);

    try {
      const decipher = crypto.createDecipheriv('aes-128-gcm', this.getKey(), iv);
      decipher.setAuthTag(tag);
      decipher.setAAD(header);

      result = Buffer.concat([decipher.update(data), decipher.final()]);
      result = result.slice(4); // Remove 32bit return code
    } catch (_) {
      throw new Error('Decrypt failed');
    }

    // Try to parse data as JSON, otherwise return as string.
    // 3.5 protocol
    // {"protocol":4,"t":1632405905,"data":{"dps":{"101":true},"cid":"00123456789abcde"}}
    try {
      if (result.indexOf(this.version) === 0) {
        result = result.slice(15);
      }

      const res = JSON.parse(result);
      if ('data' in res) {
        const resData = res.data;
        resData.t = res.t;
        return resData; // Or res.data // for compatibility with tuya-mqtt
      }

      return res;
    } catch (_) {
      return result;
    }
  }
Decrypts data for protocol 3.5
@param {String|Buffer} data to decrypt
@returns {Object|String}
returns object if data is JSON, else returns string