예제 #1
0
        public string Decode(WordAndKey <string> element)
        {
            var numberLitera = Converter.ConvertWordToCode(element.Word); // перевод слова в код
            var keyLitera    = Converter.ConvertWordToCode(element.Key);  // перевод ключа в код
            var result       = new int[element.Word.Length];
            var k            = 0;

            for (var i = 0; i < numberLitera.Count; i++)
            {
                if (i < keyLitera.Count)//Первая итерация
                {
                    result[i] = (numberLitera[i] - keyLitera[i]) % Languege.z;
                }
                else //Последующие итерации
                {
                    result[i] = (numberLitera[i] - result[k]) % Languege.z;
                    k++;
                }
            }
            foreach (var el in result)
            {
                element.Encoded = FindValue.Findvalue(el).ToString();
            }
            return(element.Encoded);
        }
예제 #2
0
        public string Code(WordAndKey <string> element)
        {
            var numberLitera = Converter.ConvertWordToCode(element.Word); // перевод слова в код
            var keyLitera    = Converter.ConvertWordToCode(element.Key);  // перевод ключа в код
            var result       = new int[element.Word.Length];
            int k            = 0;
            int line         = numberLitera.Count;

            for (int j = k; j < line; j++)
            {
                if (j < keyLitera.Count)//Первая итерация
                {
                    result[j] = (numberLitera[j] + keyLitera[j]) % Languege.z;
                }
                else //Последующие циклы
                {
                    result[j] = (numberLitera[j] + numberLitera[k]) % Languege.z;
                    k++;
                }
            }
            foreach (var el in result)
            {
                element.Encoded = FindValue.Findvalue(el).ToString();
            }
            return(element.Encoded);
        }
예제 #3
0
        public string Code(WordAndKey <List <Matrix <double> > > element, List <int> sequence)
        {
            var numberLitera = Converter.ConvertWordToCode(element.Word);
            var n            = element.Key[0].ToArray().GetLength(0);

            while (numberLitera.Count % n != 0)
            {
                numberLitera.Add(0);
            }
            var start = 0;

            for (var i = n; i <= numberLitera.Count; i += n)
            {
                var dinamicMatrix = Generate.ModifiedHillMatrix(sequence, n);
                var buff          = new double[i - start, 1];
                for (var j = 0; j < i - start; j++)//разделение массива на блоки длинны n
                {
                    buff[j, 0] = numberLitera[start + j];
                }
                var matrix = Matrix <double> .Build.DenseOfArray(buff);

                //var inverseMatrix = InverseMatrix.Inverse_Matrix(element.Key[0]); это в декодирование?
                matrix = dinamicMatrix[0] * element.Key[0] * matrix + dinamicMatrix[1];
                element.Key.Add(dinamicMatrix[0]); //данные элементы необходимы для дешифрования. иначе расшифровать шифр будет невозможно
                element.Key.Add(dinamicMatrix[1]); //их индексы в списке ключей будут начинаться с 2. 0-квадратная матрица, 1-базовый вектор столбец.
                for (var t = 0; t < matrix.RowCount; t++)
                {
                    element.Encoded = Convert.ToString(FindValue.Findvalue(Convert.ToInt32(matrix[t, 0] % Languege.z)));
                }
                start = i;
            }
            element.Key.RemoveRange(0, 2);
            return(element.Encoded);
        }
예제 #4
0
        public string Decode(WordAndKey <List <Matrix <double> > > element)
        {
            var keyPosition  = 0;
            var numberLitera = Converter.ConvertWordToCode(element.Word);
            var n            = element.Key[0].ToArray().GetLength(0);
            var start        = 0;

            for (var i = n; i <= numberLitera.Count; i += n)
            {
                var buff = new double[i - start, 1];
                for (var j = 0; j < i - start; j++)//разделение массива на блоки длинны n
                {
                    buff[j, 0] = numberLitera[start + j];
                }
                var matrix = Matrix <double> .Build.DenseOfArray(buff);

                var inverse = InverseMatrix.Normalization(element.Key[keyPosition++ % element.Key.Count].Inverse());
                matrix = inverse * (matrix - element.Key[keyPosition++ % element.Key.Count]);
                for (var t = 0; t < matrix.RowCount; t++)
                {
                    element.Encoded = Convert.ToString(FindValue.Findvalue(Convert.ToInt32(matrix[t, 0]) % Languege.z));
                }
                start = i;
            }
            return(element.Encoded);
        }
예제 #5
0
        public string Code(WordAndKey <List <Matrix <double> > > element)
        {
            if (element.Key[0].Determinant() == 0)
            {
                element.Encoded = "-1";
                return(element.Encoded);
            }
            var numberLitera = Converter.ConvertWordToCode(element.Word);
            var n            = element.Key[0].ToArray().GetLength(0);

            while (numberLitera.Count % n != 0)
            {
                numberLitera.Add(0);
            }
            var start = 0;

            for (var i = n; i <= numberLitera.Count; i += n)
            {
                var buff = new double[i - start, 1];
                for (var j = 0; j < i - start; j++)//разделение массива на блоки длинны n
                {
                    buff[j, 0] = numberLitera[start + j];
                }
                var matrix = Matrix <double> .Build.DenseOfArray(buff);

                matrix = element.Key[0] * matrix + element.Key[1];
                for (var t = 0; t < matrix.RowCount; t++)
                {
                    element.Encoded = Convert.ToString(FindValue.Findvalue(Convert.ToInt32(matrix[t, 0] % Languege.z)));
                }
                start = i;
            }
            return(element.Encoded);
        }
