static public void EnterX() { do { PrintLog($"Введите x (x < {p}): ", false); x = Convert.ToInt32(Console.ReadLine()); }while (!(ELGAmal.IsPrimeNumber(x) && (x < p))); }
static public void EnterG() { do { PrintLog($"Введите g (g < {p}): ", false); g = Convert.ToInt32(Console.ReadLine()); }while (!(ELGAmal.IsPrimeNumber(g) && (g < p))); }
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); }
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Проверка показала идентичность ЭЦП и открытой подписи!"); }
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("====================================================================================================================="); }
static public bool isNormalE(long e) { return((ELGAmal.GCD(k, p - 1) == 1) ? true : false); }
static public void CalculateY() { y = (long)ELGAmal.reSquaring(g, x, p); }
static public void FindFirstPart() { a = (long)ELGAmal.reSquaring(g, k, p); PrintLog($"а = {a}", false); }