예제 #1
0
        public mpz_t Multiply(mpz_t a, mpz_t b, PaillierKey key)
        {
            var nsquare = key.N * key.N;
            var res     = (a * b) % nsquare;

            return(res);
        }
예제 #2
0
        public mpz_t DecryptNumber(mpz_t encryptedNumber, PaillierKey key)
        {
            var nsquare = key.N * key.N;
            var m       = encryptedNumber.PowerMod(key.Lambda, nsquare).Subtract(1).Divide(key.N).Multiply(key.Mu).Mod(key.N);

            return(m);
        }
예제 #3
0
        public mpz_t EncryptNumber(int number, PaillierKey key)
        {
            mpz_t r   = RandomZStarN(key.N);
            var   nsq = key.N * key.N;

            // c = g^m * r^n mod n^2
            return((key.G.PowerMod(number, nsq).Multiply(r.PowerMod(key.N, nsq))).Mod(nsq));
        }
예제 #4
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);
        }