code: private Object decrypt(JsonObject object, String providerName) throws Exception {
          Object decrypted;
  
          String key = object.getString("kid");
          String alg = object.getString("alg");
  
          CryptoProvider provider = this.cryptoManager.getProvider(providerName);
  
          if (!provider.checkAlgorithmNameMatch(alg)) {
              cryptoManager.throwMissingPublicKeyEx(providerName);
          }
  
          if (!key.contentEquals(provider.getKeyStoreProvider().publicKeyName())) {
              cryptoManager.throwMissingPublicKeyEx(providerName);
          }
  
          byte[] encryptedBytes;
          String encryptedValueWithConfig;
  
          if (object.containsKey("iv")) {
              encryptedValueWithConfig = object.getString("kid") + object.getString("alg")
                      + object.getString("iv") + object.getString("ciphertext");
  
              byte[] encrypted = Base64.decode(object.getString("ciphertext"));
              byte[] iv = Base64.decode(object.getString("iv"));
              encryptedBytes = new byte[iv.length + encrypted.length];
              System.arraycopy(iv, 0, encryptedBytes, 0, iv.length);
              System.arraycopy(encrypted, 0, encryptedBytes, iv.length, encrypted.length);
          } else {
              encryptedValueWithConfig = object.getString("kid") + object.getString("alg")
                      + object.getString("ciphertext");
              encryptedBytes = Base64.decode(object.getString("ciphertext"));
          }
  
          if (object.containsKey("sig")) {
              byte[] signature = Base64.decode(object.getString("sig"));
  
              if (!provider.verifySignature(encryptedValueWithConfig.getBytes(), signature)) {
                  cryptoManager.throwSigningFailedEx(providerName);
              }
          }
  
          byte[] decryptedBytes = provider.decrypt(encryptedBytes);
          String decryptedString = new String(decryptedBytes, Charset.forName("UTF-8"));
          decrypted = JacksonTransformers.MAPPER.readValue(decryptedString, Object.class);
          if (decrypted instanceof Map) {
              decrypted = JsonObject.from((Map<String, ?>) decrypted);
          } else if (decrypted instanceof List) {
              decrypted = JsonArray.from((List<?>) decrypted);
          }
          return decrypted;
      }
docs: Decrypt value if the name starts with "__encrypt_"