Exemplo n.º 1
0
        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");
        }
Exemplo n.º 2
0
        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");
        }
Exemplo n.º 3
0
        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");
        }