android lock password combinations
Asked Answered
W

5

17

I just came across with this interesting question from my colleague. I'm trying now, but meanwhile I thought I could share it here.

With the password grid shown in the Android home screen, how many valid passwords are possible? min password length: 4 max: 9 (correct me if I'm wrong)

Whap answered 8/8, 2011 at 8:38 Comment(5)
Please see android lock screen on youtube or somewhere. Its not just about characters, its about different ways to defining your own password.Whap
Actually, I don't see that this question has anything to do with algorithms. It's just really basic combinatorics.Underground
I thought algorithm label is apt than "combinatorics" to reach more audience. Feel free to correct if i'm wrong, sorry.Whap
math.stackexchange.com/questions/37167/… Math way of solving.Whap
Here is the full list of combination as TXT file: github.com/delight-im/AndroidPatternLockBodkin
F
25

Summary

The full combinations of 4 to 9 distinctive numbers, minus the combinations which include invalid "jump"s.

The Long Version

The rule for Android 3x3 password grid:

  • one point for once

  • cannot "jump" over a point

enter image description here

The author of the original post used Mathematica to generate all 985824 combinations.

enter image description here

Because there is no "jump", several pairs of consecutive points are invalid.

enter image description here

enter image description here

Delete all invalid combinations to reach the result.

enter image description here

enter image description here

The combinations for 4-to-9-point paths are respectively 1624, 7152, 26016, 72912, 140704, 140704.

enter image description here

The Original Post In Chinese

The reference is from guokr, a site alike Stack Exchange Skeptics in the form of blogs.

Foreknowledge answered 8/8, 2011 at 9:17 Comment(12)
Looks promising, gave an upvote. I shall wait for translation for more understanding :)Whap
@rplusg, refresh the page, and you'll get the full translation.Foreknowledge
This is good, we can write a program to get answer. But it is not standard math way to solve a problem. Lets wait for more answers.Whap
@rplusg, if you are looking for a mathematical way, go for Maths of Stack Exchange. For Stack Overflow, this answer is fine IMHO.Foreknowledge
> The combinations for 4-to-9-point paths are respectively 1624, 7152, 26016, 72912, 140704, 140704 Add to this the fact that after incorrectly guessing the path 5 times consecutively, the software makes you wait 30 seconds before you can try again. Assume you had the least number of points (4) and the person correctly guessed your path after the 800th try (half of the total possibilities, on average, assuming no path is likelier than any other). Also assume it takes 2 seconds to make an incorrect guess --Vesical
That's ((5 guesses * 2 seconds) + 30 seconds) * 800 attempts = 32000 seconds, or about 9 hours. If you are security-conscious and have an 8- or 9-point code, again assuming it takes them half of the total number of possible guesses on average, ((5 guesses * 2 seconds) + 30 seconds) * 70000 attempts = over 30 days to crack it. Hopefully by then you would have realized that your phone was lost and changed your passwords.Vesical
Came across this in a search because I was interested in the topic. Why do 8 and 9 point passwords have the same combination count? I think this is more accurate: quora.com/…Quantic
@Atlos, because when you decide the first 8 digits, the last digit is determined.Foreknowledge
@DanteisnotaGeek I don't follow. If I did 1->2->3->6->5->4->7->8 then I have several possible options to go for my 9th point. What am I missing here?Quantic
@Atlos, no, you have to choose the only left number (i.e. 9) as the last.Foreknowledge
@DanteisnotaGeek Ah I see. I just tried it on my device and thought that you could repeat points, but that is not the case.Quantic
i write program; for 4 dots i got 1400 pattern!!! why you say 1624 state? iranled.com/forum/thread-29844-post-250111.html#pid250111 ;;;;You can find the pattern that is not listed?!?!Mitinger
T
4

I know this question is old, but I answered it in another question (before finding this question) with a brute force approach in python, so adding it here for posterity:

pegs = {
    1: {3:2, 7:4, 9:5},
    2: {8:5},
    3: {1:2, 7:5, 9:6},
    4: {6:5},
    5: {},
    6: {4:5},
    7: {1:4, 3:5, 9:8},
    8: {2:5},
    9: {1:5, 3:6, 7:8}
}

def next_steps(path):
    return (n for n in range(1,10) if (not path or n not in path and 
                                       (n not in pegs[path[-1]] 
                                        or pegs[path[-1]][n] in path)))

def patterns(path, steps, verbose=False):
    if steps == 0:
        if verbose: print(path)
        return 1
    return sum(patterns(path+[n], steps-1) for n in next_steps(path))

So you can list all the # of patterns for any number of steps:

>>> [(steps, patterns([], steps)) for steps in range(1,10)]
[(1, 9),
 (2, 56),
 (3, 320),
 (4, 1624),
 (5, 7152),
 (6, 26016),
 (7, 72912),
 (8, 140704),
 (9, 140704)]
