public String decrypt(String cipherTextBase64Str) {
        final Cipher cipher;
        final SecretKeySpec SKSAESKey;
        final int blockSize;
        final byte[] ivBytes;
        final byte[] ivWithCipherTextBytes;
        final IvParameterSpec iv;
        final byte[] cipherTextBytes;
        final String plainTextStr;
        
        // TODO clean correct/cleanup try/catch
        try {
            cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            SKSAESKey = new SecretKeySpec(AESKey, "AES");
            
            blockSize = cipher.getBlockSize();
            ivBytes = new byte[blockSize];
            
            ivWithCipherTextBytes = DatatypeConverter.parseBase64Binary(cipherTextBase64Str);
            
            System.arraycopy(ivWithCipherTextBytes, 0, ivBytes, 0, blockSize);
            iv = new IvParameterSpec(ivBytes);
            
            cipherTextBytes = new byte[ivWithCipherTextBytes.length - blockSize];
            
            System.arraycopy(ivWithCipherTextBytes,
                    blockSize,
                    cipherTextBytes,
                    0, 
                    (ivWithCipherTextBytes.length - blockSize));
            
            cipher.init(Cipher.DECRYPT_MODE, SKSAESKey, iv);

            plainTextStr = new String(cipher.doFinal(cipherTextBytes));
            
            return plainTextStr;
            
        } catch (InvalidKeyException e) {
            System.out.println("Bad pass phrase: " + e);
            return null;
        } catch (BadPaddingException e) {
            return null;
        } catch (GeneralSecurityException e) {
            System.out.println("Error while decrypting: " + e);
            return null;
        }
    }