@Override public double exec(Match match) { Keyboard keyboard = Keyboard.of(match.graph); int s = keyboard.getStartingPositions(); double d = keyboard.getAverageDegree(); double guesses = 0; int l = match.token.length(); int t = match.turns; for (int i = 2; i <= l; i++) { int possibleTurns = Math.min(t, i - 1); for (int j = 1; j <= possibleTurns; j++) { guesses += nCk(i - 1, j - 1) * s * Math.pow(d, j); } } if (match.shiftedCount != null && match.shiftedCount > 0) { int shiftedCount = match.shiftedCount; int unshiftedCount = match.token.length() - match.shiftedCount; if (shiftedCount == 0 || unshiftedCount == 0) { guesses *= 2; } else { int shiftedVariations = 0; for (int i = 1; i <= Math.min(shiftedCount, unshiftedCount); i++) { shiftedVariations += nCk(shiftedCount + unshiftedCount, i); } guesses *= shiftedVariations; } } return guesses; } }
@Override public double exec(Match match) { if (match.guesses != null) return match.guesses; int minGuesses = 1; if (match.token.length() < password.length()) { minGuesses = match.token.length() == 1 ? MIN_SUBMATCH_GUESSES_SINGLE_CHAR : MIN_SUBMATCH_GUESSES_MULTI_CHAR; } final Guess guess; switch (match.pattern) { case Bruteforce: guess = new BruteforceGuess(); break; case Dictionary: guess = new DictionaryGuess(); break; case Spatial: guess = new SpatialGuess(); break; case Repeat: guess = new RepeatGuess(); break; case Sequence: guess = new SequenceGuess(); break; case Regex: guess = new RegexGuess(); break; case Date: guess = new DateGuess(); break; default: guess = null; break; } double guesses = guess != null ? guess.exec(match) : 0; match.guesses = Math.max(guesses, minGuesses); match.guessesLog10 = Scoring.log10(match.guesses); return match.guesses; } }
@Override public double exec(Match match) { if (match.guesses != null) return match.guesses; int minGuesses = 1; if (match.token.length() < password.length()) { minGuesses = match.token.length() == 1 ? MIN_SUBMATCH_GUESSES_SINGLE_CHAR : MIN_SUBMATCH_GUESSES_MULTI_CHAR; } final Guess guess; switch (match.pattern) { case Bruteforce: guess = new BruteforceGuess(); break; case Dictionary: guess = new DictionaryGuess(); break; case Spatial: guess = new SpatialGuess(); break; case Repeat: guess = new RepeatGuess(); break; case Sequence: guess = new SequenceGuess(); break; case Regex: guess = new RegexGuess(); break; case Date: guess = new DateGuess(); break; default: guess = null; break; } double guesses = guess != null ? guess.exec(match) : 0; match.guesses = Math.max(guesses, minGuesses); match.guessesLog10 = Scoring.log10(match.guesses); return match.guesses; } }
@Override public double exec(Match match) { Keyboard keyboard = Keyboard.of(match.graph); int s = keyboard.getStartingPositions(); double d = keyboard.getAverageDegree(); double guesses = 0; int l = match.token.length(); int t = match.turns; for (int i = 2; i <= l; i++) { int possibleTurns = Math.min(t, i - 1); for (int j = 1; j <= possibleTurns; j++) { guesses += nCk(i - 1, j - 1) * s * Math.pow(d, j); } } if (match.shiftedCount != null && match.shiftedCount > 0) { int shiftedCount = match.shiftedCount; int unshiftedCount = match.token.length() - match.shiftedCount; if (shiftedCount == 0 || unshiftedCount == 0) { guesses *= 2; } else { int shiftedVariations = 0; for (int i = 1; i <= Math.min(shiftedCount, unshiftedCount); i++) { shiftedVariations += nCk(shiftedCount + unshiftedCount, i); } guesses *= shiftedVariations; } } return guesses; } }