public static void main(String[] args)
      throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException,
          NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException,
          InvalidKeyException, UnrecoverableKeyException, NoSuchProviderException,
          SignatureException {

    /** At the client side */
    KeyStoreUtil keyStoreUtil = new KeyStoreUtil();
    // Generate Symmetric key
    byte[] symmetrickey = keyStoreUtil.generateSessionKey();
    // Encrypt data by symmetric key
    String data = "ABC";
    System.out.println("Data : " + data);
    String encryptedData = keyStoreUtil.encryptWithAESKey(data, symmetrickey);
    System.out.println("encryptedData : " + encryptedData);

    // Encrypt symmetric key using trustore
    String encryptedKey = keyStoreUtil.encryptKey(symmetrickey, "mykey");
    System.out.println("encryptedKey : " + encryptedKey);

    // Generate the signature of symmetric key
    byte[] signedEncryptedKey = keyStoreUtil.signData(Base64.decodeBase64(encryptedKey));
    String signatureOfKey = Base64.encodeBase64String(signedEncryptedKey);
    System.out.println("Signed Ecrypted Key : " + signatureOfKey);

    /** At the receiver */

    // Verify signature
    keyStoreUtil.verifySignature(Base64.decodeBase64(encryptedKey), signedEncryptedKey);

    // Decrypt symmteric key using keystore
    String decryptedKey = keyStoreUtil.decryptKey(encryptedKey, "mykey");
    System.out.println("decryptedKey : " + decryptedKey);

    // Decrypt data using decrypted symetric key

    System.out.println(
        "Decrypted Data : " + keyStoreUtil.decryptWithAESKey(encryptedData, decryptedKey));
  }