static void Main(string[] args) { switch (args[0]) { case "encrypt": BigInteger plain = new BigInteger.Parse(args[1]); BigInteger p = BigInteger.Parse(args[2]); BigInteger q = BigInteger.Parse(args[3]); BigInteger e = BigInteger.Parse(args[4]); BigInteger N = BigInteger.Multiply(p, q); Console.WriteLine(BigInteger.ModPow(plain, e, N)); break; case "decrypt": BigInteger cipher = new BigInteger.Parse(args[1]); BigInteger p = BigInteger.Parse(args[2]); BigInteger q = BigInteger.Parse(args[3]); BigInteger d = BigInteger.Parse(args[4]); BigInteger phi_N = BigInteger.Multiply(p - 1, q - 1); Console.WriteLine(BigInteger.ModPow(plain, d, phi_N)); break; case "findKeyPair": BigInteger p = BigInteger.Parse(args[1]); BigInteger q = BigInteger.Parse(args[2]); BigInteger key = BigInteger(args[3]); BigInteger N = BigInteger.Multiply(p, q); Console.WriteLine(ExtendedEuclideanAlgorithm(key, N)) break; default: Console.WriteLine('Only valid commands:'); Console.WriteLine('dotnet run encrypt {plaintext in base 10} {prime 1} {prime 2} {key}'); Console.WriteLine('dotnet run decrypt {cipher in base 10} {prime 1} {prime 2} {key}'); Console.WriteLine('dotnet run findKeyPair {prime 1} {prime 2} {key}'); break; } }
statistics.Permutations = GetPermutations( BigInteger.Parse(result.Characters.Length.ToString()),