>>> sum(patterns([], steps) for steps in range(4,10))
389112

This is not the most efficient way of solving it because you could use reflections and only calculate a 4*corner + 4*mid-edge + 1*middle, e.g.:

>>> patterns([], 6) == 4*patterns([1], 5) + 4*patterns([2], 5) + patterns([5], 5)
True
Tendance answered 5/1, 2016 at 14:15 Comment(0)
C
0

I brute forced the answer with a recursive search and i found a bigger answer, 487272. The algorithm is simple: trying it all. I quoted it down here. I didn't found any error in my code (but I'm not very skilled with c++). Sorry for the grammatical error I'm not English.

#include <iostream>
#include <stdlib.h>
using namespace std;

int combo;  //counter

void research(int Ipoints /*number of points already took*/, bool Icheck[9]/*points matrix*/,int Ilast/*last took point*/,
                   int Icomboval/*combination representation, only for printing purpose*/, int deep/*number of iteration, only for printing purpose*/)
{

    //  int numcall = 0;  //DEBUG


     for( int i=0; i<9; i++) //Controlling every free point in search of a valid way to contimue
          if( Icheck[i] == false )
          {  
              //Just for security, coping every variable in a new variable. I don't know how c++ works but I will make it works
              int points = Ipoints;
              int last = Ilast;
              int comboval = Icomboval;
              bool check[9];
                   for( int j=0; j<9; j++)
                        check[j] = Icheck[j];  

              int e1,e2;
              int middle = -1;
              e1=i; e2=last;  //Ccontrolling duble jumps
              if( e1 == 0 && e2 == 2 ) middle = 1;
              if( e1 == 3 && e2 == 5 ) middle = 4;
              if( e1 == 6 && e2 == 8 ) middle = 7;
              if( e1 == 0 && e2 == 6 ) middle = 3;
              if( e1 == 1 && e2 == 7 ) middle = 4;
              if( e1 == 2 && e2 == 8 ) middle = 5;
              if( e1 == 0 && e2 == 8 ) middle = 4;
              if( e1 == 6 && e2 == 2 ) middle = 4;

              e2=i; e1=last;  // in both way
              if( e1 == 0 && e2 == 2 ) middle = 1;
              if( e1 == 3 && e2 == 5 ) middle = 4;
              if( e1 == 6 && e2 == 8 ) middle = 7;
              if( e1 == 0 && e2 == 6 ) middle = 3;
              if( e1 == 1 && e2 == 7 ) middle = 4;
              if( e1 == 2 && e2 == 8 ) middle = 5;
              if( e1 == 0 && e2 == 8 ) middle = 4;
              if( e1 == 6 && e2 == 2 ) middle = 4;

              if((middle != -1) && !(check[middle])) {      
                        check[middle] = true;
                        points++;                      //adding middle points
                        comboval *= 10;
                        comboval += middle;
              }       

              check[i] = true;
              points++;           // get the point

              comboval*=10;
              comboval += i+1;

              if(points > 3)
              {
                  combo++; // every iteration over tree points is a valid combo

                // If you want to see they all, beware because printing they all is truly slow:
                    // cout << "Combination n. " << combo << " found: " << comboval  << " , points " << points << " with " << deep << " iterations\n";
              }

              if(points > 9)   //Just for sure, emergency shutdown,
              { exit(1); }


              research(points,check,i,comboval,deep+1); /*Recursive, here is the true program!*/

              // numcall++; //DEBUG
          }

       //   cout << "Ended " << deep << " , with " << numcall << " subs called\n";   // Only for debug purposes,remove with all the //DEBUG thing

}



int main ()
{
    combo = 0; //no initial knows combo
    bool checkerboard[9];
    for( int i=0; i<9; i++) checkerboard[i]=false; //blank initial pattern

    research(0/*no point taken*/,checkerboard,-1/*just a useless value*/,0/*blank combo*/,1/*it's the firs iteration*/); //let's search!

    cout << "\n"  ;            
    cout << "And the answer is ... " << combo << "\n"; //out

    char ans='\0';
    while(ans=='\0')
    {                   //just waiting
    cin >> ans;
    }

    return 0;
}
Consult answered 15/8, 2014 at 17:2 Comment(0)
S
0

i just run a python code to get possible combinations i got 985824 possibilities

from itertools import permutations
numbers = "123456789"

total_combos = list(permutations(numbers,4))+list(permutations(numbers,5))+list(permutations(numbers,6))+list(permutations(numbers,7))+list(permutations(numbers,8))+list(permutations(numbers,9))
print(len(total_combos))
Stirpiculture answered 26/9, 2022 at 16:28 Comment(0)
H
-4

(No of Points- Valid patterns) (4 - 746) (5 - 3268) (6 - 11132) (7 - 27176) (8 - 42432) (9 - 32256)


Total of 117010 valid Patterns are possible

Homiletic answered 18/8, 2014 at 21:34 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.