@Test
public void testEncryptionIsReversible() throws Exception {

    ECKey originalUnencryptedKey = new ECKey();
    EncryptedData encryptedPrivateKey = keyCrypter.encrypt(originalUnencryptedKey.getPrivKeyBytes(), keyCrypter.deriveKey(PASSWORD1));
    ECKey encryptedKey = ECKey.fromEncrypted(encryptedPrivateKey, keyCrypter, originalUnencryptedKey.getPubKey());
    // The key should be encrypted
    assertTrue("Key not encrypted at start",  encryptedKey.isEncrypted());
    // Check that the key can be successfully decrypted back to the original.
    assertTrue("Key encryption is not reversible but it should be", ECKey.encryptionIsReversible(originalUnencryptedKey, encryptedKey, keyCrypter, keyCrypter.deriveKey(PASSWORD1)));
    // Check that key encryption is not reversible if a password other than the original is used to generate the AES key.
    assertTrue("Key encryption is reversible with wrong password", !ECKey.encryptionIsReversible(originalUnencryptedKey, encryptedKey, keyCrypter, keyCrypter.deriveKey(WRONG_PASSWORD)));
    // Change one of the encrypted key bytes (this is to simulate a faulty keyCrypter).
    // Encryption should not be reversible
    byte[] goodEncryptedPrivateKeyBytes = encryptedPrivateKey.encryptedBytes;
    // Break the encrypted private key and check it is broken.
    byte[] badEncryptedPrivateKeyBytes = new byte[goodEncryptedPrivateKeyBytes.length];
    encryptedPrivateKey = new EncryptedData(encryptedPrivateKey.initialisationVector, badEncryptedPrivateKeyBytes);
    ECKey badEncryptedKey = ECKey.fromEncrypted(encryptedPrivateKey, keyCrypter, originalUnencryptedKey.getPubKey());
    assertTrue("Key encryption is reversible with faulty encrypted bytes", !ECKey.encryptionIsReversible(originalUnencryptedKey, badEncryptedKey, keyCrypter, keyCrypter.deriveKey(PASSWORD1)));
}