private void HillClimbingAnalysis()
        {
            if (settings.Iterations < 2 || settings.KeySize < 2)
            {
                GuiLogMessage("Check keylength and iterations", NotificationLevel.Error);
                return;
            }

            DateTime startTime  = DateTime.Now;
            DateTime nextUpdate = DateTime.Now.AddMilliseconds(100);

            HighscoreList ROUNDLIST = new HighscoreList(comparer, 10);

            ValueKey vk = new ValueKey();

            ulong totalKeys = (ulong)settings.Repeatings * (ulong)settings.Iterations;
            ulong doneKeys  = 0;

            stop = false;

            for (int repeating = 0; repeating < settings.Repeatings; repeating++)
            {
                if (stop)
                {
                    break;
                }

                ROUNDLIST.Clear();

                byte[] key    = randomArray(settings.KeySize);
                byte[] oldkey = new byte[settings.KeySize];

                for (int iteration = 0; iteration < settings.Iterations; iteration++)
                {
                    if (stop)
                    {
                        break;
                    }

                    Array.Copy(key, oldkey, key.Length);

                    int r = rd.Next(100);
                    if (r < 50)
                    {
                        for (int i = 0; i < rd.Next(10); i++)
                        {
                            swap(key, rd.Next(key.Length), rd.Next(key.Length));
                        }
                    }
                    else if (r < 70)
                    {
                        for (int i = 0; i < rd.Next(3); i++)
                        {
                            int l = rd.Next(key.Length - 1) + 1;
                            int f = rd.Next(key.Length);
                            int t = (f + l + rd.Next(key.Length - l)) % key.Length;
                            blockswap(key, f, t, l);
                        }
                    }
                    else if (r < 90)
                    {
                        int l = 1 + rd.Next(key.Length - 1);
                        int f = rd.Next(key.Length);
                        int t = (f + 1 + rd.Next(key.Length - 1)) % key.Length;
                        blockshift(key, f, t, l);
                    }
                    else
                    {
                        pivot(key, rd.Next(key.Length - 1) + 1);
                    }

                    decrypt(vk, key);

                    if (ROUNDLIST.Add(vk))
                    {
                        if (TOPLIST.isBetter(vk))
                        {
                            TOPLIST.Add(vk);
                            Output = vk.plaintext;
                        }
                    }
                    else
                    {
                        Array.Copy(oldkey, key, key.Length);
                    }

                    doneKeys++;

                    if (DateTime.Now >= nextUpdate)
                    {
                        TOPLIST.Merge(ROUNDLIST);
                        UpdatePresentationList(totalKeys, doneKeys, startTime);
                        nextUpdate = DateTime.Now.AddMilliseconds(1000);
                    }
                }
            }

            TOPLIST.Merge(ROUNDLIST);
            UpdatePresentationList(totalKeys, doneKeys, startTime);
        }
        private void BruteforceAnalysis()
        {
            int[] set = getBruteforceSettings();

            if (set == null)
            {
                GuiLogMessage("Specify the type of transposition to examine.", NotificationLevel.Error);
                return;
            }

            if (settings.MaxLength < 2 || settings.MaxLength > 20)
            {
                GuiLogMessage("Check transposition bruteforce length. Min length is 2, max length is 20!", NotificationLevel.Error);
                return;
            }

            ValueKey vk = new ValueKey();

            //Just for fractional-calculation:
            PermutationGenerator per = new PermutationGenerator(2);

            DateTime startTime  = DateTime.Now;
            DateTime nextUpdate = DateTime.Now.AddMilliseconds(100);

            ulong totalKeys = 0;

            for (int i = 1; i <= settings.MaxLength; i++)
            {
                totalKeys += (ulong)per.getFactorial(i);
            }
            totalKeys *= (ulong)set.Length;

            ulong doneKeys = 0;

            stop = false;

            for (int keylength = 1; keylength <= settings.MaxLength; keylength++)
            {
                if (stop)
                {
                    break;
                }

                // for every selected bruteforce mode:
                for (int s = 0; s < set.Length; s++)
                {
                    if (stop)
                    {
                        break;
                    }

                    switch (set[s])
                    {
                    case (0):
                        controlMaster.changeSettings("ReadIn", ReadInMode.byColumn);
                        controlMaster.changeSettings("Permute", PermutationMode.byColumn);
                        controlMaster.changeSettings("ReadOut", ReadOutMode.byColumn);
                        break;

                    case (1):
                        controlMaster.changeSettings("ReadIn", ReadInMode.byColumn);
                        controlMaster.changeSettings("Permute", PermutationMode.byColumn);
                        controlMaster.changeSettings("ReadOut", ReadOutMode.byRow);
                        break;

                    case (2):
                        controlMaster.changeSettings("ReadIn", ReadInMode.byRow);
                        controlMaster.changeSettings("Permute", PermutationMode.byColumn);
                        controlMaster.changeSettings("ReadOut", ReadOutMode.byColumn);
                        break;

                    case (3):
                        controlMaster.changeSettings("ReadIn", ReadInMode.byRow);
                        controlMaster.changeSettings("Permute", PermutationMode.byColumn);
                        controlMaster.changeSettings("ReadOut", ReadOutMode.byRow);
                        break;
                    }

                    byte[] key = new byte[keylength];

                    per = new PermutationGenerator(keylength);

                    while (per.hasMore() && !stop)
                    {
                        int[] keyInt = per.getNext();

                        for (int i = 0; i < key.Length; i++)
                        {
                            key[i] = Convert.ToByte(keyInt[i]);
                        }

                        decrypt(vk, key);

                        if (TOPLIST.isBetter(vk))
                        {
                            Output = vk.plaintext;
                        }

                        TOPLIST.Add(vk);
                        doneKeys++;

                        if (DateTime.Now >= nextUpdate)
                        {
                            UpdatePresentationList(totalKeys, doneKeys, startTime);
                            nextUpdate = DateTime.Now.AddMilliseconds(1000);
                        }
                    }
                }
            }

            UpdatePresentationList(totalKeys, doneKeys, startTime);
        }
        private void GeneticAnalysis()
        {
            if (settings.Iterations < 2 || settings.KeySize < 2 || settings.Repeatings < 1)
            {
                GuiLogMessage("Check keylength and iterations", NotificationLevel.Error);
                return;
            }

            ValueKey vk = new ValueKey();

            DateTime startTime  = DateTime.Now;
            DateTime nextUpdate = DateTime.Now.AddMilliseconds(100);

            HighscoreList ROUNDLIST = new HighscoreList(comparer, 12);

            ulong totalKeys = (ulong)settings.Repeatings * (ulong)settings.Iterations * 6;
            ulong doneKeys  = 0;

            stop = false;

            for (int repeating = 0; repeating < settings.Repeatings; repeating++)
            {
                if (stop)
                {
                    break;
                }

                ROUNDLIST.Clear();

                for (int i = 0; i < ROUNDLIST.Capacity; i++)
                {
                    ROUNDLIST.Add(createKey(randomArray(settings.KeySize)));
                }

                for (int iteration = 0; iteration < settings.Iterations; iteration++)
                {
                    if (stop)
                    {
                        break;
                    }

                    // Kinder der besten Keys erstellen
                    int rndInt = 0;

                    for (int a = 0; a < 6; a++)
                    {
                        if (a % 2 == 0)
                        {
                            rndInt = rd.Next(settings.KeySize - 1) + 1;
                        }

                        // combine DNA of two parents
                        ValueKey parent1 = ROUNDLIST[a];
                        ValueKey parent2 = ROUNDLIST[(a % 2 == 0) ? a + 1 : a - 1];

                        byte[] child = new byte[parent1.key.Length];
                        Array.Copy(parent1.key, child, rndInt);

                        int pos = rndInt;
                        for (int b = 0; b < parent2.key.Length; b++)
                        {
                            for (int c = rndInt; c < parent1.key.Length; c++)
                            {
                                if (parent1.key[c] == parent2.key[b])
                                {
                                    child[pos] = parent1.key[c];
                                    pos++;
                                    break;
                                }
                            }
                        }

                        // add a single mutation
                        int apos = rd.Next(settings.KeySize);
                        int bpos = (apos + rd.Next(1, settings.KeySize)) % settings.KeySize;
                        swap(child, apos, bpos);

                        decrypt(vk, child);

                        ROUNDLIST.Add(vk);

                        if (TOPLIST.isBetter(vk))
                        {
                            TOPLIST.Add(vk);
                            Output = vk.plaintext;
                        }

                        doneKeys++;
                    }

                    if (DateTime.Now >= nextUpdate)
                    {
                        TOPLIST.Merge(ROUNDLIST);
                        UpdatePresentationList(totalKeys, doneKeys, startTime);
                        nextUpdate = DateTime.Now.AddMilliseconds(1000);
                    }
                }
            }

            TOPLIST.Merge(ROUNDLIST);
            UpdatePresentationList(totalKeys, doneKeys, startTime);
        }