예제 #1
0
파일: Program.cs 프로젝트: ijcheng/CPEN442
        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");
                }
            }
        }
예제 #2
0
파일: Program.cs 프로젝트: ijcheng/CPEN442
        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;
        }