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); }
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); }
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)); }
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); }