static void Main(string[] args) { qgr qgr = new qgr(); char[] cipherText = "YCAHFUECQIYSAYAQVYOXAYYOCGOHXKDTQXCXSOWSXKXFTBPRFDVDUOYXUDNAIXFQUDIRSOBGYIUTAYMDVOYVSOTBPRFDRSXTTDVUHTXQHAXFFBCYPQUHBUDNNFMDEBGSUMZNQIOHCDNDYIDYOYHCQFYZDYDHUTAVYAHTHCFNAXBKQNAGDNYUCQUTSQORBFKCUMVNOYULDMMAKUUKYRXSGSDATDRSFEXUEXRHFNUDYOXKXRRSYIQURFDYNRYARYANFQGOCXUDEGFUXFYRSTGBVAHCFXORHCKUDICHAQHCKPYCRCUDGMZLDANRYACYUKQNSODAXEBRLQMDYNXFDMGNYOXUXLECFQYXHCXEFBIXAVFDUBRSXTTDRSOHBQNGSOTBPRFDGBUBDZZEQUPXTBPRFDBUDNNFMDEBBHAVFDENECCZYIUDDZPFGUXEBTLQHVORRCSOOYKRGBMSGBHRSUROYNXUDFDYDYIDRYYOPKGSBFCIQFFUZYYIULQAXFRSXTTDYAKUYARYNXOYHCFNUDNKTAEABGYIFDIDBZYGSOXCSOUKRSXTTDULDYWGCYECEBYNFXSDLNHRSOFIMXYQDNQXXKZDYDOHTDZGHCUDXUXBUKOYDAXFOHCGPZKURSECCIFNCDZYYITBPRFDBUITAVFDXQDPZCKUATBSULQAXFNDBUEUMUADCYYIOYHCKUDRQFBTORYBGPKXOMXEZBLQYAOXQATDSOYAOVSOEGSVTSVHAYCDPQTBPRFDYCSFLNHCFUGHFNNPBCQPFXYUPEBQYCQFGNYOEGSVTSVHUTAQTBAXUKDCANNGPKECFLYUKSSVOYMAYZKUZEOXXQXFNAIXFQPQXDUYYAOQFXITFQPQTAQDSOTBPRFDBGXRAVFDPQTDBCQPFXYACYEXHAUYBFQIVSBEIAXNHTXQCFIODFASBVFQIADOECQCTSUKAOHTOYGUUDGFYUABTBPRFDBUDNNFMDEBAGYOXKMSBHFQDAQINPNFXHXKDZMXKUBGUYHCORXKMSAKFBHTXQCDYIPQXDUYNAHAFQITAVFDKSSVUBZYBGICIQSBDYIHUYLDNFIXLNYXXKZEUDZGHCQPFXGVATNRNFMDEBUHUWSQFNYORBYXQPXPMAYZLXAVFDXKPAHTXQXFNAYNFXCGBAXFORCRAVFDCGAWOBRORCFXNZZEDYIDYNDIDUYXQITBPRFDAORQATXODUXQQIPXYCXKAMFNBFOBYUXCKUCYUBXUFPFNOYXKDACGFMYOVYBXAVFDRSXTTDTBPRFDNFMDEBBHUYCYPNFNTBPRFDZGECKZBDHCFXQEATVYAXNSDANRYAHTHCFXKXUBULXPBFYCCQLXRSYILNYXXKDAADYIFPXPHOKSORNGSOPFUDBUDNRSXTTDORUYXLYACYHCSOWSRVDMQNKPUBYSDYYHBTAVFUYNROLQPFOIBGNFBFUYDSEUMUCDCYUYRBYXYAYCTBPRFDBUDNXKOHDBXQHAQFITAVFDFDNFNQZGECFQUEFBDYYAHTHCFNAXBKQNBHAVFDKSSTDMCZOHXPFNOYBFQBQRCGGKYCCKUTSQBSEAHTXQCDIXAVMXKXXPBGUYUYHCLNARBRKUTBPRFDNBPVFNUBBFSOYMBYXLBHXFLXXKIRAVFDXSXTTDNERSXTTDQBSQFNBFFBTANPYRXKTAAVULQAXFXFBFZLDYYHXKQYZBKXDMGBBOFNRAAVNFMDEBUHUWBTLQHVORRCYAOTBNXQCDWSHRAVFDPKXFUVFXORDYYHSUPQTDCYWSHORCFNBELXAVFDBUDNNFMDEBBHAVFDYUNRNDYIORCGGKORRCUDYRBXLGYIYCAUHLDYOYCGGKBDOHTBORYAHVFUXFORXQPVCYYIOYCYPFVYAXNFMUXHAXQETAVRXKTSOBKPYCTGSOARDFZCGONDBUEUMUCDCYUYTBPRFDRSXTTDHCOBHCLXRSAFACFUHGHCFPAVXPOVSOBFKCFUMRATBUEQOVYAHCQXAXPXYRYOXKNAHAFQGOTBPRFDPKECCBAVFDDAKPFUECEZBRLQMDYNXFDMVOSYUYUYQUQRXKFDGUPKXFGRDZYAXOIXFQPQXDUYMSUHOHZCKBROCDYIUMMUECFQMDHTHCLUBENKDYNFMDEBUHGKBDOHTBORVUHLQXYAXVFXRSWUPKGSSOFIMSYCSOHODNLNYXXKRSECCBAVFDNFMDEBBHAVFDPAAFAXFNXKOHDBYAHOXKBCFUCFDQQFHTHCORYCVSBEIAQXBRCQKUAKATHCFPOYXFFDDYHCFXUTAVKSZCKXDATDUDYRXKNAHAFQGOXURCUDNKIFYQDYIHAVFDVUUHBGICVOFUARBERDXFPKECKBYAHTHCFXKUYUPXFNTBPRFDRSXTTDPAHTXQXFIRAVFDAOXOIXFQPQXDUYFDNFUDDQAXHCFXXUZEUDORYBPNPUPXXLUHBUTDOIBUGDYIQBANQITBPRFDPKECCBAVFDHCGBGBYSAYOILXAVFDHCXPTBPRFDASGNYOXKGKNPWSGBCDWSROAFNEMSAMOYGSSFKXDATDGSUDIRAVFDAOROHTHCQFUBRVAVXPHOXUFPFNNPUAFQOYRDXLYCTBPRFDUDMFFXQFITQBUKGRGBLDOHUDIAKNUDGKDYIDYIYCAUHLMSAMUDMRATMSAMCZLQDFQXTAYUPF".ToArray(); char[] plainText = new char[cipherText.Length]; char[] key = "RXTHCAUOSBDNYGIMPVWZFEQKL".ToArray(); int i = 0; double score, maxscore = -99e99; while (true) { Console.WriteLine("Beginning iteration"); i++; score = playfairCrack(cipherText, ref key); if(score > maxscore) { maxscore = score; Console.WriteLine("best score so far: " + score); Console.WriteLine("Iteration: " + i); Console.Write("Key: '"); for (int j = 0; j < key.Length; j++) { Console.Write(key[j]); } Console.WriteLine("\n"); plainText = playfairDecipher(key, cipherText); Console.Write("plaintext: '"); for (int j = 0; j < plainText.Length; j++) { Console.Write(plainText[j]); } Console.Write("'\n"); } } }
private static float playfairCrack(char[] text, ref char[] key) { qgr qgr = new qgr(); Random rand = new Random(); float bestScore = 0F; char[] deciphered; char[] testKey = key; char[] maxKey = key; double prob, dF, maxScore, score; deciphered = playfairDecipher(testKey, text); maxScore = qgr.scoreTextQgram(deciphered); bestScore = (float)maxScore; for (float T = 20; T >= 0; T -= 0.2F) { for (int count = 0; count < 5000; count++) { testKey = modifyKey(maxKey); deciphered = playfairDecipher(testKey, text); score = qgr.scoreTextQgram(deciphered); dF = score - maxScore; if(dF >= 0) { maxScore = score; testKey = maxKey; } else if (T > 0) { prob = Math.Exp(dF / T); if (prob > 1.0 * rand.Next() / 2147483647) { maxScore = score; testKey = maxKey; } } if(maxScore > bestScore) { bestScore = (float)maxScore; key = maxKey; } } } return bestScore; }