示例#1
0
 static public void EnterX()
 {
     do
     {
         PrintLog($"Введите x (x < {p}): ", false);
         x = Convert.ToInt32(Console.ReadLine());
     }while (!(ELGAmal.IsPrimeNumber(x) && (x < p)));
 }
示例#2
0
 static public void EnterG()
 {
     do
     {
         PrintLog($"Введите g (g < {p}): ", false);
         g = Convert.ToInt32(Console.ReadLine());
     }while (!(ELGAmal.IsPrimeNumber(g) && (g < p)));
 }
示例#3
0
        static public void FindSecondPart()
        {
            b = new long[Program.NumberEncrypt.Length];
            ELGAmal.extendedGCD(k, p - 1, out long t1, out long t2, out long d);
            for (int i = 0; i < b.Length; i++)
            {
                long firstPart  = t1 + p - 1;
                long secondPart = ELGAmal.Mod(Program.NumberEncrypt[i] + 1 - x * a, p - 1);
                //Console.WriteLine(firstPart + " " + secondPart);

                b[i] = ELGAmal.Mod(firstPart * secondPart, p - 1);

                //Console.WriteLine(b[i]);
            }
            PrintB(b);
        }
示例#4
0
        static public void verificationOfDigitalSignature(long a, long[] b, long[] NumberEncrypt)
        {
            long[] LeftPart  = new long[b.Length]; //Левая часть
            long[] RightPart = new long[b.Length]; //Правая часть

            PrintLog("Левая часть: ", false);
            for (int i = 0; i < b.Length; i++)
            {
                RightPart[i] = (long)ELGAmal.reSquaring(KeyAbonentG, NumberEncrypt[i], KeyAbonentP);
                Console.Write(RightPart[i] + " ");
            }
            Console.WriteLine();

            PrintLog("Правая часть: ", false);
            for (int i = 0; i < b.Length; i++)
            {
                long temp = (long)(ELGAmal.reSquaring(KeyAbonentY, a, KeyAbonentP) * ELGAmal.reSquaring(a, b[i], KeyAbonentP));
                LeftPart[i] = ELGAmal.Mod(temp, KeyAbonentP);
                Console.Write(RightPart[i] + " ");
            }
            Console.WriteLine("\nПроверка показала идентичность ЭЦП и открытой подписи!");
        }
示例#5
0
        static void Main(string[] args)
        {
            Console.WriteLine("=====================================================================================================================");
            A_Abonent.PrintLog($"ИСходное сообщение: {text}", true);

            //Этап 1
            A_Abonent.SetP(p);            //Абонент А выбирает Р
            A_Abonent.EnterG();           //Абонент А вводит G
            A_Abonent.EnterX();           //Абонент A вводит Х
            A_Abonent.CalculateY();       //Высчитываем Y
            A_Abonent.PrintOpenKeys();    //Вывод открытых ключей
            A_Abonent.PrintPrivateKeys(); //Вывод закрытых ключей
            A_Abonent.SendOpenKeys();     //Отправляем абоненту B открытый ключ
            //Этап 2
            NumberEncrypt = ELGAmal.TextToNumberEncrypt(text);
            ELGAmal.PrintNumberEncrypt(NumberEncrypt, true);

            //Этап 3
            A_Abonent.SignatureGeneration();//Генерация ЭЦП

            //Этап 4
            B_Abonent.verificationOfDigitalSignature(A_Abonent.a, A_Abonent.b, NumberEncrypt);
            Console.WriteLine("=====================================================================================================================");
        }
示例#6
0
 static public bool isNormalE(long e)
 {
     return((ELGAmal.GCD(k, p - 1) == 1) ? true : false);
 }
示例#7
0
 static public void CalculateY()
 {
     y = (long)ELGAmal.reSquaring(g, x, p);
 }
示例#8
0
 static public void FindFirstPart()
 {
     a = (long)ELGAmal.reSquaring(g, k, p);
     PrintLog($"а = {a}", false);
 }