Cc SSL TcpListener TcpClient - PullRequest
       3

Cc SSL TcpListener TcpClient

0 голосов
/ 17 июля 2011

Я делаю игровой логин / лобби в .NET. Я хочу обработать часть входа через SSL через TcpClient & TcpListener. Как мне работать с SSL с этими двумя классами? Я не хочу никаких сертификатов, которые должны быть установлены на клиентском компьютере. Я бы предпочел, чтобы я мог просто жестко закодировать открытый ключ прямо в программе, но большинство примеров, которые я вижу, начинают работать с сертификатами.

Любой совет?

1 Ответ

3 голосов
/ 17 июля 2011

Secure Socket Layer (SSL) работает только с хранилищами сертификатов, если вы хотите использовать SSL, вы не можете этого избежать.

Однако вы можете просто выполнить шифрование с использованием криптопотока.

Пример - Выдержка из кода 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...