Exemplo n.º 1
0
        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);
        }