public BigInteger Encrypt(BigInteger m)
        {
            if (this.n == null || this.g == null || this.lambda == null || this.mu == null)
            {
                throw new ArgumentOutOfRangeException("Сгенерируйте ключи, преждем чем шифровать!");
            }

            if (m > n)
            {
                throw new ArgumentOutOfRangeException("m > n, необходимо заново сгенерировать ключи");
            }

            var r    = PailierHelper.GetRandomFromMultRing(this.n);
            var sqrn = BigInteger.Multiply(this.n, this.n);
            var a    = BigInteger.ModPow(this.g, m, sqrn);
            var b    = BigInteger.ModPow(r, this.n, sqrn);
            var c    = BigInteger.Multiply(a, b) % sqrn;

            return(c);
        }
        public void GenerateKey()
        {
            var p = PailierHelper.GeneratePrimeNumber();
            var q = PailierHelper.GeneratePrimeNumber();

            while (PailierHelper.GCD(BigInteger.Multiply(p, q), BigInteger.Multiply(p - 1, q - 1)) != 1 || p == q)
            {
                p = PailierHelper.GeneratePrimeNumber();
                q = PailierHelper.GeneratePrimeNumber();
            }

            this.n      = BigInteger.Multiply(p, q);
            this.lambda = PailierHelper.LCM(p - 1, q - 1);

            this.mu = -1;
            while (this.mu == -1)
            {
                this.g = PailierHelper.GetRandomFromMultRing(BigInteger.Multiply(n, n));

                BigInteger x = BigInteger.ModPow(g, lambda, BigInteger.Multiply(n, n));
                this.mu = PailierHelper.GetInverseElement(BigInteger.Divide(x - 1, n), BigInteger.Multiply(n, n)) % n;
            }
        }