} //число которое расшифровали. 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 Rabin(long p, long q, long x) { long a = 0; long b = 0; long d; try { if (!(Supporting.Simple(p) && Supporting.Simple(q) && p % 4 == 3 && q % 4 == 3)) { throw new Exception("p и q обязаны быть простыми для метода Rabbin ,а также для удобства просчёта p и q по модулю 4 обязаны равняться трём"); } this.p = p; this.q = q; this.x = x; n = p * q; c = Supporting.bin_pow(x, 2, n); //зашифрование r = Supporting.bin_pow(c, (p + 1) / 4, p); s = Supporting.bin_pow(c, (q + 1) / 4, q); Supporting.ResolveDeofantovoEquation(ref a, ref b, p, q, 1); Supporting.extendedEuclid(p, q, out a, out b, out d, out outputExtendEuqlid); this.a = a; this.b = b; m1 = +((a * p * s + b * q * r)) % n; if (m1 < 0) { m1 += n; } m2 = -((a * p * s + b * q * r)) % n; if (m2 < 0) { m2 += n; } m3 = +((a * p * s - b * q * r)) % n; if (m3 < 0) { m3 += n; } m4 = -((a * p * s - b * q * r)) % n; if (m4 < 0) { m4 += n; } } catch (Exception exception) { Console.WriteLine(exception); } }
public override string ToString() { string outputGND; Supporting.gnd(e, fi, out outputGND); return($"p = {p} , q = {q}\n" + $"n=p*q={n}\n" + $"fi(n)=(p-1)(q-1)={fi}\n" + $"Возьмем взаимнопростое число e = {e}\n" + $"Публичный ключ: {PublicKey()}\n" + $"{outputGND}" + $"Из уравнения ed = 1 mod fi(n), получаем d = {d}\n" + $"Приватный ключ: {PrivateKey()}\n" + $"Зашифровываем сообщение x = {x}\n" + $"C = x^e mod n = {C}\n" + $"Расшифруем сообщение и получим обратно x =C^d mod n={X}\n"); }
} // Y = g^y mod n; /// <summary> /// /// </summary> /// <param name="n"></param> /// <param name="g"></param> /// <param name="x"></param> /// <param name="y"></param> /// <exception cref="Exception"></exception> public DiffieHellman(long n, long g, long x, long y) { try { this.n = n; if (!Supporting.Simple(n)) { throw new Exception("N should be simple"); } if (g == 0) { g = Supporting.PrimitivsMultiGroupZ(out string temp, n); } } catch (Exception e) { Console.WriteLine(e); throw; } }