Deserialize, CryptoStream, and NetworkStream
From: Mike (clarksmr_at_yahoo.com)
Date: 02/27/04
- Next message: C P: "Protecting proprietary app data"
- Previous message: turinreza: "RE: Impersonating tokens don't match (get error)"
- Next in thread: Stephen Martin: "Re: Deserialize, CryptoStream, and NetworkStream"
- Reply: Stephen Martin: "Re: Deserialize, CryptoStream, and NetworkStream"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] [ attachment ]
Date: Thu, 26 Feb 2004 19:11:49 -0500
I'm having trouble in C# getting (de)serialization to work over a
CryptoStream attached to a NetworkStream. The issue is that the
Deserialize() call blocks until the stream is closed, rather than just
flushed.
I'd really like to know what I'm doing wrong, so here is a short code
listing that exhibits the problem. Any insights would be greatly
appreciated.
-- Mike
Files in listing: client.cs. server.cs
//----------------------------------------------
// Begin client.cs
//----------------------------------------------
using System;
using System.Net.Sockets;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections;
using System.IO;
using System.Security.Cryptography;
using System.Threading;
class Client
{
static void Main(string[] args)
{
// Initialize all the objects we need.
TcpClient client = new TcpClient("localhost", 8000);
NetworkStream netStream = client.GetStream();
SymmetricAlgorithm crypt = Rijndael.Create();
byte[] Key = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
0x11, 0x12, 0x13, 0x14, 0x15, 0x16};
byte[] IV = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
0x11, 0x12, 0x13, 0x14, 0x15, 0x16};
crypt.Key = Key;
crypt.IV = IV;
BinaryFormatter bf = new BinaryFormatter();
CryptoStream encryptedStream = new CryptoStream(netStream,
crypt.CreateEncryptor(), CryptoStreamMode.Write);
String m = "test";
// Serialize a message to an encrypted network stream, then flush the
stream
Console.WriteLine("Serializing message");
Console.WriteLine("Message is: " + m);
bf.Serialize(encryptedStream, m);
Console.WriteLine("Message serialized");
encryptedStream.FlushFinalBlock();
encryptedStream.Flush();
Console.WriteLine("Stream flushed");
// At this point, the message should already have arrived at the server.
// However, you'll notice during the next 5 seconds that the server
// will act as though it hasn't received the message.
Thread.Sleep(5000);
encryptedStream.Close();
Console.WriteLine("Stream closed");
// Now, the server will have displayed the message. So Close() is doing
// something to finalize sending the message that Flush() didn't do.
// Finally, wait another 5 seconds to prove that Close() is what did it,
// rather than destruction of some object.
Thread.Sleep(5000);
}
}
//----------------------------------------------
// End client.cs
//----------------------------------------------
//----------------------------------------------
// Begin server.cs
//----------------------------------------------
using System;
using System.Net;
using System.Net.Sockets;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections;
using System.IO;
using System.Security.Cryptography;
using System.Threading;
class Server
{
static void Main(string[] args)
{
IPAddress localHost = Dns.Resolve("localhost").AddressList[0];
TcpListener server = new TcpListener(localHost, 8000);
server.Start();
TcpClient client = server.AcceptTcpClient();
NetworkStream netStream = client.GetStream();
SymmetricAlgorithm crypt = Rijndael.Create();
byte[] Key = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
0x11, 0x12, 0x13, 0x14, 0x15, 0x16};
byte[] IV = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
0x11, 0x12, 0x13, 0x14, 0x15, 0x16};
crypt.Key = Key;
crypt.IV = IV;
BinaryFormatter bf = new BinaryFormatter();
CryptoStream encryptedStream = new CryptoStream(netStream,
crypt.CreateDecryptor(), CryptoStreamMode.Read);
Console.WriteLine("Deserializing message");
String m = (String) bf.Deserialize(encryptedStream);
Console.WriteLine("Message deserialized");
Console.WriteLine("Message was: " + m);
}
}
//----------------------------------------------
// End server.cs
//----------------------------------------------
- Next message: C P: "Protecting proprietary app data"
- Previous message: turinreza: "RE: Impersonating tokens don't match (get error)"
- Next in thread: Stephen Martin: "Re: Deserialize, CryptoStream, and NetworkStream"
- Reply: Stephen Martin: "Re: Deserialize, CryptoStream, and NetworkStream"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] [ attachment ]
Relevant Pages
|