public ActionResult Index(ChaumBlindSignatureModels model)
        {
            if (ModelState.IsValid)
            {
                if (Algorithms.GCD(model.F, model.Ko) != 1)
                {
                    return View("Index");
                }

                List<long> KList = new List<long>();

                // Выбираем все возможные числа k
                for (int i = 2; i < model.N; i++)
                    if (Algorithms.GCD(i, model.N) == 1)
                        KList.Add(i);

                ViewBag.KList = KList;

                ViewBag.Kc = Algorithms.ExtendedGCD(model.Ko, model.F);

                return View("Input", model);
            }

            return View();
        }
        public ActionResult Input(ChaumBlindSignatureModels model)
        {
            long m = 0;
            long inv_k = 0;
            long m1 = 0;
            long s1 = 0;
            long s = 0;

            // Сторона B
            long Kc = Algorithms.ExtendedGCD(model.Ko, model.F);

            // Сторона A
            // вычисление хэша
            for (int i = 0; i < model.Text.ToCharArray().Count(); i++)
            {
                m ^= Algorithms.HornersMethod(model.Text.ToCharArray()[i] - 1040, model.Ko, model.N);
                m %= model.N;
            }

            // находим обратный элемент k
            inv_k = Algorithms.ExtendedGCD(model.k, model.N);

            // Вычисляем замаскированное сообщение
            m1 = Algorithms.HornersMethod(model.k, model.Ko, model.N, m);

            // Сторона B
            s1 = Algorithms.HornersMethod(m1, Kc, model.N);

            // Сторона A
            s = (inv_k * s1) % model.N;

            long mm = Algorithms.HornersMethod(s, model.Ko, model.N);

            ViewBag.Kc = Kc;
            ViewBag.inv_k = inv_k;
            ViewBag.m1 = m1;
            ViewBag.s1 = s1;
            ViewBag.s = s;
            ViewBag.mm = mm;

            return View("Echo", model);
        }