code: @Override
  	protected Cipher newCipher(final String privateKey, final String algorithm, final byte[] salt,
  		final int iterationCount, final int operationMode)
  		throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException,
  		InvalidKeyException, InvalidAlgorithmParameterException, UnsupportedEncodingException
  	{
  		final KeySpec keySpec = newKeySpec(privateKey, salt, iterationCount);
  		final SecretKeyFactory factory = newSecretKeyFactory(algorithm);
  		final SecretKey key = factory.generateSecret(keySpec);
  		final AlgorithmParameterSpec paramSpec = newAlgorithmParameterSpec(salt, iterationCount);
  		return newCipher(operationMode, key, paramSpec, key.getAlgorithm());
  	}
docs: Factory method for creating a new {@link Cipher} from the given parameters. This method is
  invoked in the constructor from the derived classes and can be overridden so users can
  provide their own version of a new {@link Cipher} from the given parameters.
  
  @param privateKey
  the private key
  @param algorithm
  the algorithm
  @param salt
  the salt.
  @param iterationCount
  the iteration count
  @param operationMode
  the operation mode for the new cipher object
  @return the cipher
  
  @throws NoSuchAlgorithmException
  is thrown if instantiation of the SecretKeyFactory object fails.
  @throws InvalidKeySpecException
  is thrown if generation of the SecretKey object fails.
  @throws NoSuchPaddingException
  is thrown if instantiation of the cypher object fails.
  @throws InvalidKeyException
  is thrown if initialization of the cypher object fails.
  @throws InvalidAlgorithmParameterException
  is thrown if initialization of the cypher object fails.
  @throws UnsupportedEncodingException
  is thrown if the named charset is not supported.