Exemplo n.º 1
0
 public static void dh(NetworkStream s, StreamReader r, StreamWriter w)
 {
     try
     {
         // Diffie hellman key exchange on GF(P)
         // genererate
         byte[]     rand = positive(Convert.FromBase64String(getSalt(128)));
         BigInteger a    = new BigInteger(rand);
         // send g**secret to the server
         BigInteger g_a      = BigInteger.ModPow(G, a, P);
         byte[]     g_a_byte = g_a.ToByteArray().Reverse().ToArray();
         w.WriteLine(base64_encode(g_a_byte));
         w.Flush();
         BigInteger g_b = new BigInteger(positive(Convert.FromBase64String(r.ReadLine()).Reverse().ToArray()));
         // read g_b and compute g_b_a
         // compute g_b_a
         byte[] secret = BigInteger.ModPow(g_b, a, P).ToByteArray().Reverse().ToArray();
         if (secret.Length != 128)
         {
             byte[] temp = new byte[128];
             Array.Copy(secret, 1, temp, 0, 128);
             Array.Copy(temp, secret, 128);
         }
         SHA256Managed sha = new SHA256Managed();
         dh_secret = sha.ComputeHash(secret, 0, 128);
     }
     catch (Exception)
     {
         // DH error
         OtherThread.disconnect();
     }
     // DONE DIFFIE HELLMAN
 }