Beispiel #1
0
        }                           //число которое расшифровали.

        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);
            }
        }
Beispiel #2
0
        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;
            }
        }