情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

C#で暗号通信

Rijndaelで。パディングモードはPaddingMode.Zerosにしてください。

public static class CommunicationApparatus
{
    public static byte[] ReadByte(NetworkStream _networkStream, RijndaelManaged _rijndael)
    {
        byte[] size = new byte[4];
        _networkStream.Read(size, 0, 4);
        int dataSize = BitConverter.ToInt32(size, 0);

        byte[] data = null;

        using (MemoryStream memoryStream = new MemoryStream())
        {
            byte[] readBuffer = new byte[1024];

            while (true)
            {
                int byteSize = _networkStream.Read(readBuffer, 0, readBuffer.Length);
                memoryStream.Write(readBuffer, 0, byteSize);
                if (!_networkStream.DataAvailable)
                    break;
            }

            data = memoryStream.ToArray();
        }

        if (IsEncrypt)
        {
            byte[] plainData = new byte[dataSize];

            using (MemoryStream memoryStream = new MemoryStream(data))
            using (CryptoStream cryptoStream = new CryptoStream(memoryStream, _rijndael.CreateDecryptor(_rijndael.Key, _rijndael.IV), CryptoStreamMode.Read))
            {
                cryptoStream.Read(plainData, 0, plainData.Length);
            }

            return plainData;
        }
        else
            return data;
    }

    public static void WriteByte(NetworkStream _networkStream, RijndaelManaged _rijndael, byte[] _data)
    {
        _networkStream.Write(BitConverter.GetBytes(_data.Length), 0, 4);

        byte[] cipherData = null;

        using (MemoryStream memoryStream = new MemoryStream())
        {
            if (IsEncrypt)
            {
                using (CryptoStream cryptoStream = new CryptoStream(memoryStream, _rijndael.CreateEncryptor(_rijndael.Key, _rijndael.IV), CryptoStreamMode.Write))
                {
                    cryptoStream.Write(_data, 0, _data.Length);
                    cryptoStream.FlushFinalBlock();
                }
            }
            else
            {
                memoryStream.Write(_data, 0, _data.Length);
                memoryStream.Flush();
            }

            cipherData = memoryStream.ToArray();
        }

        _networkStream.Write(cipherData, 0, cipherData.Length);
    }

    public static string ReadString(NetworkStream _networkStream, RijndaelManaged _rijndael)
    {
        byte[] plainData = ReadByte(_networkStream, _rijndael);
        return Encoding.UTF8.GetString(plainData, 0, plainData.Length);
    }

    public static void WriteString(NetworkStream _networkStream, RijndaelManaged _rijndael, string _data)
    {
        WriteByte(_networkStream, _rijndael, Encoding.UTF8.GetBytes(_data));
    }
}
pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-C#