Exemple #1
0
        public PaillierKey GenerateKey()
        {
            var p = new PrimeNumber();
            var q = new PrimeNumber();

            GeneratePrimes(out p, out q);

            // lambda = lcm(p-1, q-1) = (p-1)*(q-1)/gcd(p-1, q-1)
            var lambda = ((p.GetPrimeNumber() - 1) * (q.GetPrimeNumber() - 1)) /
                         mpz_t.Gcd(p.GetPrimeNumber() - 1, q.GetPrimeNumber() - 1);
            var n       = p.GetPrimeNumber() * q.GetPrimeNumber(); // n = p*q
            var nsquare = n * n;                                   // nsquare = n*n

            mpz_t g;

            do
            {
                // generate g, a random integer in Z*_{n^2}
                g = RandomZStarNSquare(nsquare);
            }
            // verify g, the following must hold: gcd(L(g^lambda mod n^2), n) = 1, where L(u) = (u-1)/n
            while (mpz_t.Gcd(g.PowerMod(lambda, nsquare).Subtract(1).Divide(n), n) != 1);

            // mu = (L(g^lambda mod n^2))^{-1} mod n, where L(u) = (u-1)/n
            var mu = g.PowerMod(lambda, nsquare).Subtract(1).Divide(n).InvertMod(n);


            var key = new PaillierKey
            {
                N      = n,
                G      = g,
                Lambda = lambda,
                Mu     = mu
            };

            return(key);
        }