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)); }
public void GenerateCipherPair(RandomGenerator random, out StatementBlock encrypt, out StatementBlock decrypt) { CipherGenerator.GeneratePair(random, out encrypt, out decrypt); }