Esempio n. 1
0
        public void AccountsForTurnPositionsDirectionsAndStartingKey()
        {
            var match = new SpatialMatch
            {
                Token        = "zxcvbn",
                Graph        = "qwerty",
                Turns        = 3,
                ShiftedCount = 0,
                i            = 1,
                j            = 2,
            };

            var l        = match.Token.Length;
            var s        = SpatialGuessesCalculator.KeyboardStartingPositions;
            var d        = SpatialGuessesCalculator.KeyboardAverageDegree;
            var expected = 0.0;

            for (var i = 2; i <= l; i++)
            {
                for (var j = 1; j <= Math.Min(match.Turns, i - 1); j++)
                {
                    expected += PasswordScoring.Binomial(i - 1, j - 1) * s * Math.Pow(d, j);
                }
            }

            var actual = SpatialGuessesCalculator.CalculateGuesses(match);

            actual.Should().Be(expected);
        }
Esempio n. 2
0
        /// <summary>
        /// Estimates the attempts required to guess the password.
        /// </summary>
        /// <param name="match">The match.</param>
        /// <param name="password">The actual password.</param>
        /// <returns>The guesses estimate.</returns>
        public static double EstimateGuesses(Match match, string password)
        {
            if (match.Guesses != 0)
            {
                return(match.Guesses);
            }

            var minGuesses = 1.0;

            if (match.Token.Length < password.Length)
            {
                minGuesses = match.Token.Length == 1 ? BruteForceGuessesCalculator.MinSubmatchGuessesSingleCharacter : BruteForceGuessesCalculator.MinSubmatchGuessesMultiCharacter;
            }

            var guesses = 0.0;

            switch (match.Pattern)
            {
            case "bruteforce":
                guesses = BruteForceGuessesCalculator.CalculateGuesses(match as BruteForceMatch);
                break;

            case "date":
                guesses = DateGuessesCalculator.CalculateGuesses(match as DateMatch);
                break;

            case "dictionary":
                guesses = DictionaryGuessesCalculator.CalculateGuesses(match as DictionaryMatch);
                break;

            case "regex":
                guesses = RegexGuessesCalculator.CalculateGuesses(match as RegexMatch);
                break;

            case "repeat":
                guesses = RepeatGuessesCalculator.CalculateGuesses(match as RepeatMatch);
                break;

            case "sequence":
                guesses = SequenceGuessesCalculator.CalculateGuesses(match as SequenceMatch);
                break;

            case "spatial":
                guesses = SpatialGuessesCalculator.CalculateGuesses(match as SpatialMatch);
                break;
            }

            match.Guesses = Math.Max(guesses, minGuesses);
            return(match.Guesses);
        }
Esempio n. 3
0
        public void GuessesWhenThereAreNoTurns()
        {
            var match = new SpatialMatch
            {
                Token        = "zxcvbn",
                Graph        = "qwerty",
                Turns        = 1,
                ShiftedCount = 0,
                i            = 1,
                j            = 2,
            };

            var expected = SpatialGuessesCalculator.KeyboardStartingPositions * SpatialGuessesCalculator.KeyboardAverageDegree * (match.Token.Length - 1);

            var actual = SpatialGuessesCalculator.CalculateGuesses(match);

            actual.Should().Be(expected);
        }
Esempio n. 4
0
        public void DoublesGuessesIfEverythingIsShifted()
        {
            var match = new SpatialMatch
            {
                Token        = "zxcvbn",
                Graph        = "qwerty",
                Turns        = 1,
                ShiftedCount = 6,
                i            = 1,
                j            = 2,
            };

            var expected = SpatialGuessesCalculator.KeyboardStartingPositions * SpatialGuessesCalculator.KeyboardAverageDegree * (match.Token.Length - 1) * 2;

            var actual = SpatialGuessesCalculator.CalculateGuesses(match);

            actual.Should().Be(expected);
        }