예제 #6
0
        public string Decode(WordAndKey <int[, ]> element)
        {
            var delta        = 0;
            var numberLitera = Converter.ConvertWordToCode(element.Word);
            var keyLength    = element.Key.GetLength(1);

            if (numberLitera.Count % keyLength != 0)
            {
                delta = 1;
            }
            var array = new double[numberLitera.Count / keyLength + delta, keyLength];
            var count = 0;

            for (var x = 0; x < keyLength; x++)
            {
                for (var y = 0; y < numberLitera.Count / keyLength; y++)
                {
                    array[y, x] = numberLitera[count];
                    count++;
                }
            }

            if (count < numberLitera.Count)
            {
                for (var x = 0; x < numberLitera.Count - count; x++)
                {
                    array[x, (numberLitera.Count / keyLength)] = numberLitera[count + x];
                }
            }

            var matrixArray = Matrix <double> .Build.DenseOfArray(array);

            var ansverMatrix = DenseMatrix.Create((numberLitera.Count / keyLength) + delta, keyLength, 0);

            for (var start = 0; start < keyLength; start++)
            {
                var column = matrixArray.Column(element.Key[1, start]);
                ansverMatrix.SetColumn(element.Key[0, start], column.ToArray());
            }
            for (var y = 0; y < (numberLitera.Count / keyLength) + delta; y++)
            {
                for (var x = 0; x < keyLength; x++)
                {
                    element.Encoded = Convert.ToString(FindValue.Findvalue(Convert.ToInt32(ansverMatrix[y, x]) % Languege.z));
                }
            }
            return(element.Encoded);
        }
예제 #7
0
        public string Decode(WordAndKey <string> element)
        {
            var numberLitera = Converter.ConvertWordToCode(element.Word);
            var keyLitera    = new int[element.Word.Length];

            for (int i = 0; i < keyLitera.Length; i++)
            {
                keyLitera[i] = Languege.dictionary[element.Key.ToUpper()[i % element.Key.Length]];
            }
            string result = "";

            for (int i = 0; i < numberLitera.Count; i++)
            {
                var dec = (numberLitera[i] - keyLitera[i]) % Languege.z;
                result += Convert.ToString(FindValue.Findvalue(dec));
            }
            element.Encoded = result;
            return(element.Encoded);
        }
예제 #8
0
        public string Decode(WordAndKey <int[, ]> element)
        {
            var numberLitera = Converter.ConvertWordToCode(element.Word);//TODO: может стоит объединить это в отдельный статический класс?
            var keyLitera    = new LimitedSizeStack <int>(element.Key.GetLength(1));

            for (var i = 0; i < element.Key.GetLength(1); i++)
            {
                keyLitera.Push(element.Key[1, i]);
            }
            foreach (var nL in numberLitera)
            {
                element.Encoded = Convert.ToString(FindValue.Findvalue((nL - keyLitera.PopFirst()) % Languege.z));
                if (keyLitera.Count == 0)
                {
                    Generate.sequence(element.Key, keyLitera);
                }
            }
            return(element.Encoded);
        }
예제 #9
0
        public string Code(WordAndKey <int[, ]> element)//TODO: понять, как реализовать в других системах исчисления
        {
            var numberLitera = Converter.ConvertWordToCode(element.Word);
            var keyLitera    = new LimitedSizeStack <int>(element.Key.GetLength(1));

            for (var i = 0; i < element.Key.GetLength(1); i++)
            {
                keyLitera.Push(element.Key[1, i]);
            }
            foreach (var nL in numberLitera)
            {
                element.Encoded = Convert.ToString(FindValue.Findvalue((nL + keyLitera.PopFirst()) % Languege.z));
                if (keyLitera.Count == 0)
                {
                    Generate.sequence(element.Key, keyLitera);
                }
            }
            return(element.Encoded);
        }
예제 #10
0
        public string Code(WordAndKey <string> element)
        {
            var numberLitera = Converter.ConvertWordToCode(element.Word);
            var keyLitera    = new int[element.Word.Length];

            //Создает массив по ключу. Циклически записывает ключ в строку длинны кодируемого слова
            for (int i = 0; i < keyLitera.Length; i++)
            {
                keyLitera[i] = Languege.dictionary[element.Key.ToUpper()[i % element.Key.Length]];
            }
            string result = "";

            //Шифрование слова.
            //Коды слов последовательно суммируются и высчитывается новое значение буквы в кольце выбранного алфавита
            for (int i = 0; i < numberLitera.Count; i++)
            {
                result += Convert.ToString(FindValue.Findvalue((numberLitera[i] + keyLitera[i]) % Languege.z));
            }
            element.Encoded = result;
            return(element.Encoded);
        }