client-server application encrypt/decrypt

Hi,

I have client server application, I am trying to encrypt all data communication between client and server. Please suggest me how can i do it? Should I use System.Security.Cryptography class or there is any easy way too.

Please guide,

Thanks
Bertrand RussellAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

ste5anSenior DeveloperCommented:
Well, it depends on your concrete type of communications and the concrete requirements.

Do you need protocol or message encryption? The first could be done by tunneling, e.g. SSL/SSH. So this can be done by the OS.
Message encryption means that you application needs to handled by you application.

So without further information, it's hard to guess.
0
Bertrand RussellAuthor Commented:
thanks for message. I need message level encryption
Please guide

Thanks
0
ste5anSenior DeveloperCommented:
What kind of communications? Web Services (WCF) has already a built-in mechanism for that:

E.g.

<bindings>
	<wsHttpBinding>
		<binding name="netTcpEndpointBinding">
			<security mode="message"></security>
		</binding>
	</wsHttpBinding>
</bindings>

Open in new window


See also:

* Message Security in WCF
* Chapter 7: Message and Transport Security
0
C++ 11 Fundamentals

This course will introduce you to C++ 11 and teach you about syntax fundamentals.

Bertrand RussellAuthor Commented:
It is windows service, so client is c# interface/application and server is a windows service. Please guide how to make message level encryption! thx
0
ste5anSenior DeveloperCommented:
In this general case you need to encrypt/decrypt each message. Here you use the System.Security.Cryptography namspace of the .Net framework.

See Encrypting and Decrypting Data.
0
Bertrand RussellAuthor Commented:
I have tried this code, it is encrypting and decrypting data well on local machine but when I send data to remote machine, the decryption fails. What is wrong in this code that make it not working on remote machine while working on local is fine!

  public static byte[] Key = new byte[]{0x43, 0x72, 0x6e, 0x6d, 0x54, 0x4d, 0x65,
                                      0x94, 0x16, 0x32, 0x44, 0x84, 0x7e, 0x18,
                                      0x64, 0x76, 0x6e, 0x63, 0x64, 0x7a, 0x5f,
                                      0x84, 0x7f, 0x9a};

        public static string Encrypt(string toEncrypt, bool useHashing)
        {
            byte[] keyArray;
            byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);


            if (useHashing)
            {
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                //keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
                keyArray = hashmd5.ComputeHash(Key);

                hashmd5.Clear();
            }
            else
                keyArray = Key;

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            tdes.Key = keyArray;
            tdes.Mode = CipherMode.ECB;
            tdes.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = tdes.CreateEncryptor();
            byte[] resultArray =
              cTransform.TransformFinalBlock(toEncryptArray, 0,
              toEncryptArray.Length);
            //Release resources held by TripleDes Encryptor
            tdes.Clear();
            //Return the encrypted data into unreadable string format
            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }

        public static string Decrypt(string cipherString, bool useHashing)
        {
            byte[] keyArray;
            //get the byte code of the string

            byte[] toEncryptArray = Convert.FromBase64String(cipherString);



            if (useHashing)
            {
                //if hashing was used get the hash code with regards to your key
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                //keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
                keyArray = hashmd5.ComputeHash(Key);
                //release any resource held by the MD5CryptoServiceProvider

                hashmd5.Clear();
            }
            else
            {
                keyArray = Key;
            }

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            //set the secret key for the tripleDES algorithm
            tdes.Key = keyArray;

            tdes.Mode = CipherMode.ECB;
            //padding mode(if any extra byte added)
            tdes.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = tdes.CreateDecryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(
                                 toEncryptArray, 0, toEncryptArray.Length);
            //Release resources held by TripleDes Encryptor                
            tdes.Clear();
            //return the Clear decrypted TEXT
            return UTF8Encoding.UTF8.GetString(resultArray);
        }

        public static Byte[] Encrypt(Byte[] toEncrypt, bool useHashing)
        {
            byte[] keyArray;
            // byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
            byte[] toEncryptArray = toEncrypt;

            if (useHashing)
            {
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                //keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
                keyArray = hashmd5.ComputeHash(Key);

                hashmd5.Clear();
            }
            else
                keyArray = Key;

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            //set the secret key for the tripleDES algorithm
            tdes.Key = keyArray;
            //mode of operation. there are other 4 modes.
            //We choose ECB(Electronic code Book)
            tdes.Mode = CipherMode.ECB;
            //padding mode(if any extra byte added)

            tdes.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = tdes.CreateEncryptor();
            //transform the specified region of bytes array to resultArray
            byte[] resultArray =
              cTransform.TransformFinalBlock(toEncryptArray, 0,
              toEncryptArray.Length);
            //Release resources held by TripleDes Encryptor
            tdes.Clear();
            //Return the encrypted data into unreadable string format
            // return Convert.ToBase64String(resultArray, 0, resultArray.Length);
            return resultArray;
        }

        public static Byte[] Decrypt(Byte[] cipherString, bool useHashing)
        {
            byte[] keyArray;
            //get the byte code of the string

            // byte[] toEncryptArray = Convert.FromBase64String(cipherString);
            byte[] toEncryptArray = cipherString;



            if (useHashing)
            {
                //if hashing was used get the hash code with regards to your key
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                //keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
                keyArray = hashmd5.ComputeHash(Key);
                //release any resource held by the MD5CryptoServiceProvider

                hashmd5.Clear();
            }
            else
            {
                //if hashing was not implemented get the byte code of the key
                //keyArray = UTF8Encoding.UTF8.GetBytes(key);
                keyArray = Key;
            }

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            //set the secret key for the tripleDES algorithm
            tdes.Key = keyArray;
            //mode of operation. there are other 4 modes. 
            //We choose ECB(Electronic code Book)

            tdes.Mode = CipherMode.ECB;
            //padding mode(if any extra byte added)
            tdes.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = tdes.CreateDecryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(
                                 toEncryptArray, 0, toEncryptArray.Length);
            //Release resources held by TripleDes Encryptor                
            tdes.Clear();
            //return the Clear decrypted TEXT
            // return UTF8Encoding.UTF8.GetString(resultArray);
            return resultArray;
        }

Open in new window

0
mkk3939Commented:
key on both sides should be same, otherwise it can make problem. Otherwise, code is fine, I checked it at my end.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
Bertrand RussellAuthor Commented:
Yes, thanks
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C#

From novice to tech pro — start learning today.