/// <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()); }