Meade ETX 90 picture

Using Encryption in C# and ASP.NET


2015-04-26

Came across this handy little code snippet for encrypting and decrypting strings in C#. Enjoy!

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace EncryptStringSample
{
    public static class StringCipher
    {
        // This constant string is used as a "salt" value for the PasswordDeriveBytes function calls.
        // This size of the IV (in bytes) must = (keysize / 8).  Default keysize is 256, so the IV must be
        // 32 bytes long.  Using a 16 character string here gives us 32 bytes when converted to a byte array.

        private static readonly byte[] initVectorBytes = Encoding.ASCII.GetBytes ("tu89geji340t89u2");

        // This constant is used to determine the keysize of the encryption algorithm.
        private const int keysize = 256;

        public static string Encrypt (string plainText, string passPhrase)
        {
            byte[] plainTextBytes = Encoding.UTF8.GetBytes (plainText);
            using (PasswordDeriveBytes password = new PasswordDeriveBytes (passPhrase, null))
            {
                byte[] keyBytes = password.GetBytes (keysize / 8);
                using (RijndaelManaged symmetricKey = new RijndaelManaged ())
                {
                    symmetricKey.Mode = CipherMode.CBC;
                    using (ICryptoTransform encryptor = symmetricKey.CreateEncryptor (keyBytes, initVectorBytes))
                    {
                        using (MemoryStream memoryStream = new MemoryStream ())
                        {
                            using (CryptoStream cryptoStream = new CryptoStream (memoryStream, encryptor, CryptoStreamMode.Write))
                            {
                                cryptoStream.Write (plainTextBytes, 0, plainTextBytes.Length);
                                cryptoStream.FlushFinalBlock ();
                                byte[] cipherTextBytes = memoryStream.ToArray ();
                                return Convert.ToBase64String (cipherTextBytes);
                            }
                        }
                    }
                }
            }
        }

        public static string Decrypt (string cipherText, string passPhrase)
        {
            byte[] cipherTextBytes = Convert.FromBase64String (cipherText);
            using (PasswordDeriveBytes password = new PasswordDeriveBytes (passPhrase, null))
            {
                byte[] keyBytes = password.GetBytes (keysize / 8);
                using (RijndaelManaged symmetricKey = new RijndaelManaged ())
                {
                    symmetricKey.Mode = CipherMode.CBC;
                    using (ICryptoTransform decryptor = symmetricKey.CreateDecryptor (keyBytes, initVectorBytes))
                    {
                        using (MemoryStream memoryStream = new MemoryStream (cipherTextBytes))
                        {
                            using (CryptoStream cryptoStream = new CryptoStream (memoryStream, decryptor, CryptoStreamMode.Read))
                            {
                                byte[] plainTextBytes = new byte[cipherTextBytes.Length];
                                int decryptedByteCount = cryptoStream.Read (plainTextBytes, 0, plainTextBytes.Length);
                                return Encoding.UTF8.GetString (plainTextBytes, 0, decryptedByteCount);
                            }
                        }
                    }
                }
            }
        }
    }
}

My name is Rick Towns and I am an amateur astronomer and computer programmer from Canada. This is a collection of interesting posts I've gathered over the years.