public string Crypt(string text, string key, string abc, bool encrypt) { Checker.KeyNull(key); Checker.KeyContain(key, abc); Checker.TextNull(text); Checker.TextContain(text, abc); // удвоенные буквы for (var i = 0; i < text.Length - 1; i += 2) { if (text[i] == text[i + 1]) { throw new CipherException( $"Необходимо поставить символ между \"{text[i]}{text[i + 1]}\"."); } } if (text.Length % 2 != 0) { throw new CipherException("Текст содержит нечетное количество символов.\n" + "Добавьте или удалите один символ."); } var encAbc = GetEncryptedAlphabet(null, key, abc); var result = ""; // rows == cols var len = encAbc.GetLength(0); for (var i = 0; i < text.Length - 1; i += 2) { var first = text[i].ToString(); var second = text[i + 1].ToString(); if (!ArrayOperations.ContainsIn(first, encAbc, out var x1, out var y1) || !ArrayOperations.ContainsIn(second, encAbc, out var x2, out var y2)) { continue; } // если в одной строке if (x1 == x2) { if (encrypt) { result += $"{encAbc[x1, (y1 + 1) % len]}" + $"{encAbc[x2, (y2 + 1) % len]}"; } else { result += $"{encAbc[x1, (y1 - 1 + len) % len]}" + $"{encAbc[x2, (y2 - 1 + len) % len]}"; } } // если в одном столбце else if (y1 == y2) { if (encrypt) { result += $"{encAbc[(x1 + 1) % len, y1]}" + $"{encAbc[(x2 + 1) % len, y2]}"; } else { result += $"{encAbc[(x1 - 1 + len) % len, y1]}" + $"{encAbc[(x2 - 1 + len) % len, y2]}"; } } // иначе else { result += $"{encAbc[x1, y2]}" + $"{encAbc[x2, y1]}"; } } return(result); }