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);

            var encAbc = string.Join("", key.Union(abc));
            var result = "";

            foreach (var ch in text)
            {
                for (var j = 0; j < abc.Length; j++)
                {
                    if (encrypt)
                    {
                        if (ch == abc[j])
                        {
                            result += encAbc[j];
                            break;
                        }
                    }
                    else
                    {
                        if (ch == encAbc[j])
                        {
                            result += abc[j];
                            break;
                        }
                    }
                }
            }
            return(result);
        }
Exemplo n.º 2
0
        public string[,] GetEncryptedAlphabet(string text, string key, string abc)
        {
            Checker.KeyNull(key);
            Checker.KeyContain(key, abc);

            var lengthArr = (int)Math.Ceiling(Math.Sqrt(abc.Length));

            var highLength = lengthArr * lengthArr;
            var lowLength  = (lengthArr - 1) * (lengthArr - 1);

            if (highLength != abc.Length)
            {
                throw new CipherException($"Длина алфавита составляет {abc.Length}.\n" +
                                          $"Необходимо либо увеличить ее до {highLength}, " +
                                          $"либо уменьшить до {lowLength}.");
            }

            // зашифрованный алфавит в виде матрицы
            var abcArr = new string[lengthArr, lengthArr];

            // зашифрованный алфавит в виде строки
            var encAbc = string.Join("", key.Union(abc));

            var count = 0;

            for (var i = 0; i < abcArr.GetLength(0); i++)
            {
                for (var j = 0; j < abcArr.GetLength(1); j++)
                {
                    abcArr[i, j] = encAbc[count++].ToString();
                }
            }
            return(abcArr);
        }
Exemplo n.º 3
0
        public string Crypt(string text, string key, string abc, bool encrypt)
        {
            Checker.KeyNull(key);
            Checker.TextNull(text);

            var indexes = GetIndexes(key);
            var result  = "";

            if (encrypt)
            {
                var encAbc = GetEncryptedAlphabet(text, key, abc);

                for (var i = 0; i < key.Length; i++)
                {
                    var index = Array.IndexOf(indexes, i);
                    for (var j = 0; j < encAbc.GetLength(0); j++)
                    {
                        result += encAbc[j, index];
                    }
                }
            }
            else
            {
                var cols    = key.Length;
                var textLen = text.Length;

                if (cols > textLen)
                {
                    throw new CipherException("Длина ключа больше чем шифрованный текст.");
                }

                var rows = textLen / cols;

                if (textLen % cols > 0)
                {
                    rows += 1;
                }

                var textArr = new string[rows, cols];
                var count   = 0;

                for (var i = 0; i < key.Length; i++)
                {
                    var index = Array.IndexOf(indexes, i);
                    for (var j = 0; j < textArr.GetLength(0); j++)
                    {
                        if (count == text.Length)
                        {
                            textArr[j, index] = "•";
                        }
                        else
                        {
                            textArr[j, index] = text[count++].ToString();
                        }
                    }
                }
                result = string.Join("", textArr.Cast <string>());
            }
            return(result);
        }
Exemplo n.º 4
0
        public string[,] GetEncryptedAlphabet(string text, string key, string abc)
        {
            Checker.KeyNull(key);
            Checker.TextNull(text);

            var textLen = text.Length;
            var cols    = key.Length;
            var rows    = textLen / cols;

            if (textLen % cols > 0)
            {
                rows += 1;
            }

            var textArr = new string[rows, cols];
            var count   = 0;

            for (var i = 0; i < textArr.GetLength(0); i++)
            {
                for (var j = 0; j < textArr.GetLength(1); j++)
                {
                    if (count == text.Length)
                    {
                        textArr[i, j] = "•";
                    }
                    else
                    {
                        textArr[i, j] = text[count++].ToString();
                    }
                }
            }
            return(textArr);
        }
Exemplo n.º 5
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);

            var len    = abc.Length;
            var result = "";
            // index of the key symbol
            var count = 0;

            foreach (var t in text)
            {
                var index    = abc.IndexOf(t);
                var keyIndex = abc.IndexOf(key[count]);
                if (encrypt)
                {
                    result += $"{abc[(index + keyIndex) % len]}";
                }
                else
                {
                    result += $"{abc[(index + len - keyIndex) % len]}";
                }
                count = (count + 1) % key.Length;
            }
            return(result);
        }
Exemplo n.º 6
0
        public string[,] GetEncryptedAlphabet(string text, string key, string abc)
        {
            Checker.KeyNull(key);
            Checker.KeyContain(key, abc);

            var encAbc = key.Union(abc).Select(x => $"{x}").ToArray();

            return(ArrayOperations.Turn1DTo2D(encAbc));
        }
Exemplo n.º 7
0
        public string Crypt(string text, string key, string abc, bool encrypt)
        {
            Checker.KeyNull(key);
            var intKey = Checker.GetKeyInt(key);

            Checker.TextNull(text);
            Checker.TextContain(text, abc);

            // to avoid overflows
            intKey %= abc.Length;

            if (!encrypt)
            {
                intKey *= -1;
            }

            // otherwise invalid index
            if (intKey < 0)
            {
                intKey += abc.Length;
            }

            var result = "";

            foreach (var ch in text)
            {
                for (var j = 0; j < abc.Length; j++)
                {
                    if (ch == abc[j])
                    {
                        var temp = (j + intKey) % abc.Length;
                        result += abc[temp];
                        break;
                    }
                }
            }
            return(result);
        }
Exemplo n.º 8
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);
        }