暴力破解算法——寻找密码(进制替换法)
今天在看代码的时候发现的一种方法,我相信这种方法肯定是有人用过的,但是我也没有查到具体叫做什么方法,所以就自创了一个名字,不过这样子看起来我好像是一个不学无术的人,不过也确实如此,有空我再去查一下这个方法,有知道的可以在我下面评论一下,感谢!
- 讲一下这篇文章主要解决的一个问题
当我们知道密码的组成,但是不知道密码的具体排列组合顺序的时候,一般会采用两种方法,一种是根据字典去破解,这种我们暂且不谈,另一种方法则是对当前的密码集进行所有情况的遍历,上一篇文章我给出了一个递归遍历的方法,毋庸置疑,递归免不了保留现场,压栈,跳转,创建临时变量,出栈,返回等一系列操作,所以效率上肯定是比较差的。
今天我介绍一下一种新的方法,也许是别人用到烂大街的方法。我们知道,由0-1000,甚至更大的数肯定是不会重复的,基于这个特点,有了我这个方法。
假设,现在我们要对密码进行遍历,已知该密码由 4 位字符组成,字符集为 {a,b,c},与之对应的下标为 {0,1,2}现在已知就有3*3*3*3=81 种情况,也就是说,遍历的值为 0 – 80,那么我们就可以用程序生成数 n,n为0 – 80 的数,因为字符集有 3 个元素,那么就选择 3 进制。下面我们就要将 n 转为 3 进制的数,然后将其存储在一个数组里面,再通过数组去找我们对应的元素,看下面的演示你就明白了
0 --> 0000 --> aaaa
1 --> 0001 --> aaab
2 --> 0002 --> aaac
3 --> 0010 --> aaba
4 --> 0011 --> aabb
5 --> 0012 --> aabc
6 --> 0020 --> aaca
7 --> 0021 --> aacb
8 --> 0022 --> aacc
9 --> 0100 --> abaa
10 --> 0101 --> abab
11 --> 0102 --> abac
12 --> 0110 --> abba
13 --> 0111 --> abbb
14 --> 0112 --> abbc
15 --> 0120 --> abca
16 --> 0121 --> abcb
17 --> 0122 --> abcc
... ... ... ... ...
... ... ... ... ...
... ... ... ... ...
80 --> 2222 --> cccc(2*3^3+2*3^2+2*3^1+2*3^0=80,完美)
可以看到,根据以上的组合,我们遍历了所有情况
其实,这种方法还有改进的空间,当 高位+1=进制数 时,必然要进位,所以,我们其实不用做进制转换,直接对当前的数组进行判断,加减即可,这样子的话效率肯定是更高的,但是,上面的算法是最好理解的。