예제 #1
0
        //static IGenomeDecoder<NeatGenome, MarkovChain> _genomeDecoder;
        //static PasswordCrackingEvaluator _passwordCrackingEvaluator;



        public static void Evaluate(IGenomeDecoder<NeatGenome, MarkovChain> genomeDecoder, PasswordCrackingEvaluator passwordCrackingEvaluator, PasswordEvolutionExperiment experiment)
        {

            string[] genomeFiles = Directory.GetFiles(@"..\..\..\experiments\genomes\", "*.xml");

            XmlDocument doc = new XmlDocument();
            int genomeNumber;


            foreach (string genomeFile in genomeFiles)
            {
                // Read in genome
                doc.Load(genomeFile);

                //NeatGenome genome = NeatGenomeXmlIO.LoadGenome(doc, false);
                //NeatGenomeFactory genomeFactory = (NeatGenomeFactory)CreateGenomeFactory();

                NeatGenome genome = experiment.LoadPopulation(XmlReader.Create(genomeFile))[0];
                MarkovChain phenome = experiment.CreateGenomeDecoder().Decode(genome);//genomeDecoder.Decode(genome);

                string[] filePath = genomeFile.Split('\\');
                string[] fileName = (filePath[filePath.Length - 1]).Split('-');


                String fileNumber = (fileName[1]).Split('.')[0];

                genomeNumber = Convert.ToInt32(fileNumber);


                //FileStream fs = File.Open(@"..\..\..\experiments\genomes\genome-results\genome-"+genomeNumber+"-results.txt", FileMode.CreateNew, FileAccess.Write);
                TextWriter tw = new StreamWriter(@"..\..\..\experiments\genomes\genome-results\genome-" + genomeNumber + "-results.txt");

                // Evaluate
                if (null == phenome)
                {   // Non-viable genome.
                    tw.WriteLine("0.0 0.0");
                }
                else
                {
                    FitnessInfo fitnessInfo = passwordCrackingEvaluator.Evaluate(phenome);
                    double val = fitnessInfo._fitness;
                    double val2 = fitnessInfo._alternativeFitness;
                    tw.WriteLine(fitnessInfo._fitness + " " + fitnessInfo._alternativeFitness);
                }
                tw.Close();
                File.Create(@"..\..\..\experiments\genomes\genome-finished\genome-" + genomeNumber + "-finished.txt");
            }

            // Write results?? -> genome_#_results
            // Write finished flag -> genome_#_finished

        }
예제 #2
0
        // Runs a comparison of the two model types.
        static void RunAllMarkovModelPairs(object special)
        {
            const string EXPERIMENT_OFFSET = @"..\..\..\experiments\intermediate\";
            string[] models = new string[]
            {
                "first-order",
                "8-layer"
            };
            
            // For every dataset, create a model
            for (int i = 0; i < _datasetFilenames.Length; i++)
            {
                if (i != (int)special)
                    continue;
                for (int m = 0; m < 2; m++)
                {
                    int outputs;
                    string seedFile = EXPERIMENT_OFFSET + "seed-" + models[m] + "-" + _datasetFilenames[i].Name + ".xml";
                    Console.Write("Building {0} Markov model...", models[m]);
                    if (m == 0)
                        outputs = MarkovFilterCreator.GenerateFirstOrderMarkovFilter(seedFile, _passwords[i]);
                    else
                        outputs = MarkovFilterCreator.GenerateLayeredMarkovFilter(seedFile, _passwords[i], 8);

                    Console.WriteLine("Done! Outputs: {0}", outputs);
                    _experiment.OutputCount = outputs;

                    Console.WriteLine("Loading seed...");
                    var seed = _experiment.LoadPopulation(XmlReader.Create(seedFile))[0];

                    Console.WriteLine("Creating model...");
                    var model = _experiment.CreateGenomeDecoder().Decode(seed);

                    // For every dataset, test the model
                    for (int j = 0; j < _datasetFilenames.Length; j++)
                    {
                        Console.Write("Validating {0} {1} model on {2} with {3} guesses... ", models[m], _datasetFilenames[i].Name, _datasetFilenames[j].Name, VALIDATION_GUESSES);
                        PasswordCrackingEvaluator eval = new PasswordCrackingEvaluator(VALIDATION_GUESSES, false);
                        var results = eval.Validate(model, _passwords[j], EXPERIMENT_OFFSET + models[m] + "-" + _datasetFilenames[i].Name + "-" + _datasetFilenames[j].Name + ".csv", 10000);
                       // Console.WriteLine("Accounts: {0} Uniques: {1}", results._fitness, results._alternativeFitness);
                        Console.WriteLine("Total Score: {0} Uniques: {1}", results._fitness, results._alternativeFitness);

                        lock(_writerLock)
                            using (TextWriter writer = new StreamWriter(@"..\..\..\experiments\summary_results.csv", true))
                                writer.WriteLine("{0},{1},{2},{3},{4}%,{5}%", 
                                    _datasetFilenames[i].Name, 
                                    _datasetFilenames[j].Name, 
                                    results._fitness, 
                                    results._alternativeFitness,
                                    results._fitness / (double)_passwords[j].Sum(kv => kv.Value) * 100,
                                    results._alternativeFitness / (double)_passwords[j].Count * 100); 
                    }
                }
            }
        }
예제 #3
0
 static void ValidateModel(MarkovChain model, Dictionary<string, double> passwords, int guesses, bool hashed ) //passwords here is not used...
 {
     Console.Write("Validating on {0} guesses... ", guesses);
     PasswordCrackingEvaluator eval = new PasswordCrackingEvaluator(guesses, hashed);
     var results = eval.Validate(model);
     Console.WriteLine("Accounts: {0} Uniques: {1}", results._fitness, results._alternativeFitness);
 }
        public NeatEvolutionAlgorithm<NeatGenome> CreateEvolutionAlgorithm(IGenomeFactory<NeatGenome> genomeFactory, List<NeatGenome> genomeList, IGenomeListEvaluator<NeatGenome> eval = null)
        {
            // Create distance metric. Mismatched genes have a fixed distance of 10; for matched genes the distance is their weigth difference.
            IDistanceMetric distanceMetric = new ManhattanDistanceMetric(1.0, 0.0, 10.0);
            ISpeciationStrategy<NeatGenome> speciationStrategy = new ParallelKMeansClusteringStrategy<NeatGenome>(distanceMetric, _parallelOptions);

            // Create complexity regulation strategy.
            IComplexityRegulationStrategy complexityRegulationStrategy = new NullComplexityRegulationStrategy();// ExperimentUtils.CreateComplexityRegulationStrategy(_complexityRegulationStr, _complexityThreshold);

            // Create the evolution algorithm.
            NeatEvolutionAlgorithm<NeatGenome> ea = new NeatEvolutionAlgorithm<NeatGenome>(_eaParams, speciationStrategy, complexityRegulationStrategy);

            // Create the MC evaluator
            PasswordCrackingEvaluator.Passwords = _passwords;

            // Create genome decoder.
            IGenomeDecoder<NeatGenome, MarkovChain> genomeDecoder = CreateGenomeDecoder();

            // If we're running specially on Condor, skip this
            if (eval == null)
            {
                _evaluator = new PasswordCrackingEvaluator(_guesses, Hashed);

                // Create a genome list evaluator. This packages up the genome decoder with the genome evaluator.
                //    IGenomeListEvaluator<NeatGenome> innerEvaluator = new ParallelGenomeListEvaluator<NeatGenome, MarkovChain>(genomeDecoder, _evaluator, _parallelOptions);
                IGenomeListEvaluator<NeatGenome> innerEvaluator = new ParallelNEATGenomeListEvaluator<NeatGenome, MarkovChain>(genomeDecoder, _evaluator, this);

                /*
                // Wrap the list evaluator in a 'selective' evaulator that will only evaluate new genomes. That is, we skip re-evaluating any genomes
                // that were in the population in previous generations (elite genomes). This is determiend by examining each genome's evaluation info object.
                IGenomeListEvaluator<NeatGenome> selectiveEvaluator = new SelectiveGenomeListEvaluator<NeatGenome>(
                                                                                        innerEvaluator,
                                                                                        SelectiveGenomeListEvaluator<NeatGenome>.CreatePredicate_OnceOnly());
                */


                // Initialize the evolution algorithm.
                ea.Initialize(innerEvaluator, genomeFactory, genomeList);
            }
            else
                // Initialize the evolution algorithm.
                ea.Initialize(eval, genomeFactory, genomeList);

            

            // Finished. Return the evolution algorithm
            return ea;
        }
예제 #5
0
        static void Main(string[] args)
        {
            if (args.Length < 7)
            {
                Console.WriteLine("Usage: ModelEvaluator.exe <results_file> <model_id> <model_file> <finished_flag> <passwords_found_file> <config_file> <outputs> [passwords] [pw_length]");
                return;
            }
            Console.WriteLine("Starting");
            PasswordEvolutionExperiment experiment = new PasswordEvolutionExperiment();

            int    curArg             = 0;
            string resultsFile        = args[curArg++];
            int    modelId            = int.Parse(args[curArg++]);
            string modelFile          = args[curArg++];
            string finishedFlag       = args[curArg++];
            string passwordsFoundFile = args[curArg++];
            string configFile         = args[curArg++];
            int    outputs            = int.Parse(args[curArg++]);

            experiment.OutputCount = outputs;

            // Load the XML configuration file
            XmlDocument xmlConfig = new XmlDocument();

            xmlConfig.Load(configFile);

            experiment.Initialize("evaluation", xmlConfig.DocumentElement);

            // Optionally load the passwords from somewhere besides the file specified
            // in the experiment config file.
            if (args.Length > curArg)
            {
                Console.WriteLine("Passwords file: {0}", args[curArg]);
                string passwordFile = args[curArg++];

                int?pwLength = null;
                if (args.Length > curArg)
                {
                    Console.WriteLine("Password Length: {0}", args[curArg]);
                    pwLength = int.Parse(args[curArg++]);
                }
                // Load the passwords to evaluate with
                experiment.Passwords = PasswordUtil.LoadPasswords(passwordFile, pwLength);
                Console.WriteLine("Passwords loaded");
            }
            PasswordCrackingEvaluator.Passwords = experiment.Passwords;

            PasswordCrackingEvaluator eval = new PasswordCrackingEvaluator(experiment.GuessesPerIndividual, experiment.Hashed);

            var modelGenome = experiment.LoadPopulation(XmlReader.Create(modelFile))[0];
            var model       = experiment.CreateGenomeDecoder().Decode(modelGenome);

            using (TextWriter tw = new StreamWriter(resultsFile))
            {
                // Evaluate
                if (model == null)
                {   // Non-viable genome.
                    tw.WriteLine("0.0 0.0");
                }
                else
                {
                    FitnessInfo fitnessInfo = eval.Evaluate(model);
                    tw.WriteLine(fitnessInfo._fitness + " " + fitnessInfo._alternativeFitness);
                }
            }

            using (TextWriter writer = new StreamWriter(passwordsFoundFile))
                foreach (var pw in eval.FoundPasswords)
                {
                    writer.WriteLine(pw);
                }

            File.Create(finishedFlag);
        }
예제 #6
0
 static void ValidateForest(List<MarkovChain> models, Dictionary<string, PasswordInfo> passwords, int guesses, bool hashed) //passwords here is not used...
 {
     Console.WriteLine("Number of champion models: {0}", models.Count);
     Console.WriteLine("Validating All-Star Team on {0} guesses each...", guesses);
     PasswordCrackingEvaluator eval = new PasswordCrackingEvaluator(guesses, hashed);
     eval.ValidatePopulation(models);
     double accounts = eval.FoundValidationPasswords.Sum(s => PasswordCrackingEvaluator.Passwords[s].Accounts);
     double uniques = eval.FoundValidationPasswords.Count;
     Console.WriteLine("Accounts: {0} Uniques: {1}", accounts, uniques);
 }
예제 #7
0
        static void Main(string[] args)
        {
            if (args.Length < 7)
            {
				Console.WriteLine("Usage: ModelEvaluator.exe <results_file> <model_id> <model_file> <finished_flag> <passwords_found_file> <config_file> <outputs> [passwords] [pw_length]");
                return;
            }
			Console.WriteLine("Starting");
            PasswordEvolutionExperiment experiment = new PasswordEvolutionExperiment();

            int curArg = 0;
			string resultsFile = args[curArg++];
            int modelId = int.Parse(args[curArg++]);
			string modelFile = args[curArg++];
			string finishedFlag = args[curArg++];
			string passwordsFoundFile = args[curArg++];
			string configFile = args[curArg++];
			int outputs = int.Parse(args[curArg++]);
			experiment.OutputCount = outputs;

			// Load the XML configuration file
			XmlDocument xmlConfig = new XmlDocument();
			xmlConfig.Load(configFile);

			experiment.Initialize("evaluation", xmlConfig.DocumentElement);

            // Optionally load the passwords from somewhere besides the file specified
            // in the experiment config file.
            if (args.Length > curArg)
            {
				Console.WriteLine("Passwords file: {0}", args[curArg]);
				string passwordFile = args[curArg++];

                int? pwLength = null;
                if (args.Length > curArg)
				{
					Console.WriteLine("Password Length: {0}", args[curArg]);
					pwLength = int.Parse(args[curArg++]);
				}
                // Load the passwords to evaluate with
                experiment.Passwords = PasswordUtil.LoadPasswords(passwordFile, pwLength);
				Console.WriteLine("Passwords loaded");
            }
			PasswordCrackingEvaluator.Passwords = experiment.Passwords;

            PasswordCrackingEvaluator eval = new PasswordCrackingEvaluator(experiment.GuessesPerIndividual, experiment.Hashed);

            var modelGenome = experiment.LoadPopulation(XmlReader.Create(modelFile))[0];
            var model = experiment.CreateGenomeDecoder().Decode(modelGenome);

            using (TextWriter tw = new StreamWriter(resultsFile))
            {
                // Evaluate
                if (model == null)
                {   // Non-viable genome.
                    tw.WriteLine("0.0 0.0");
                }
                else
                {
                    FitnessInfo fitnessInfo = eval.Evaluate(model);
                    tw.WriteLine(fitnessInfo._fitness + " " + fitnessInfo._alternativeFitness);
                }
            }

			using(TextWriter writer = new StreamWriter(passwordsFoundFile))
				foreach(var pw in eval.FoundPasswords)
					writer.WriteLine(pw);

            File.Create(finishedFlag);
        }