public CharactersFrequencyModel CalculateCharactersFrequency(string text) { CharactersFrequencyModel model = new CharactersFrequencyModel(); foreach (var character in text) { if (char.IsLetter(character)) { if (!model.CharactersCount.ContainsKey(character)) { model.CharactersCount[character] = 0; } model.CharactersCount[character]++; model.TotalCharactersCount++; } } foreach (var letter in model.CharactersCount.Keys) { model.CharactersFrequency[letter] = Math.Round((model.CharactersCount[letter] / model.TotalCharactersCount * 100), roundDecimalsCount); } model.CharactersCount.OrderBy(x => x.Key); model.CharactersFrequency.OrderBy(x => x.Key); return(model); }
public Dictionary <int, string> FindKey(CharactersFrequencyModel realCharactersFrequency, string encryptedText, int n) { var encryptedTextModel = this.calculationsService.CalculateCharactersFrequency(encryptedText); var iterationsCount = Math.Min(n, this.Letters.Count); var realTextLetters = realCharactersFrequency.CharactersCount.OrderByDescending(x => x.Value).Take(iterationsCount).Select(x => x.Key); var encryptedTextLetters = encryptedTextModel.CharactersCount.OrderByDescending(x => x.Value).Take(iterationsCount).Select(x => x.Key); Dictionary <int, int> keysFrequency = new Dictionary <int, int>(); foreach (var realTextLetter in realTextLetters) { foreach (var encryptedTextLetter in encryptedTextLetters) { var key = (this.Letters.IndexOf(encryptedTextLetter) - this.Letters.IndexOf(realTextLetter) + this.Letters.Count) % this.Letters.Count; if (!keysFrequency.ContainsKey(key)) { keysFrequency[key] = 1; } else { keysFrequency[key]++; } } } var keys = keysFrequency.OrderByDescending(x => x.Value).Select(x => x.Key); var results = new Dictionary <int, string>(); foreach (var key in keys) { var text = this.Decrypt(encryptedText, key); results.Add(key, text); } return(results); }