private void TestKeyLengthHelp(int parCount, int lettCount, int turn, int take) { KeyLength keyLength = new KeyLength(); for (int i = 0; i < parCount; i++) { string opentext = texts.RandomParagraph(lettCount); string key = cipher.RandomKey(); string ciphertext = cipher.Encrypt(opentext, key); try { /*var crackKeys = keyLength.GetKeyLength(ciphertext).Take(take); success[parCount * turn + i] = crackKeys.Contains(key.Length) ? 1 : 0;*/ var crackKeys = cipher.Crack(ciphertext, Vigenere.BruteForce, Form1.currentLanguage); success[parCount * turn + i] = crackKeys.First().Length == key.Length ? 1 : 0; } catch (Exception) { } progress(); } lock (lockObject) { SetDone(turn); if (AreThreadsDone()) afterFinish("Úspěšnost: " + ((int)(success.Average() * 100)).ToString() + "%"); } }
/******************* KONEC *********************/ public int[] GetKey(string ciphertext) { KeyLength keyLength = new KeyLength(); return keyLength.GetKeyLength(ciphertext).Where(x => x < 30).Where(x => x > 4).Take(1).ToArray(); }
/// <summary> /// Crackovací metoda, která se nejprve pokusí zjistit délku klíče /// a následně se pokusí prolomit šifru standardně. /// </summary> /// <param name="ciphertext"></param> /// <param name="language"></param> /// <returns></returns> private List<string> TestKeyLengthAttack(string ciphertext, Storage.Languages language) { KeyLength keyLength = new KeyLength(); var keysLength = keyLength.GetKeyLength(ciphertext).Take(6).ToArray(); if (keysLength.Length == 0) keysLength = new int[MaxKeyLength - 2].Fill(x => x + 2); return BruteForceAttack(ciphertext, language, keysLength); }