public static void main(String[] argv) throws Exception {
    byte[] salt = new byte[5];
    SecretKeySpec skeySpec =
        new SecretKeySpec(Crypt.getRawKey("my secret", "salt".getBytes()), "AES");
    Cipher encryptCipher = Cipher.getInstance("AES");
    encryptCipher.init(Cipher.ENCRYPT_MODE, skeySpec);

    Cipher decryptCipher = Cipher.getInstance("AES");
    decryptCipher.init(Cipher.DECRYPT_MODE, skeySpec);

    testEncryptDecrypt(encryptCipher, decryptCipher, "foo", 5, Integer.MIN_VALUE);
    testEncryptDecrypt(encryptCipher, decryptCipher, "foo", Integer.MIN_VALUE, Integer.MIN_VALUE);
    testEncryptDecrypt(encryptCipher, decryptCipher, "foo", Integer.MAX_VALUE, Integer.MIN_VALUE);
    testEncryptDecrypt(encryptCipher, decryptCipher, "foo", -1, -1);
    testEncryptDecrypt(encryptCipher, decryptCipher, "foo", -1, Integer.MAX_VALUE);

    System.out.println("repeat!");
    testEncryptDecrypt(encryptCipher, decryptCipher, "foo", 5, Integer.MIN_VALUE);
    testEncryptDecrypt(encryptCipher, decryptCipher, "foo", Integer.MIN_VALUE, Integer.MIN_VALUE);
    testEncryptDecrypt(encryptCipher, decryptCipher, "foo", Integer.MAX_VALUE, Integer.MIN_VALUE);
    testEncryptDecrypt(encryptCipher, decryptCipher, "foo", -1, -1);
    testEncryptDecrypt(encryptCipher, decryptCipher, "foo", -1, Integer.MAX_VALUE);

    System.out.println("longs");

    testEncryptDecryptLong(encryptCipher, decryptCipher, "foo", 5, Long.MIN_VALUE);
    testEncryptDecryptLong(encryptCipher, decryptCipher, "foo", Long.MIN_VALUE, Long.MIN_VALUE);
    testEncryptDecryptLong(encryptCipher, decryptCipher, "foo", Long.MAX_VALUE, Long.MIN_VALUE);
    testEncryptDecryptLong(encryptCipher, decryptCipher, "foo", -1, -1);
    testEncryptDecryptLong(encryptCipher, decryptCipher, "foo", -1, Long.MAX_VALUE);

    System.out.println("repeat!");
    testEncryptDecryptLong(encryptCipher, decryptCipher, "foo", 5, Long.MIN_VALUE);
    testEncryptDecryptLong(encryptCipher, decryptCipher, "foo", Long.MIN_VALUE, Long.MIN_VALUE);
    testEncryptDecryptLong(encryptCipher, decryptCipher, "foo", Long.MAX_VALUE, Long.MIN_VALUE);
    testEncryptDecryptLong(encryptCipher, decryptCipher, "foo", -1, -1);
    testEncryptDecryptLong(encryptCipher, decryptCipher, "foo", -1, Long.MAX_VALUE);
  }