Exemplo n.º 1
0
        public static Keys GenerateRSAKeys(BigInt E, short Size, int Rounds = 20, bool CheckPreConditions = false)
        {
            Keys   Keys = new Keys();
            Random Rand = new Random();
            BigInt N    = new BigInt(E.Size, 0);
            BigInt phiN = new BigInt(E.Size, 0);
            // Generate p a Prime Number of Size
            BigInt p          = new BigInt(E.Size, 0);
            BigInt q          = new BigInt(E.Size, 0);
            bool   Done       = false;
            int    DiffPQSize = 0;

            while (!Done)
            {
                p.GenPseudoPrime(Size, Rounds, Rand);
                do
                {
                    q.GenPseudoPrime(Size, Rounds, Rand);
                    DiffPQSize = p.BitsCount() - q.BitsCount();
                } while (p == q || (Math.Abs(DiffPQSize) > 30 && CheckPreConditions));
                phiN = (p - 1) * (q - 1);

                if (BigInt.Egc(E, phiN) == 1)
                {
                    Done = true;
                    N    = p * q;
                }
                else
                {
                    p.Clear();
                    q.Clear();
                }
            }

            BigInt D = E.ModInverse(phiN);

            Keys.PublicKey  = new PublicKey(N, E);
            Keys.PrivateKey = new PrivateKey(N, D, p, q);

            return(Keys);
        }