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