Mật khẩu bắt buộc
Aug 21 2020
Một ngày trước, tôi đã bắt đầu dự án ac #, nơi tôi bắt đầu sử dụng mật khẩu. Mật khẩu có thể là cả số nguyên và chuỗi. Trong đoạn mã, tôi kiểm tra xem mật khẩu có bao nhiêu ký tự. Trong khi điều này là một gian lận thì sẽ mất quá nhiều thời gian để bẻ khóa. Tôi đăng nó ở đây để xem nếu nó đủ tốt.
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 = "";
}
}
}
}
}
Trả lời
2 MaLiN2223 Aug 23 2020 at 05:20
Disclaimer: dưới đây chỉ là ý kiến của tôi, xin vui lòng không coi nó như một nguồn của sự thật. Ngoài ra, tôi đang giả định rằng mã hoạt động chính xác như mong đợi - tôi sẽ không tập trung vào hiệu suất hoặc khả năng hoạt động.
- Quá nhiều nhận xét, thay vào đó hãy cố gắng cấu trúc lại mã để giải thích rõ hơn. Bác Bob đã nói hay nhất: 'Một bình luận là một sự thất bại trong việc thể hiện bản thân bằng mã' (trừ khi đó là 'lý do tại sao' mà tất nhiên không thể giải thích được).
- Cung cấp mã cho các chức năng / lớp trách nhiệm nhỏ và đơn lẻ, xem hướng dẫn tại đây .
- Các hoạt động liên quan đến bảng điều khiển có thể được ủy quyền cho một lớp riêng biệt (một lớp bao bọc) để nó có thể dễ dàng mở rộng trong tương lai để xử lý đầu vào / đầu ra từ các nguồn khác. Ngoài ra, để tránh trùng lặp (ví dụ: viết phần trước
\n\ncủa chuỗi có thể được trừu tượng hóa đi). - Tên biến phải biểu thị nội dung (trừ khi nó rất rõ ràng). Bạn đã viết nhận xét 'không phải tên hay nhất nhưng vẫn ổn', vâng - đó không phải là tên hay nhất nhưng tôi không nghĩ nó là 'ổn'. Tôi phải cuộn lên một nửa đoạn mã để kiểm tra xem biến này có nghĩa là gì, điều này không đúng. Tương tự như vậy với các biến như
choices1,digits,posvà những người khác. while (done == false)có thể làwhile(!done)nó ngắn hơn và dễ giải thích hơn 'bằng tiếng Anh'.- Sử dụng
Console.WriteLinethay vì thêm\n\n(bạn thậm chí có thể làmConsole.WriteLine(""). - Sử dụng vòng lặp while thay vì đệ quy for
Main. Hai lý do cho điều đó: bạn có thể vượt quá các ngăn xếp (không có khả năng xảy ra với con người nhưng bất kỳ bot nào cũng có thể làm điều đó dễ dàng) VÀ người khác sẽ mong đợi nhiều hơn khi thấy một vòng lặp trò chơi hơn là hàm đệ quy. - Hiển thị các giá trị đầu vào có thể có để khởi động lại, người dùng có thể thử
Ynhưng sẽ không hoạt động.