예제 #1
0
        private void button1_Click(object sender, EventArgs e)
        {
            long[]   V;
            double[] S;
            long     N;

            ZEROPROOF.GenerateKeys(out V, out S, out N);
            var Tmpstr = "";

            foreach (var a in V)
            {
                Tmpstr += a.ToString() + " ";
            }
            textBoxAN.Text = Convert.ToString(N);
            textBoxAV.Text = Convert.ToString(Tmpstr);
            textBoxBN.Text = Convert.ToString(N);
            textBoxBV.Text = Convert.ToString(Tmpstr);
            Tmpstr         = "";
            foreach (var a in S)
            {
                Tmpstr += a.ToString() + " ";
            }
            textBoxAS.Text = Convert.ToString(Tmpstr);
        }
예제 #2
0
        private void buttonIdentif_Click(object sender, EventArgs e)
        {
            textBoxLog.Clear();
            textBoxLog.AppendText("=====================" + Environment.NewLine);
            textBoxLog.AppendText("Начало проверки" + Environment.NewLine);
            textBoxLog.AppendText("=====================" + Environment.NewLine);
            var Rnd   = new Random();
            var Proof = true;

            var AN     = Convert.ToInt64(textBoxAN.Text);
            var TmpStr = textBoxAS.Text.Split(' ');
            var AS     = new List <int>();

            foreach (var s in TmpStr)
            {
                if (s != "")
                {
                    AS.Add(Convert.ToInt32(s));
                }
            }
            var BN = Convert.ToInt64(textBoxBN.Text);

            TmpStr = textBoxBV.Text.Split(' ');
            var BV = new List <long>();

            foreach (var s in TmpStr)
            {
                if (s != "")
                {
                    BV.Add(Convert.ToInt32(s));
                }
            }

            var NeBudetPovtornoR = new HashSet <int>();

            textBoxLog.AppendText("---------------------" + Environment.NewLine);
            textBoxLog.AppendText("Сторона А(доказывает)" + Environment.NewLine);
            textBoxLog.AppendText("---------------------" + Environment.NewLine);
            var AXMass = new List <long>();
            var ARMass = new List <long>();

            for (var i = 0; i < AS.Count; i++)
            {
                var AR = 0;
                do
                {
                    AR = Rnd.Next(1, (int)AN);
                }while (NeBudetPovtornoR.Contains(AR));
                NeBudetPovtornoR.Add(AR);
                textBoxLog.AppendText("Случайное R = " + Convert.ToString(AR) + Environment.NewLine);
                var AX = ZEROPROOF.FastPowFunc(AR, 2, AN);
                AXMass.Add(AX);
                ARMass.Add(AR);
                textBoxLog.AppendText("X = " + Convert.ToString(AX) + Environment.NewLine);
            }
            textBoxLog.AppendText("Отправка X стороне B" + Environment.NewLine);

            //---------------------------------------------

            textBoxLog.AppendText("---------------------" + Environment.NewLine);
            textBoxLog.AppendText("Сторона B(проверяет)" + Environment.NewLine);
            textBoxLog.AppendText("---------------------" + Environment.NewLine);

            textBoxLog.AppendText("Получение X от стороны A" + Environment.NewLine);
            var BX = AXMass;

            foreach (var X in BX)
            {
                textBoxLog.AppendText("X = " + Convert.ToString(X) + Environment.NewLine);
            }
            var BbArr = new List <int>();

            for (var i = 0; i < AS.Count; i++)
            {
                var Bb = Rnd.Next(0, 2);
                BbArr.Add(Bb);
                textBoxLog.AppendText("Случайный бит b = " + Convert.ToString(Bb) + Environment.NewLine);
            }
            textBoxLog.AppendText("Отправка b стороне A" + Environment.NewLine);

            //---------------------------------------------

            textBoxLog.AppendText("---------------------" + Environment.NewLine);
            textBoxLog.AppendText("Сторона А(доказывает)" + Environment.NewLine);
            textBoxLog.AppendText("---------------------" + Environment.NewLine);

            textBoxLog.AppendText("Получение b от стороны B" + Environment.NewLine);
            var Ab = BbArr;

            foreach (var B in Ab)
            {
                textBoxLog.AppendText("b = " + Convert.ToString(B) + Environment.NewLine);
            }
            var Otpravka = new List <long>();

            for (var i = 0; i < AS.Count; i++)
            {
                long AY = 0;
                if (Ab[i] == 0)
                {
                    textBoxLog.AppendText("Отправка R стороне B" + Environment.NewLine);
                    Otpravka.Add(ARMass[i]);
                }
                else
                {
                    AY = ARMass[i] * AS[i] % AN;
                    textBoxLog.AppendText("Y = " + Convert.ToString(AY) + Environment.NewLine);
                    textBoxLog.AppendText("Отправка Y стороне B" + Environment.NewLine);
                    Otpravka.Add(AY);
                }
            }
            //---------------------------------------------

            textBoxLog.AppendText("---------------------" + Environment.NewLine);
            textBoxLog.AppendText("Сторона B(проверяет)" + Environment.NewLine);
            textBoxLog.AppendText("---------------------" + Environment.NewLine);
            for (var i = 0; i < AS.Count; i++)
            {
                if (BbArr[i] == 0)
                {
                    textBoxLog.AppendText("Получение R от стороны A" + Environment.NewLine);
                    var BR = Otpravka[i];
                    textBoxLog.AppendText("R = " + Convert.ToString(BR) + Environment.NewLine);
                    textBoxLog.AppendText("Вычисленный X = " + Convert.ToString(ZEROPROOF.FastPowFunc(BR, 2, BN)) + Environment.NewLine);
                    textBoxLog.AppendText("Полученный X = " + Convert.ToString(BX) + Environment.NewLine);
                    if (BX[i] == ZEROPROOF.FastPowFunc(BR, 2, BN))
                    {
                        textBoxLog.AppendText("Сторона A знает sqrt(X)" + Environment.NewLine);
                    }
                    else
                    {
                        textBoxLog.AppendText("Сторона A не знает sqrt(X). Сторона A не является подлинной!" + Environment.NewLine);
                        Proof = false;
                        break;
                    }
                }
                else
                {
                    textBoxLog.AppendText("Получение Y от стороны A" + Environment.NewLine);
                    var BY = Otpravka[i];
                    textBoxLog.AppendText("Y = " + Convert.ToString(BY) + Environment.NewLine);
                    textBoxLog.AppendText("Вычисленный X = " + (BigInteger.Pow(BY, 2) * BV[i] % BN).ToString() + Environment.NewLine);
                    textBoxLog.AppendText("Полученный X = " + Convert.ToString(BX) + Environment.NewLine);
                    if (BX[i] == Convert.ToInt64((BigInteger.Pow(BY, 2) * BV[i] % BN).ToString()))
                    {
                        textBoxLog.AppendText("Сторона A знает sqrt(V-1)" + Environment.NewLine);
                    }
                    else
                    {
                        textBoxLog.AppendText("Сторона A не знает sqrt(V-1). Сторона A не является подлинной!" + Environment.NewLine);
                        Proof = false;
                        break;
                    }
                }
                if (!Proof)
                {
                    break;
                }
            }
            if (Proof)
            {
                textBoxLog.AppendText("Сторона A идентифицирована!" + Environment.NewLine);
            }
            else
            {
                textBoxLog.AppendText("Сторона A не идентифицирована!" + Environment.NewLine);
            }
        }