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"); }
public override string ToString() { string output; Supporting.gnd(k, p - 1, out output); return($"Выберем числа p={p} и g={g}(примитивный элемент) и случайный секретный ключ x={x}\n" + $"Вычислим значение открытого ключа y = g^x mod p = {g}^{x} mod {p} ={Y}\n" + $"Открытый ключ (p={p},g={g},y={Y})\n" + $"Пусть текст M = {m},которое надо зашифровать.\n" + $"Выберем случайное число k = {k}. Убедимся,что НОД(k,p-1)=1\n" + $"{output}\n" + $"если НОД = 1, то действительно НОД({k},{p-1})=1\n" + $"Вычисляем пару чисел (a,b)\n" + $"a=g^k mod p = {A},\n" + $"b=y^k*M mod p = {B},\n" + $"Получили пару чисел (a,b)=({A},{B}), которая и есть зашифрованный текст.\n" + $"\n" + $"Выполним расшифрование этого шифр-текста\n" + $"M = b/a^x mod p = ((b mod p)*(a^-x mod p)) mod p =({B} mod {p})({A}^(-{x}) mod {p})=(({(B % p)})*({Supporting.divide_pow(A, x, p)})) mod {p}={DecodeM}\n"); }
public override string ToString() { string output; Supporting.gnd(k, pk.p - 1, out output); return($"Выберем числа p={pk.p} и g={pk.g}(примитивный элемент) и случайный секретный ключ x={sk.x}\n" + $"Вычислим значение открытого ключа y = g^x mod p = {pk.g}^{sk.x} mod {pk.p} ={pk.y}\n" + $"Вычислим цифровую подпись для сообщения M = {M}\n" + $" 1)Сначала выберем случайное число k = {k}, 1<k<p-1, такое, что числа k и p-1 взаимно простые - {Supporting.MutuallySimple(k, pk.p - 1)}\n" + $" |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n" + $" Проверка на взаимную простоту чисел k и p-1 ,т.е убедимся ,что НОД(k,p-1)=1\n {output}\n" + $" Если НОД = 1, то действительно НОД({k},{pk.p-1})=1 \n" + $" |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n" + $"1.1)Найдём число k^-1 такое что выполняется условие k*k^(-1) = 1 mod(p-1) т.е {k}*{k}^(-1) = 1 mod {pk.p - 1} | k^-1 = {ReverseK} \n" + $" 2)Вычислить числа a = g^k mod p = {pk.g}^{k} mod {pk.p} = {A}, и с помощью секретного ключа x вычислим b = (M-xa)k^-1 mod (p-1)={B}\n" + $"Тем самым цифровая подпись представляет собой пару чисел: a = {A}, b = {B}..\n" + $" 3)Проверим подпись. Приняв сообщение M = {M} и цифровую подпись (a = {A} и b = {B})\n" + $"Получатель вычисляет два числа 1)(y^a)*(a^b) mod p = {ANumber1}\n " + $"И 2) g^M mod p = {ANumber2}\n" + $"Проверим они равны? - {Аuthenticity}\n" + "Если два числа равны , то принятое получателем сообщение признается подлинным , иначе сообщение фальшивое или цифровая подпись не подлинная\n"); }