Пример #1
0
        /// <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();
        }
Пример #2
0
        /// <summary>
        /// Обработчик события "Нажатие на кнопку "Назад"".
        /// </summary>
        private void ReturnButton_Click(object sender, RoutedEventArgs e)
        {
            PolyDisplayWindow win = new PolyDisplayWindow()
            {
                Top  = Top,
                Left = Left
            };

            win.Show();
            Close();
        }
Пример #3
0
        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;
        }