/// <summary> /// Метод запускает режим работы с многочленами /// </summary> private void HandlePolynomialMode(string inputString) { PolynomialLibrary.Data.CreateCodes(inputString); // Заполним таблицу кодировки PolynomialLibrary.Data.FieldOfCryptosystem = new Field(inputString); // Создание общего поля на время выполнения всей программы AliceAccount = new Account(); BobAccount = new Account(); // Требуется разбиение исходного многочлена на несколько составляющих for (int i = 0; i < inputString.Length / 5 + CheckDivisionBy5(inputString.Length); i++) { int size = 5; if (inputString.Length - i * 5 < 5) { size = inputString.Length - i * 5; } AliceAccount.CreateMessage(inputString.Substring(i * 5, size)); // Создается сообщение у Алисы AliceAccount.TransportTo(BobAccount); } PolyDisplayWindow win2 = new PolyDisplayWindow() { Top = Top, Left = Left }; win2.Show(); Close(); }
/// <summary> /// Обработчик события "Нажатие на кнопку "Назад"". /// </summary> private void ReturnButton_Click(object sender, RoutedEventArgs e) { PolyDisplayWindow win = new PolyDisplayWindow() { Top = Top, Left = Left }; win.Show(); Close(); }
public PolyCipherWindow(Account A, Account B) { Alice = A; Bob = B; collection = new ObservableCollection <Item>(); // Вспомогательный класс, хранящий в себе формулы, которые необходимы отобразить ContextDataCipherWindow cd = new ContextDataCipherWindow { A = "a = " + Convert.ToString(Alice.privatePower), B = "b = " + Convert.ToString(Bob.privatePower), Ga = "g^{a}(x) = " + MainWindow.PolynomialToString(Alice.publicPolynomial), Gb = "g^{b}(x) = " + MainWindow.PolynomialToString(Bob.publicPolynomial), GaPower = "g^{a}(x) = " + Alice.MessagePowerPolynomial.Replace("(g)", "g"), GbPower = "g^{b}(x) = " + Bob.MessagePowerPolynomial.Replace("(g)", "g"), Gab = "g^{ab}(x) = " + MainWindow.PolynomialToString(Data.Modulus(Polynomial.Power(Alice.publicPolynomial, Bob.privatePower, Data.FieldOfCryptosystem.Order), Data.FieldOfCryptosystem.Modulus, Data.FieldOfCryptosystem.Order)) }; InitializeComponent(); DGrid.ItemsSource = collection; foreach (KeyValuePair <char, int> pr in Data.codesOfSymbols) { collection.Add(new Item { Symbol = Convert.ToString(pr.Key), Code = Convert.ToString(pr.Value) }); } // Теперь необходимо вывести необходимые операции для возведения многочлена в степень List <int> AlicePowers = new List <int>(); // Эти степени необходимы, т.к. именно они вычисляются //в методе быстрого возведения в квадрат int a = Alice.privatePower; while (a > 0) { AlicePowers.Add(a); a /= 2; } AlicePowers.Reverse(); Polynomial g = Data.FieldOfCryptosystem.OpenPolynomial; int order = Data.FieldOfCryptosystem.Order; MainWindow.HandleMargin(AliceStackPanel, 15); MainWindow.HandleMargin(BobStackPanel, 15); try { for (int i = 0; i < AlicePowers.Count; i++) { string p = FormPrefix(AlicePowers[i]); string pres = MainWindow.PolynomialToString(Alice.BasicPowers[i]); if (AlicePowers[i] % 2 == 0 && AlicePowers[i] != 1) // Нужно сформировать конкретное выражение для вычисления { p += $" = (({pres})*({pres})) mod ({MainWindow.PolynomialToString(Data.FieldOfCryptosystem.Modulus)}) = "; } else if (AlicePowers[i] != 1) { p += $" = (({MainWindow.PolynomialToString(g)})*({pres})^{{2}}) mod ({MainWindow.PolynomialToString(Data.FieldOfCryptosystem.Modulus)}) = "; } p += MainWindow.PolynomialToString(Bob.BasicPowers[i + 1]); // Добавим в конец результат, чтобы узнать, чему равняется текущая степень Thread.Sleep(300); WpfMath.Controls.FormulaControl f = new WpfMath.Controls.FormulaControl() { Formula = p }; Thread.Sleep(300); MainWindow.AddChildren(AliceStackPanel, f); } List <int> BobPowers = new List <int>(); // Эти степени необходимы, т.к. именно они вычисляются //в методе быстрого возведения в квадрат int b = Bob.privatePower; while (b > 0) { BobPowers.Add(b); b /= 2; } BobPowers.Reverse(); for (int i = 0; i < BobPowers.Count; i++) { string p = FormPrefix(BobPowers[i]); string pres = MainWindow.PolynomialToString(Bob.BasicPowers[i]); if (BobPowers[i] % 2 == 0 && BobPowers[i] != 1) // Нужно сформировать конкретное выражение для вычисления { p += $" = (({pres})*({pres})) mod ({MainWindow.PolynomialToString(Data.FieldOfCryptosystem.Modulus)}) = "; } else if (BobPowers[i] != 1) { p += $" = (({MainWindow.PolynomialToString(g)})*({pres})^{{2}}) mod ({MainWindow.PolynomialToString(Data.FieldOfCryptosystem.Modulus)}) = "; } p += MainWindow.PolynomialToString(Bob.BasicPowers[i + 1]); // Добавим в конец результат, чтобы узнать, чему равняется текущая степень Thread.Sleep(300); WpfMath.Controls.FormulaControl f = new WpfMath.Controls.FormulaControl() { Formula = p }; Thread.Sleep(300); MainWindow.AddChildren(BobStackPanel, f); } } catch (Exception) { PolyDisplayWindow win = new PolyDisplayWindow() { Top = Top, Left = Left }; } DataContext = cd; }