コード例 #1
0
        public Tuple <string, string, double> Decipher(string code = "")
        {
            Stopwatch s = new Stopwatch();

            s.Start();
            if (code != "")
            {
                Code = code;
            }
            string key       = CipherGenerator.CreateRandomKey();
            string betterKey = key;
            string bestKey   = key;

            double betterFitness = CalcFitness(Code);
            double bestFitness   = betterFitness;
            double words;

            int  first = 0, sec = 0, tries = 0;
            bool hasBetterFitness;

            //Check a bunch of similar keys, changing a little each time
            do
            {
                do
                {
                    hasBetterFitness = false;
                    key = betterKey;
                    for (first = 0; first < key.Length - 1; first++)
                    {
                        for (sec = first; sec < key.Length; sec++)
                        {
                            //Swap two letters
                            string testKey = sec == first ? key : Swap(key, first, sec);
                            Cipher c       = new Cipher(testKey);
                            Cleartext = c.Decode(Code);
                            //Check if it's English
                            double fitness = CalcFitness(Cleartext);
                            if (fitness < betterFitness)
                            {
                                //Use the better key as a base key
                                betterFitness    = fitness;
                                betterKey        = testKey;
                                hasBetterFitness = true;
                            }
                        }
                    }
                }while (hasBetterFitness);

                if (betterFitness < bestFitness)
                {
                    bestFitness = betterFitness;
                    bestKey     = betterKey;
                }
                else
                {
                    tries++;
                }


                betterKey = CipherGenerator.CreateRandomKey();
                key       = bestKey;
                Cipher cipher = new Cipher(key);
                Cleartext = cipher.Decode(Code);

                //Check agaainst a dictionary to avoid local maxima
                words         = CountGoodWords(KeepWords(Cleartext, " "));
                betterFitness = CalcFitness(Cleartext);

                if (tries > 10)
                {
                    bestFitness = 10;
                    tries       = 0;
                }
            }while (words > 0.12);

            s.Stop();
            var time = s.Elapsed;

            return(Tuple.Create(Cleartext, key, bestFitness));
        }
コード例 #2
0
 public void GenerateCipherPair(RandomGenerator random, out StatementBlock encrypt, out StatementBlock decrypt)
 {
     CipherGenerator.GeneratePair(random, out encrypt, out decrypt);
 }