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àm Console.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.