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)); }
//1,3 public static bool Start11(ulong exponent, ref ulong startI, ref mpz_t startS)//3969 { mpz_t mersenneNumber = mpz_t.One.ShiftLeft((int)exponent) - 1, s = startS, e = mpz_t.One.ShiftLeft((int)(exponent - startI)); if (s < mersenneNumber) { startI++; startS *= startS; } return(s.PowerMod(e, mersenneNumber) == mersenneNumber - 3); }
private bool RabinMillerTest(mpz_t r, mpz_t s) { _iterationTested = 0; // // Find D and K so equality is correct: d*2^k = r - 1 // mpz_t d = r - 1; mpz_t k = 0; while (d % 2 == 0) { d = d / 2; k = k + 1; } for (mpz_t j = 1; j <= s; j++) { _iterationTested++; mpz_t a = Generator.Random(2, (r - 1)); mpz_t x = a.PowerMod(d, r);// BigInteger.ModPow(a, d, r); if (x != 1) { for (mpz_t i = 0; i < (k - 1); i++) { if (x == _number - 1) { break; } x = x.PowerMod(2, _number); } if (x != _number - 1) { return(false); } } if (_running == false) { return(false); } } return(true); }