/**
   * Test with random plain text strings and random passwords. UUIDs are used and hence will only
   * cover hex characters (and the separator hyphen).
   *
   * @throws KeyCrypterException
   * @throws UnsupportedEncodingException
   */
  @Test
  public void testKeyCrypterGood2() throws Exception {
    KeyCrypterScrypt keyCrypter = new KeyCrypterScrypt(scryptParameters);

    System.out.print("EncrypterDecrypterTest: Trying random UUIDs for plainText and passwords :");
    int numberOfTests = 16;
    for (int i = 0; i < numberOfTests; i++) {
      // Create a UUID as the plaintext and use another for the password.
      String plainText = UUID.randomUUID().toString();
      CharSequence password = UUID.randomUUID().toString();

      EncryptedPrivateKey encryptedPrivateKey =
          keyCrypter.encrypt(plainText.getBytes(), keyCrypter.deriveKey(password));

      assertNotNull(encryptedPrivateKey);

      byte[] reconstructedPlainBytes =
          keyCrypter.decrypt(encryptedPrivateKey, keyCrypter.deriveKey(password));
      assertEquals(
          Utils.bytesToHexString(plainText.getBytes()),
          Utils.bytesToHexString(reconstructedPlainBytes));
      System.out.print('.');
    }
    System.out.println(" Done.");
  }
  @Test
  public void testEncryptDecryptBytes2() throws KeyCrypterException {
    KeyCrypterScrypt keyCrypter = new KeyCrypterScrypt(scryptParameters);

    // Encrypt random bytes of various lengths up to length 50.
    Random random = new Random();

    for (int i = 0; i < 50; i++) {
      byte[] plainBytes = new byte[i];
      random.nextBytes(plainBytes);

      EncryptedPrivateKey encryptedPrivateKey =
          keyCrypter.encrypt(plainBytes, keyCrypter.deriveKey(PASSWORD1));
      assertNotNull(encryptedPrivateKey);
      // log.debug("\nEncrypterDecrypterTest: cipherBytes = \nlength = " + cipherBytes.length +
      // "\n---------------\n" + Utils.bytesToHexString(cipherBytes) + "\n---------------\n");

      byte[] rebornPlainBytes =
          keyCrypter.decrypt(encryptedPrivateKey, keyCrypter.deriveKey(PASSWORD1));

      log.debug("Original: (" + i + ") " + Utils.bytesToHexString(plainBytes));
      log.debug("Reborn1 : (" + i + ") " + Utils.bytesToHexString(rebornPlainBytes));
      assertEquals(Utils.bytesToHexString(plainBytes), Utils.bytesToHexString(rebornPlainBytes));
    }
  }
  @Test
  public void testKeyCrypterGood1() throws KeyCrypterException {
    KeyCrypterScrypt keyCrypter = new KeyCrypterScrypt(scryptParameters);

    // Encrypt.
    EncryptedPrivateKey encryptedPrivateKey =
        keyCrypter.encrypt(TEST_BYTES1, keyCrypter.deriveKey(PASSWORD1));
    assertNotNull(encryptedPrivateKey);

    // Decrypt.
    byte[] reborn = keyCrypter.decrypt(encryptedPrivateKey, keyCrypter.deriveKey(PASSWORD1));
    log.debug("Original: " + Utils.bytesToHexString(TEST_BYTES1));
    log.debug("Reborn  : " + Utils.bytesToHexString(reborn));
    assertEquals(Utils.bytesToHexString(TEST_BYTES1), Utils.bytesToHexString(reborn));
  }
  @Test
  public void testEncryptDecryptBytes1() throws KeyCrypterException {
    KeyCrypterScrypt keyCrypter = new KeyCrypterScrypt(scryptParameters);

    // Encrypt bytes.
    EncryptedPrivateKey encryptedPrivateKey =
        keyCrypter.encrypt(TEST_BYTES1, keyCrypter.deriveKey(PASSWORD1));
    assertNotNull(encryptedPrivateKey);
    log.debug(
        "\nEncrypterDecrypterTest: cipherBytes = \nlength = "
            + encryptedPrivateKey.getEncryptedBytes().length
            + "\n---------------\n"
            + Utils.bytesToHexString(encryptedPrivateKey.getEncryptedBytes())
            + "\n---------------\n");

    byte[] rebornPlainBytes =
        keyCrypter.decrypt(encryptedPrivateKey, keyCrypter.deriveKey(PASSWORD1));

    log.debug("Original: " + Utils.bytesToHexString(TEST_BYTES1));
    log.debug("Reborn1 : " + Utils.bytesToHexString(rebornPlainBytes));
    assertEquals(Utils.bytesToHexString(TEST_BYTES1), Utils.bytesToHexString(rebornPlainBytes));
  }
  @Test
  public void testKeyCrypterWrongPassword() throws KeyCrypterException {
    KeyCrypterScrypt keyCrypter = new KeyCrypterScrypt(scryptParameters);

    // create a longer encryption string
    StringBuilder stringBuffer = new StringBuilder();
    for (int i = 0; i < 100; i++) {
      stringBuffer.append(i).append(" ").append("The quick brown fox");
    }

    EncryptedPrivateKey encryptedPrivateKey =
        keyCrypter.encrypt(stringBuffer.toString().getBytes(), keyCrypter.deriveKey(PASSWORD2));
    assertNotNull(encryptedPrivateKey);

    try {
      keyCrypter.decrypt(encryptedPrivateKey, keyCrypter.deriveKey(WRONG_PASSWORD));
      // TODO: This test sometimes fails due to relying on padding.
      fail("Decrypt with wrong password did not throw exception");
    } catch (KeyCrypterException ede) {
      assertTrue(ede.getMessage().contains("Could not decrypt"));
    }
  }