package org.ripple.power.database; public class Reductor { private String charset; private int maxPwLength; private int minPwLength; public Reductor(String charset, int minPwLength, int maxPwLength) { this.charset = charset; this.maxPwLength = maxPwLength; this.minPwLength = minPwLength; } public Reductor(String charset) { this(charset, 0, 64); } public byte[] reduce(byte[] hash, int functionNr) { byte pwLength = (byte) ((functionNr) % (maxPwLength - minPwLength + 1) + minPwLength); return reduce(hash, functionNr, pwLength); } public byte[] reduce(byte[] hash, int functionNr, byte pwLength) { byte[] result = new byte[pwLength]; for (int i = 0; i < pwLength; i++) { hash[i] ^= functionNr; result[i] = (byte) (Math.abs(hash[i]) % charset.length()); hash[i] ^= functionNr; } return result; } }