/// <summary> /// Функция генерирует два случайных числа a и b меньше P, возвращает true в случае подлинности подписи /// </summary> /// <param name="P">Опубликованное простое число</param> /// <param name="G">Порождающий элемент</param> /// <param name="X">Закрытый ключ</param> /// <param name="Z">Подписанное сообщение</param> /// <param name="M">Неподписанное сообщение</param> /// <returns></returns> static bool Bob(BigInteger P, BigInteger G, BigInteger X, BigInteger Z, BigInteger M) { BigInteger A = BigIntegerRandom.GenerateRandom(0, P, new Random()); Thread.Sleep(5); BigInteger B = BigIntegerRandom.GenerateRandom(0, P, new Random()); BigInteger C = (BigInteger.ModPow(BigInteger.ModPow(Z, A, P) * BigInteger.ModPow(G, X * B, P), 1, P)); BigInteger D_Bob = BigInteger.ModPow(BigInteger.ModPow(M, A, P) * BigInteger.ModPow(G, B, P), 1, P); BigInteger D_Alice = Alice(C, P, X); return(D_Alice == D_Bob); }