Senhas de força bruta
Aug 21 2020
Um dia atrás, comecei um projeto ac # onde eu uso senhas de força bruta. As senhas podem ser números inteiros e strings. No código eu verifico quantos caracteres a senha tem. Embora isso seja meio que trapaça, levaria muito tempo para quebrar de outra forma. Estou postando aqui para ver se é bom o suficiente.
using System;
namespace Hacking_Project
{
class Program
{
static void Main()
{
//Console Color
Console.ForegroundColor = ConsoleColor.White;
Console.Clear();
//If password is found
bool done = false;
//If the password is a string, not the best name but ok
bool yes = false;
//If the Guessed password is the same number of characters as the original password
int pass = 0;
//Guessed password
string pass_check = "";
//Possible characters for the password
char[] pos = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z'};
Console.WriteLine("What is the password?");
//Asking for the password to crack
string password = Console.ReadLine();
//How much characters does the password has. I know that this is kinda cheating, but then the bruteforce would take to much
int digits = password.Length;
//Initialising the random number generator
Random rand = new Random();
//The choices that the calculator will take for the guessed password(int)
int[] choices = new int[digits];
//The choices that the calculator will take for the guessed password(string)
char[] choices1 = new char[digits];
//If the password is a string
for (int i = 0; i < pos.Length; i++)
{
if (password.Contains(pos[i]))
{
password = password.ToLower();
yes = true;
}
}
//The Cracking Part
while (done == false)
{
if (!yes)
{
for (int i = 0; i < digits; i++)
{
choices[i] = rand.Next(0, 9);
pass_check += choices[i];
pass++;
//Console Color
Console.ForegroundColor = ConsoleColor.DarkYellow;
if (pass != digits)
{
Console.Write(choices[i]);
}
else
{
Console.Write(choices[i] + ", ");
}
}
}
else
{
for (int i = 0; i < digits; i++)
{
choices1[i] = pos[rand.Next(pos.Length)];
pass_check += choices1[i];
pass++;
Console.ForegroundColor = ConsoleColor.DarkYellow;
if (pass != digits)
{
Console.Write(choices1[i]);
}
else
{
Console.Write(choices1[i] + ", ");
}
}
}
pass = 0;
if (pass_check == password)
{
Console.ForegroundColor = ConsoleColor.White;
Console.Write("\n\nThe password is: ");
Console.ForegroundColor = ConsoleColor.Green;
Console.Write(pass_check);
Console.ForegroundColor = ConsoleColor.White;
Console.Write("\n\nThe original password is: ");
Console.ForegroundColor = ConsoleColor.Red;
Console.Write(password);
Console.ForegroundColor = ConsoleColor.Blue;
Console.Write("\n\nDo you want to restart?");
Console.ForegroundColor = ConsoleColor.White;
Console.Write(" => ");
string restart = Console.ReadLine();
restart = restart.ToLower();
if (restart == "yes")
{
Main();
}
else if (restart == "no")
{
done = true;
}
}
//If the password is not found, quessed password is set to empty
else
{
pass_check = "";
}
}
}
}
}
Respostas
2 MaLiN2223 Aug 23 2020 at 05:20
Isenção de responsabilidade: abaixo está apenas minha opinião, por favor, não a trate como uma fonte de verdade. Além disso, estou assumindo que o código funciona exatamente como esperado - não vou me debruçar sobre desempenho ou validade.
- Muitos comentários, em vez disso, tente refatorar o código para ser mais explicativo. Tio Bob disse melhor: 'Um comentário é uma falha em se expressar em código' (a menos que seja um 'porquê' que não pode ser explicado, é claro).
- Divida o código para funções/classes de responsabilidade única e pequena, veja aqui para orientação.
- As operações relacionadas ao console podem ser delegadas a uma classe separada (um wrapper) para que possam ser facilmente estendidas no futuro para lidar com entrada/saída de outras fontes. Além disso, para evitar duplicação (por exemplo, escrever
\n\nna frente de strings pode ser abstraído). - Os nomes das variáveis devem indicar o conteúdo (a menos que seja muito óbvio). Você escreveu um comentário 'não é o melhor nome, mas ok', sim - não é o melhor nome, mas não acho que seja 'ok'. No meio do código, tive que rolar para cima para verificar o que essa variável significa, isso não está certo. O mesmo vale para variáveis como
choices1,digitseposoutras. while (done == false)pode serwhile(!done)que seja mais curto e mais explicativo 'em inglês'.- Use
Console.WriteLineem vez de adicionar\n\n(você pode até fazerConsole.WriteLine(""). - Use loop while em vez de recursão para
Main. Duas razões para isso: você pode exceder as pilhas (improvável para humanos, mas qualquer bot pode fazer isso facilmente) E seria mais esperado por outros ver um loop de jogo em vez de uma função recursiva. - Exibe possíveis valores de entrada para reiniciar, o usuário pode tentar
Y, o que não funcionará.
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?