暴力破解算法——寻找密码(进制替换法)

暴力破解算法——寻找密码(进制替换法)

今天在看代码的时候发现的一种方法,我相信这种方法肯定是有人用过的,但是我也没有查到具体叫做什么方法,所以就自创了一个名字,不过这样子看起来我好像是一个不学无术的人,不过也确实如此,有空我再去查一下这个方法,有知道的可以在我下面评论一下,感谢!

  • 讲一下这篇文章主要解决的一个问题
    当我们知道密码的组成,但是不知道密码的具体排列组合顺序的时候,一般会采用两种方法,一种是根据字典去破解,这种我们暂且不谈,另一种方法则是对当前的密码集进行所有情况的遍历,上一篇文章我给出了一个递归遍历的方法,毋庸置疑,递归免不了保留现场,压栈,跳转,创建临时变量,出栈,返回等一系列操作,所以效率上肯定是比较差的。

今天我介绍一下一种新的方法,也许是别人用到烂大街的方法。我们知道,由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=进制数 时,必然要进位,所以,我们其实不用做进制转换,直接对当前的数组进行判断,加减即可,这样子的话效率肯定是更高的,但是,上面的算法是最好理解的。

你可能感兴趣的:(数据结构,c++,算法)