Exemple #1
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);
        }
Exemple #2
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));
        }
Exemple #3
0
            //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);
            }
Exemple #4
0
        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);
        }