public RSA(BigInt p, BigInt q) { if (p.Sign < 0 || q.Sign < 0) { throw new Exception("Numbers must be positive"); } if (!BigInt.IsItSimple(p) || !BigInt.IsItSimple(q)) { throw new Exception("Numbers must be simple"); } n = p * q; var fi = (p - new BigInt("1")) * (q - new BigInt("1")); e = fi - new BigInt("1"); while (!(BigInt.IsItSimple(e) && BigInt.Gcd(e, fi, out var x, out var y) == new BigInt("1"))) { e -= new BigInt("2"); } d = BigInt.GetInverseElementModulo(e, fi); }