private void ExchangeServer() { BigInteger g; BigInteger n; // Generate random prime numbers for g and n using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(nBitsInKey)) { RSAParameters parameters = rsa.ExportParameters(true); byte[] d = parameters.D; byte[] modulus = parameters.Modulus; if (BitConverter.IsLittleEndian) { Array.Reverse(d); Array.Reverse(modulus); } g = new BigInteger(d, true); n = new BigInteger(modulus, true); } BigInteger a = RandomBigInt(nBitsInKey); BigInteger ang = BigInteger.ModPow(g, a, n); InitKeyShare initKey = new InitKeyShare(n, g, ang); stream.Write(ObjectToByteArray(initKey)); byte[] message = GetMessage(); BigInteger gb = ByteArrayToObject <KeyShare>(message).abgn; byte[] key = BigInteger.ModPow(gb, a, n).ToByteArray(); Array.Copy(key, _Key, _Key.Length); }
private void ExchangeClient() { BigInteger b = RandomBigInt(nBitsInKey); byte[] message = GetMessage(); InitKeyShare initData = ByteArrayToObject <InitKeyShare>(message); BigInteger bgn = BigInteger.ModPow(initData.g, b, initData.n); stream.Write(ObjectToByteArray(new KeyShare(bgn))); byte[] key = BigInteger.ModPow(initData.abgn, b, initData.n).ToByteArray(); Array.Copy(key, _Key, _Key.Length); }