views:

452

answers:

2

Hi there,

I have a simple client/server setup. The client and the server both have a private key.

What does .NET offer me in the way of

ClientData-> ClientEncrypt with KEY-> Transmit to Server-> ServerDecrypt with KEY-> ClientData

Can anyone suggest any fast simple libraries to read up on?

Thanks

+2  A: 

RijndaelManaged:

Here's an example:

private static string CreateEncryptedString(string myString, string hexiv, string key)
        {
            RijndaelManaged alg = new RijndaelManaged();
            alg.Padding = PaddingMode.Zeros;
            alg.Mode = CipherMode.CBC;
            alg.BlockSize = 16 * 8;
            alg.Key = ASCIIEncoding.UTF8.GetBytes(key);
            alg.IV = StringToByteArray(hexiv);
            ICryptoTransform encryptor = alg.CreateEncryptor(alg.Key, alg.IV);

            MemoryStream msStream = new MemoryStream();
            CryptoStream mCSWriter = new CryptoStream(msStream, encryptor, CryptoStreamMode.Write);
            StreamWriter mSWriter = new StreamWriter(mCSWriter);
            mSWriter.Write(myString);
            mSWriter.Flush();
            mCSWriter.FlushFinalBlock();

            var EncryptedByte = new byte[msStream.Length];
            msStream.Position = 0;
            msStream.Read(EncryptedByte, 0, (int)msStream.Length);

            return ByteArrayToHexString(EncryptedByte);

        }
        public static byte[] StringToByteArray(String hex)
        {
            int NumberChars = hex.Length;
            byte[] bytes = new byte[NumberChars / 2];
            for (int i = 0; i < NumberChars; i += 2)
                bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
            return bytes;
        }
        public static string ByteArrayToHexString(byte[] ba)
        {
            StringBuilder hex = new StringBuilder(ba.Length * 2);
            foreach (byte b in ba)
                hex.AppendFormat("{0:x2}", b);
            return hex.ToString();
        }

You can easily come out with a decryption algorithm and the examples ( or just google it around!)

Ngu Soon Hui
Re: Googling for a solution... Yes, but make sure you dont copy a bad one =) (http://www.codinghorror.com/blog/archives/001268.html)
StingyJack
A: 
using System;
using System.Security.Cryptography;
using System.IO;
using System.Text;

namespace ServiceConsole
{
    public class Obfuscation
    {
        public static byte[] Encrypt(string data)
        {
            return Encrypt(data, SecurityCredentials.KeyString, SecurityCredentials.IvString);
        }

        public static byte[] Encrypt(string data, string key, string iv)
        {
            return Encrypt(data, key, iv, SecurityCredentials.PaddingString);
        }

        public static byte[] Encrypt(string data, string key, string iv, char paddingCharacter)
        {
            byte[] keyBytes = Encoding.UTF8.GetBytes(key.PadLeft(32, paddingCharacter).Substring(0, 32));
            byte[] ivBytes = Encoding.UTF8.GetBytes(iv.PadLeft(32, paddingCharacter).Substring(0, 32));

            RijndaelManaged rijndaelManaged = new RijndaelManaged();
            rijndaelManaged.BlockSize = 256;
            rijndaelManaged.KeySize = 256;

            MemoryStream memoryStream = new MemoryStream();

            ICryptoTransform iCryptoTransform = rijndaelManaged.CreateEncryptor(keyBytes, ivBytes);

            CryptoStream cryptoStream = new CryptoStream(memoryStream, iCryptoTransform, CryptoStreamMode.Write);

            StreamWriter streamWriter = new StreamWriter(cryptoStream);

            streamWriter.Write(data);
            streamWriter.Flush();

            cryptoStream.FlushFinalBlock();

            byte[] returnBytes = memoryStream.ToArray();

            /// Disposal
            streamWriter.Dispose();
            cryptoStream.Dispose();
            iCryptoTransform.Dispose();
            memoryStream.Dispose();
            rijndaelManaged.Clear();
            ///

            return returnBytes;
        }

        public static string Decrypt(byte[] data)
        {
            return Decrypt(data, SecurityCredentials.KeyString, SecurityCredentials.IvString);
        }

        public static string Decrypt(byte[] data, string key, string iv)
        {
            return Decrypt(data, key, iv, SecurityCredentials.PaddingString);
        }

        public static string Decrypt(byte[] data, string key, string iv, char paddingCharacter)
        {
            byte[] keyBytes = Encoding.UTF8.GetBytes(key.PadLeft(32, paddingCharacter).Substring(0, 32));
            byte[] ivBytes = Encoding.UTF8.GetBytes(iv.PadLeft(32, paddingCharacter).Substring(0, 32));

            RijndaelManaged rijndaelManaged = new RijndaelManaged();
            rijndaelManaged.BlockSize = 256;
            rijndaelManaged.KeySize = 256;

            MemoryStream memoryStream = new MemoryStream(data);

            ICryptoTransform iCryptoTransform = rijndaelManaged.CreateDecryptor(keyBytes, ivBytes);

            CryptoStream cryptoStream = new CryptoStream(memoryStream, iCryptoTransform, CryptoStreamMode.Read);

            StreamReader streamReader = new StreamReader(cryptoStream);

            /// Disposal
            streamReader.Dispose();
            cryptoStream.Dispose();
            iCryptoTransform.Dispose();
            memoryStream.Dispose();
            rijndaelManaged.Clear();
            ///

            string returnString = streamReader.ReadLine();

            return returnString;
        }
    }
}
divinci
neat and tidy and static :)
divinci