Exemplo n.º 1
0
        /// <summary>
        /// Derives an RSA from a username and password
        /// </summary>
        /// <param name="username">Username</param>
        /// <param name="password">Password</param>
        /// <returns>The derived private and public key</returns>
        internal static RsaKeyPair DeriveRsaKey(byte[] username, byte[] password)
        {
            const int primeSize = RsaPublicKeySize / 2;

            Console.WriteLine("DeriveRsaKey: deriving key...");

            var derived = PBKDF2(password, username, RsaPublicKeySize);
            var one = new byte[primeSize];
            var two = new byte[primeSize];
            Array.Copy(derived, 0, one, 0, primeSize);
            Array.Copy(derived, primeSize, two, 0, primeSize);

            Console.WriteLine("DeriveRsaKey: finding prime 1...");

            var p = new BigInt(one).NextPrimeGMP();
            Console.WriteLine("DeriveRsaKey: finding prime 2...");
            var q = new BigInt(two).NextPrimeGMP();

            Console.WriteLine("DeriveRsaKey: creating key pair...");

            var n = p * q;
            var φn = (p - 1) * (q - 1);
            var e = new BigInt(RsaExponent);
            var d = e.InvertMod(φn);

            Console.WriteLine("DeriveRsaKey: done");

            return new RsaKeyPair(n.ToByteArray(), d.ToByteArray());
        }