Bruteforcing password
Aug 21 2020
Sehari yang lalu saya memulai proyek ac # di mana saya bruteforce password. Kata sandi dapat berupa bilangan bulat dan string. Dalam kode saya memeriksa berapa banyak karakter yang dimiliki kata sandi. Meskipun ini agak curang, butuh waktu terlalu lama untuk memecahkannya. Saya mempostingnya di sini untuk melihat apakah itu cukup baik.
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 = "";
}
}
}
}
}
Jawaban
2 MaLiN2223 Aug 23 2020 at 05:20
Penafian: di bawah ini hanya pendapat saya, mohon jangan perlakukan itu sebagai sumber kebenaran. Juga, saya berasumsi bahwa kode bekerja persis seperti yang diharapkan - saya tidak akan memikirkan kinerja atau vailiditas.
- Terlalu banyak komentar, coba refactor kodenya agar lebih jelas. Paman Bob mengatakannya dengan sangat baik: 'Komentar adalah kegagalan untuk mengekspresikan diri Anda dalam kode' (kecuali jika itu adalah 'mengapa' yang tentu saja tidak dapat dijelaskan).
- Bagi kode menjadi fungsi / kelas tanggung jawab kecil dan tunggal, lihat di sini untuk panduan.
- Operasi terkait konsol dapat didelegasikan ke kelas terpisah (pembungkus) sehingga dapat dengan mudah diperpanjang di masa mendatang untuk menangani masukan / keluaran dari sumber lain. Juga, untuk menghindari duplikasi (misalnya, tulisan di depan
\n\nstring dapat disarikan). - Nama variabel harus menunjukkan konten (kecuali sangat jelas). Anda menulis komentar 'bukan nama terbaik tapi ok', ya - ini bukan nama terbaik tapi menurut saya bukan 'baik'. Setengah jalan melalui kode saya harus menggulir ke atas untuk memeriksa apa arti variabel ini, ini tidak benar. Sama berlaku untuk variabel seperti
choices1,digits,posdan lain-lain. while (done == false)bisa jadiwhile(!done)itu lebih pendek dan lebih jelas 'dalam bahasa Inggris'.- Gunakan
Console.WriteLinealih-alih menambahkan\n\n(Anda bahkan bisa melakukannyaConsole.WriteLine(""). - Gunakan while loop sebagai ganti rekursi untuk
Main. Dua alasan untuk itu: Anda dapat melebihi tumpukan (tidak mungkin untuk manusia tetapi bot mana pun dapat melakukannya dengan mudah) DAN akan lebih diharapkan oleh orang lain untuk melihat loop permainan daripada fungsi rekursif. - Menampilkan nilai input yang mungkin untuk restart, pengguna mungkin mencoba
Y, yang tidak akan berfungsi.
Kiat Pemilik Anjing yang Bermanfaat: Mengapa Penting untuk Membiarkan Anjing Anda Mengendus di Jalan
Jana Duggar: Semua yang Dia Katakan Tentang Cinta dan Jendela 5 Tahunnya untuk Menemukan 'Yang Satu'