Estou trabalhando em um aplicativo distribuído para descobrir senhas usando força bruta e outras técnicas.
Para a parte de força bruta, precisarei de uma biblioteca geradora de senha para Rust ou de uma ferramenta de linha de comando. Ele precisa gerar todas as possibilidades usando um conjunto de caracteres específico, um determinado comprimento de senha e um intervalo.
É importante ter a opção de obter apenas um intervalo específico porque pretendo distribuir esses 'lotes de senhas' para diferentes trabalhadores rodando em paralelo.
Por exemplo, gere uma senha alfanumérica de 4 dígitos indo da 1001ª à 2000ª senha.
Não há nenhuma biblioteca que eu conheça, provavelmente porque não é muito complicado fazer você mesmo:
Parque infantil
Explicando o algoritmo
Cada personagem é uma ordem de grandeza. Na base dez, com uma senha de comprimento quatro, você teria a casa dos 1000 , depois a casa dos 100 , depois a casa dos 10 e, finalmente, a casa dos 1 .
(0..width).rev()
itera através de3, 2, 1, 0
. Podemos notar que1000
é 10^3,100
é 10^2,10
é 10^1 e1
é 10^0; cada número corresponde à potência de dez da casa numérica.Portanto, a fórmula para a ordem de grandeza do lugar
i
é10.pow(i)
. Se dividirmos nosso númeron
por10.pow(2)
, obteremos um número que representa quantos 100 completos existem no número (a divisão inteira truncará quaisquer 10 ou 1 ). Para o número1234 / 10.pow(2)
resulta em12
. Mas nós só queremos isso2
, então pegamos o resto em relação a 1012 % 10
:.Então, para a base dez, nosso código seria
Em seguida, extrapolamos isso para um conjunto de símbolos maior, substituindo
10
porchar_set.len()
, resultando no algoritmo acima.