public static string SignatureVerificationGet(long a, long b, long p, long g, long y, long Message) { string resolve = ""; PublicKey publicKey = new PublicKey() { p = p, g = g, y = y }; resolve += $"Решение:" + $"Получен публичный ключ: {publicKey.ToString()}\n" + $"Поступило сообщение M = {Message} и цифровая подпись (a = {a} и b = {b})\n" + $"Получатель вычисляет два числа:\n" + $"1)Number1=(y^a)*(a^b) mod p = (((y^a) mod p)*((a^b) mod p)) mod p." + $"2)Number2=g^M mod p"; // проверка подлинности подписи long ANumber1 = (Supporting.bin_pow(publicKey.y, a, publicKey.p) * Supporting.bin_pow(a, b, publicKey.p)) % publicKey.p; long ANumber2 = Supporting.bin_pow(publicKey.g, Message, publicKey.p); if (ANumber1 == ANumber2) { resolve += $"Т.к Number1=Number2={ANumber1} ,то сообщение является подлинным "; } else { resolve += $"Т.к Number1={ANumber1} и Number2={ANumber2} - они не равны друг друга ,поэтому сообщение является фальшивым или подпись неподлинная "; } return(""); }
} //число которое расшифровали. 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 ElGamale(long p, long g, long X, long K, long Message) { try { if (!Supporting.Simple(p)) { throw new Exception("p should be simple"); } r = new Random(DateTime.Now.Second); if (X == 0) { x = r.Next(1, (int)p); } else { x = X; } this.p = p; this.g = g; Y = Supporting.bin_pow(g, x, p); 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"); } } A = Supporting.bin_pow(g, k, p); B = (Supporting.bin_pow(Y, k, p) * (m % p)) % p; DecodeM = ((B % p) * Supporting.divide_pow(A, x, p)) % p; } catch (Exception e) { Console.WriteLine(e); throw; } }
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; } }
} // y = g^x mod p public PublicKey(long p, long g, SecretKey sk) { try { if (!Supporting.Simple(p)) { throw new Exception("p should be simple"); } this.p = p; if (!(1 < g && g < p)) { throw new Exception("Condition 1<g<p is not met"); } this.g = g; this.y = Supporting.bin_pow(g, sk.x, p); } catch (Exception e) { Console.WriteLine(e); throw; } }