docs: public String decryptAndVerify(byte[] data) throws NoSuchAlgorithmException, NoSuchProviderException,
              NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException,
              SignatureException, InvalidAlgorithmParameterException, InvalidCipherTextException, IOException {
          // decode base64
          byte[] base64DecodedData = Base64.decode(data);
  
          // decrypt data
          byte[] decryptedData = decryptBytes(base64DecodedData);
  
          // parse json structure
          JSONObject json = new JSONObject(new String(decryptedData));
          String base64Data = json.getString("data");
          String base64Sign = json.getString("signature");
  
          // decode base64 of the original data and signature
          byte[] oriData = Base64.decode(base64Data.getBytes());
          byte[] signature = Base64.decode(base64Sign.getBytes());
  
          // verify the signature
          boolean verifyOK = verifyData(oriData, signature);
          if (!verifyOK) {
              return null;
          }
  
          // return the original data
          return new String(oriData);
      }