C# SSL TcpListener TcpClient

本文关键字:TcpClient TcpListener SSL | 更新日期: 2023-09-27 18:02:23

我正在制作。net中的游戏登录/大厅。我想通过SSL在TcpClient &TcpListener。我如何与这两个类一起使用SSL ?我不希望在客户机上安装任何类型的证书。我更希望能够直接将公钥硬编码到程序中,但是我看到的大多数示例都是从处理证书存储开始的。

任何建议吗?

C# SSL TcpListener TcpClient

安全套接字层(SSL)只适用于证书存储,如果你想使用SSL,那么你无法避免这一点。

然而,你可以简单地使用加密流进行加密。

  • http://www.codeproject.com/KB/security/using_cryptostream.aspx

示例 -代码节选自http://www.xtremedotnettalk.com/showthread.php?t=80370

class Class1
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
        System.Net.Sockets.TcpClient tcp = new System.Net.Sockets.TcpClient("localhost",12345);
        Send s = new Send();
        s.sendFile("c:''boot.ini",tcp.GetStream());
    }
}
public class Send
{
    TripleDESCryptoServiceProvider tripleDES;
    public Send()
    {
        tripleDES = new TripleDESCryptoServiceProvider();
        tripleDES.Key = Encoding.Unicode.GetBytes("foobar12foob".ToCharArray());
        tripleDES.IV = Encoding.Unicode.GetBytes("foob".ToCharArray());
    }
    public void sendFile(String fileName, Stream networkStream)
    {
        FileStream fin = new FileStream(fileName,FileMode.Open, FileAccess.Read);
        //Create variables to help with read and write.
        byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
        long rdlen = 0; //This is the total number of bytes written.
        long totlen = fin.Length; //This is the total length of the input file.
        int len; //This is the number of bytes to be written at a time.
        CryptoStream encStream = new CryptoStream(networkStream, tripleDES.CreateEncryptor(), CryptoStreamMode.Write);
        Console.WriteLine("Encrypting...");
        //Read from the input file, then encrypt and write to the output file.
        while(rdlen < totlen)
        {
            len = fin.Read(bin, 0, 100);
            encStream.Write(bin, 0, len);
            rdlen = rdlen + len;
            //Console.WriteLine("{0} bytes processed", rdlen);
        }
        encStream.Close();
    }
}
class Class2
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
        //
        // TODO: Add code to start application here
        //
        Receive r = new Receive();
        System.IO.FileStream fs = System.IO.File.OpenWrite("c:''test.txt");
        System.Net.Sockets.TcpListener tcp = new TcpListener(12345);
        tcp.Start();
        r.receiveFile(fs,tcp.AcceptTcpClient().GetStream());
        System.Console.ReadLine();
    }
}
public class Receive
{
    TripleDESCryptoServiceProvider tripleDES;
    public Receive()
    {
        tripleDES = new TripleDESCryptoServiceProvider();
        tripleDES.Key = Encoding.Unicode.GetBytes("foobar12foob".ToCharArray());
        tripleDES.IV = Encoding.Unicode.GetBytes("foob".ToCharArray());
    }
    public void receiveFile(FileStream fs, NetworkStream ns)
    {
        while(!ns.DataAvailable){}
        byte[] bin = new byte[100];
        long rdlen = 0;
        int len = 100;
        CryptoStream decStream = new CryptoStream(fs,tripleDES.CreateDecryptor(),    CryptoStreamMode.Write);
        Console.WriteLine("Decrypting...");
        while(len > 0)
        {
            len = ns.Read(bin, 0, len);
            rdlen = rdlen + len;
            decStream.Write(bin,0,len);
            Console.WriteLine("{0} bytes read, {1} total bytes", len, rdlen);
        }
        decStream.FlushFinalBlock();
        decStream.Close();
        ns.Close();
        fs.Close();
    }
}