} //число которое расшифровали. public RSA(long p, long q, long x) { try { if (!Supporting.Simple(p) || !Supporting.Simple(q)) { throw new Exception("p и q обязаны быть простыми для метода RSA"); } this.p = p; this.q = q; n = p * q; fi = (p - 1) * (q - 1); e = Supporting.GetMutuallySimple(fi); d = Supporting.ResolveModuleEquation(1, n - 1, e, fi, 1); if (!(0 < x && x < n)) { throw new Exception("x должен быть больше нуля и меньше n"); } this.x = x; C = Supporting.bin_pow(x, e, n); if (!(0 < C && C < n)) { throw new Exception("C должен быть больше нуля и меньше n"); } X = Supporting.bin_pow(C, d, n); } catch (Exception exception) { Console.WriteLine(exception); } }
public ElGamaleSignature(long p, long g, long x, long K, long message) { sk = new SecretKey(x, p); //Secret key: (x) pk = new PublicKey(p, g, sk); //Public key: (p,g,y) M = message; if (K == 0) { while (!Supporting.MutuallySimple(k, p - 1)) { k = r.Next(1, (int)p - 1); } } else { k = K; if (!(1 < k && k < p - 1) && !Supporting.MutuallySimple(k, p - 1)) { throw new Exception("k - сессионный ключ обязан придерживаться условия 1<k<p-1"); } } ReverseK = Supporting.ResolveModuleEquation(1, p - 1, k, p - 1, 1); //Поиск к^-1 через уравнение k*k^-1 mod (p-1) = 1 A = Supporting.bin_pow(g, k, p); B = ((M - x * A) * ReverseK) % (p - 1); //цифровая подпись из чисел A и B, if (B < 0) { B += p - 1; } // проверка подлинности подписи ANumber1 = (Supporting.bin_pow(pk.y, A, p) * Supporting.bin_pow(A, B, p)) % p; ANumber2 = Supporting.bin_pow(g, M, p); if (ANumber1 == ANumber2) { Аuthenticity = true; } else { Аuthenticity = false; } }