Esempio n. 1
0
        // Funktionen som körs av varje thread(createHash()),
        // createHash() Det är en funktion som anropas av alla thread.
        private void createHash(int threadID,                            // Id för tråden
                                String firstPassword,                    // Första lösenordet som skall skapas
                                int noOfPasswords,                       // Antal lösenord som funktionen skall skapa
                                List <PasswordHashData> listOfPasswords) // Lista som skall fyllas med skapade lösenord
        {
            try
            {
                // skapa upp en new PasswordGenerator och ange att första lösenorden
                // som skall skapas är (firstPassword)
                PasswordGenerator threadPasswordGenerator =
                    new PasswordGenerator(firstPassword);
                // Skapa en new HashGenerator()
                HashGenerator hashGenerator = new HashGenerator();

                // loopa för varje lösenord som skall skapas och beräknas hash för.
                // spara resultatet i listOfPasswords.
                for (int i = 0; i < noOfPasswords; i++)
                {
                    // Skall skapa passwordHashData för varje lösenord
                    PasswordHashData passwordHashData =
                        new PasswordHashData();

                    // Hämta nuvarande lösenord från threadPasswordGenerator
                    // från class PasswordGenerator och sparar i passwordHashData
                    // i property Password i PasswordHashData class.
                    passwordHashData.Password =
                        threadPasswordGenerator.GetCurrentPassword();

                    // Anropar calculateHash() i klassen HashGenerator.
                    // calculateHash() kommer att beräkna hashar för lösenordet
                    // som finns sparat i passwordHashData.Password.
                    // calculateHash() kommer att spara hasharna i passwordHashData.HashSha256,
                    // passwordHashData.HashSha384, passwordHashData.HashSha512
                    hashGenerator.calculateHash(passwordHashData);

                    // Addar allt som passwordHashData fått i listOfPasswords
                    listOfPasswords.Add(passwordHashData);

                    // Säg till threadPasswordGenerator att skapa nästa lösenord
                    threadPasswordGenerator.NextPassword(); // continue++
                }
            }


            finally
            {
                // nät thread är färdigt så räknar ner antalet aktiva threads -1
                ActiveTreadCount--;
            }
        }
Esempio n. 2
0
        // Run() kör programmet.
        public void Run()
        {
            int maxNumberOfRunningThreads = Environment.ProcessorCount - 1;
            int noOfEachThread            = 100;

            DatabaseManager dbManager = new DatabaseManager();

            dbManager.init("a");

            // börja på lösenordet där programmet slutade senast (dbManager.NextPassword).
            PasswordGenerator mainPasswordGenerator =
                new PasswordGenerator(dbManager.NextPassword);


            // deklarera en Dictionary<>,threadPasswordHashData som skall spara
            // en lista av <PasswordHashData> för varje threadId (int).
            Dictionary <int, List <PasswordHashData> > threadPasswordHashData =
                new Dictionary <int, List <PasswordHashData> >();


            while (!Console.KeyAvailable) // så länge är inte en knapp tryckning
            {
                //string password = passwordGenerator.GetCurrentPassword();
                //Console.WriteLine(password);
                //passwordGenerator.NextPassword();

                threadPasswordHashData.Clear();

                // Loop som skapar och kör threads.
                // Varje tread kommer och köra funktionen createHash()
                for (int i = 0; i < maxNumberOfRunningThreads; i++)
                {
                    int treadId = i;
                    // Lägga till en lista av typen <PasswordHashData>
                    //till Dictionary<> threadPasswordHashData.
                    threadPasswordHashData.Add(treadId, new List <PasswordHashData>());
                    String currentPassword = mainPasswordGenerator.GetCurrentPassword();

                    //Skapa new thread() och tala om vilken funktion
                    // den skall köra(createHash())
                    Thread thread = new Thread(() => createHash(treadId, currentPassword,
                                                                noOfEachThread, threadPasswordHashData[treadId]));

                    // Öka antal aktiva threads med +1
                    ActiveTreadCount++;

                    thread.Start();

                    mainPasswordGenerator.fastForward(noOfEachThread);
                }
                // Wait for all threads to finish
                while (ActiveTreadCount > 0)
                {
                    Thread.Sleep(100);
                }

                // alla threads har kört klart och skapat hashar i
                // threadPasswordHashData. Här kommer att slå ihop
                // alla threads listor till en lista.
                List <PasswordHashData> totalProcessedPasswords = new List <PasswordHashData>();

                // Hämta lista från Dictionary för varje thread och läg till i
                // totala listan(totalProcessedPasswords)
                for (int i = 0; i < maxNumberOfRunningThreads; i++)
                {
                    List <PasswordHashData> passwordHashData = threadPasswordHashData[i];
                    totalProcessedPasswords.AddRange(passwordHashData);
                }

                // Sparar lösenorden och hasharna till databasen
                dbManager.save(totalProcessedPasswords,
                               mainPasswordGenerator.GetCurrentPassword());
                // skriver ut hur lång programmet har kommit
                Console.Write("\rPasswords: {0:N0}\tCurrent password: {1}",
                              dbManager.NoOfProcessedPasswords, dbManager.NextPassword);
            }
        }