class PBKDF2PasswordEncryptor implements PasswordEncryptor {

    @Override
    public String encrypt(String saltSeed, String password) throws IllegalStateException {
        if (saltSeed == null || password == null) {
            throw new IllegalArgumentException("saltSeed and password must not be null.");
        }
        if (saltSeed.isEmpty() || password.isEmpty()) {
            return "";
        }

        KeySpec spec = new PBEKeySpec(password.toCharArray(), getSalt(saltSeed), getIterationCount(), getKeyLength());
        byte[] encryptPassword;
        try {
            do {
                encryptPassword = FACTORY.get().generateSecret(spec).getEncoded();
            } while (!isSuccessEncryption(encryptPassword));
        } catch (InvalidKeySpecException e) {
            // パスワードが空の場合に発生するが、事前にチェックしているためこの例外は発生しない。
            throw new RuntimeException(e);
        }
        return Base64Util.encode(encryptPassword);
    }

}