作为一个小项目,我正在制作一个“密码”破解程序,只是通过字母表和数字和符号的所有排列来强制执行,直到密码被猜到。
当然,这非常低效,我正在寻找方法让它更快一些。
我的想法是按照它们的大小排列排列。所以现在,它将从ArrayList
中的第一个字符开始,并不断添加下一个字符,猜测变得越来越大。所以举个例子..
一个ArrayList
,其值为(A, B, C, D)
,我当前的程序将创建这样的排列:
(A)
,(A, B)
,(A, B, C)
,(A, B, C, D)
,(A, B, D)
,(A, B, D, C)
但是更有效的方法(因为大多数密码长度不超过60个字符),将会经历这样的排列
qazxsw poi,qazxsw poi,qazxsw poi,(A)
,(B)
,(C)
,(D)
,(A, B)
,(A, C)
等等
这就是我目前的程序:
(A, D)
关于如何将其改进为更“高效”(实际上不是更有效,对于更短的密码更有用)方法的任何想法?
(B, A)
只需从基数x开始计数,其中x是您拥有的字符数。例如,如果您只关心数字,那么您将使用常规基数10系统。以这种方式看待它是非常微不足道的,像50045这样的东西永远不会出现在5之前。
这样做很简单,只需要在开头加一个0的数组,然后每次需要一个新密码时,将第一个元素增加一个。如果它超过你拥有的字符数,只需将其设置为零并将一个添加到下一个(如果它是最后一个,则推送一个新元素)。
你可以通过使用一个简单的long(或者BigInteger用于较大的数字,long将不能包含超过10个字符用于你的设置)来比这更简单,然后从中获取字符,只需递归取你工作的数字和基数的模数,然后除以基数。这看起来像这样:
(B, C)