Click here to Skip to main content
Click here to Skip to main content

Encryption/Decryption with .NET

By , 14 Mar 2002
 

Introduction

Encryption and Decryption

The System.Security.Cryptographic namespace within the Microsoft .NET Framework provides a variety of tools to aid in encryption and decryption. The CryptoStream class is used here to demonstrate the encryption and decryption with System.Security.Cryptographic.SymmetricAlgorithm, such as DESCryptoServiceProvider, RC2CryptoServiceProvider, and RijndaelManaged classes.

I have searched the Internet for some samples and all I found were based on the Microsoft sample code in KB Article Q307010 which basically uses input/output files as source and destination. I would like to have the encryption and decryption done in memory without having to specify source and destination files, so that I could use the code on a web server or so.

If you have any questions, please email to: fangfrank@hotmail.com

Frank Fang

Source Code

using System;
using System.Security.Cryptography;
using System.IO;
using System.Text;

namespace FangHome_Crypto
{
    /// <summary>
    /// SymmCrypto is a wrapper of System.Security.Cryptography.SymmetricAlgorithm classes
    /// and simplifies the interface. It supports customized SymmetricAlgorithm as well.
    /// </summary>
    public class SymmCrypto
    {
        /// <remarks>
        /// Supported .Net intrinsic SymmetricAlgorithm classes.
        /// </remarks>
        public enum SymmProvEnum : int
        {
            DES, RC2, Rijndael
        }

        private SymmetricAlgorithm mobjCryptoService;

        /// <remarks>
        /// Constructor for using an intrinsic .Net SymmetricAlgorithm class.
        /// </remarks>
        public SymmCrypto(SymmProvEnum NetSelected)
        {
            switch (NetSelected)
            {
                case SymmProvEnum.DES:
                    mobjCryptoService = new DESCryptoServiceProvider();
                    break;
                case SymmProvEnum.RC2:
                    mobjCryptoService = new RC2CryptoServiceProvider();
                    break;
                case SymmProvEnum.Rijndael:
                    mobjCryptoService = new RijndaelManaged();
                    break;
            }
        }

        /// <remarks>
        /// Constructor for using a customized SymmetricAlgorithm class.
        /// </remarks>
        public SymmCrypto(SymmetricAlgorithm ServiceProvider)
        {
            mobjCryptoService = ServiceProvider;
        }

        /// <remarks>
        /// Depending on the legal key size limitations of a specific CryptoService provider
        /// and length of the private key provided, padding the secret key with space character
        /// to meet the legal size of the algorithm.
        /// </remarks>
        private byte[] GetLegalKey(string Key)
        {
            string sTemp;
            if (mobjCryptoService.LegalKeySizes.Length > 0)
            {
                int lessSize = 0, moreSize = mobjCryptoService.LegalKeySizes[0].MinSize;
                // key sizes are in bits
                while (Key.Length * 8 > moreSize)
                {
                    lessSize = moreSize;
                    moreSize += mobjCryptoService.LegalKeySizes[0].SkipSize;
                }
                sTemp = Key.PadRight(moreSize / 8, ' ');
            }
            else
                sTemp = Key;

            // convert the secret key to byte array
            return ASCIIEncoding.ASCII.GetBytes(sTemp);
        }

        public string Encrypting(string Source, string Key)
        {
            byte[] bytIn = System.Text.ASCIIEncoding.ASCII.GetBytes(Source);
            // create a MemoryStream so that the process can be done without I/O files
            System.IO.MemoryStream ms = new System.IO.MemoryStream();

            byte[] bytKey = GetLegalKey(Key);

            // set the private key
            mobjCryptoService.Key = bytKey;
            mobjCryptoService.IV = bytKey;

            // create an Encryptor from the Provider Service instance
            ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor();

            // create Crypto Stream that transforms a stream using the encryption
            CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);

            // write out encrypted content into MemoryStream
            cs.Write(bytIn, 0, bytIn.Length);
            cs.FlushFinalBlock();
            
            // get the output and trim the '\0' bytes
            byte[] bytOut = ms.GetBuffer();
            int i = 0;
            for (i = 0; i < bytOut.Length; i++)
                if (bytOut[i] == 0)
                    break;
                    
            // convert into Base64 so that the result can be used in xml
            return System.Convert.ToBase64String(bytOut, 0, i);
        }

        public string Decrypting(string Source, string Key)
        {
            // convert from Base64 to binary
            byte[] bytIn = System.Convert.FromBase64String(Source);
            // create a MemoryStream with the input
            System.IO.MemoryStream ms = new System.IO.MemoryStream(bytIn, 0, bytIn.Length);

            byte[] bytKey = GetLegalKey(Key);

            // set the private key
            mobjCryptoService.Key = bytKey;
            mobjCryptoService.IV = bytKey;

            // create a Decryptor from the Provider Service instance
            ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();
 
            // create Crypto Stream that transforms a stream using the decryption
            CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);

            // read out the result from the Crypto Stream
            System.IO.StreamReader sr = new System.IO.StreamReader( cs );
            return sr.ReadToEnd();
        }
    }
}

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Frank Fang
Web Developer
United States United States
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionTake this down PinmemberMark Jones12 Feb '13 - 4:05 
This clearly doesn't work, please can this be removed until it has been fixed, people including myself will be using this example to help them with Encryption in .NET.
GeneralMy vote of 1 PinmemberSlip_915 Oct '11 - 0:49 
don't works :(
GeneralMy vote of 2 PinmemberganeshJoshi27 Jul '10 - 23:06 
,,hh
GeneralLet me see PinmemberAbinash Bishoyi19 Jun '10 - 11:48 
After seeing lots of error, it prompt me to test the code.
GeneralMy vote of 1 PinmemberTyler Xie19 Dec '08 - 8:55 
Not fully tested. Lots of bugs.
GeneralPhrase I LOVE COFFEE! throws and error PinmemberDave Sopko2 Aug '07 - 8:23 
Encrypting and decrypting all work fine for me except for the specific phrase 'I LOVE COFFEE!' When I use this string I get the error CryptographicException was unhandled. Length of the data to decrypt is invalid. Variations on the string such as 'I LOVE COFFE!', 'I LOVE COFFEE', 'I LOVE COFFEEX' all work.
 
I used the key 12345678 and used DES to encrypt it. Very puzzling.
 

FangHome_Crypto.SymmCrypto cryptAway = new FangHome_Crypto.SymmCrypto(SymmCrypto.SymmProvEnum.DES);
 
string key = "12345678";
string original = "I LOVE COFFEE!";
string encrypted = cryptAway.Encrypting(original, key);
string decrypted = cryptAway.Decrypting(encrypted, key);
GeneralRe: Phrase I LOVE COFFEE! throws and error Pinmemberblackjack215016 Jul '08 - 23:46 
GeneralRe: Phrase I LOVE COFFEE! throws and error PinmemberBruce Burge22 Apr '09 - 5:57 
QuestionInvalid Length PinmemberNaeem Hassan25 Jan '07 - 1:10 
while decrypting the encrypted text with same key sometimes "Invalid Length" exception occoured. It is observed it only appear whenever the "byteIn" lenth is become odd number in Decrypt Method. Can you fix it?Cry | :((
AnswerRe: Invalid Length Pinmembersweemeng.koh23 Sep '07 - 13:19 
AnswerRe: Invalid Length PinmemberbluebeetleRCC15 Aug '08 - 5:27 
AnswerRe: Invalid Length Pinmembernathan2240529 May '09 - 4:24 
GeneralBase64Strings Pinmemberlyn_s_scott26 May '05 - 10:33 
Hi.. I'm Lyn Scott from Venezuela..
 
I need to encrypt some data and save it to simple txt files or Windows registry... but after use encrypt I get base 64 string... How do you save encrypted data in simple ascii string and decrypt that again...???
 
May be.. you can help me... thanks..
 
note: XML is not a option for now!

GeneralRe: Base64Strings Pinmemberdlwiii22 Aug '08 - 7:26 
GeneralInvalid Length PinsussAnonymous16 Aug '04 - 16:58 
I'm also getting this error message.
 
Invalid length for Base-64 char array.
GeneralRe: Invalid Length Pinmembervipinjosea2 Aug '05 - 18:17 
GeneralInvalid lenth PinsussK.Vetter14 Jul '04 - 23:18 
Hi all,
 
I've worked with the original code from the project and the posted code from the forum.
 
By decoding of an Rijndael encoded string I get a few times an "Invalid length for a Base-64 char array" exception from the decrypting method.
 
This exception occured in both versions.
 
Is there a fix for this problem?
 
Thanks
 
Kristian
GeneralRe: Invalid lenth PinsussAnonymous9 Sep '04 - 23:30 
GeneralRe: Invalid lenth PinsussAnonymous3 Jan '05 - 6:58 
GeneralRe: Invalid lenth PinmemberJohn Storer II5 Jul '06 - 2:31 
GeneralRe: Invalid lenth Pinmembershuchi agarwal28 Jul '06 - 3:14 
GeneralThe bug in encryption found... PinmemberNikolai Serdiuk25 Feb '04 - 23:32 
I try to use this class with the key: ~!@#$%^& and discover that encryption bug exists. The following code is wrong:
 
int i= 0;
for (i= 0; i< byteOut.Length; i++)
if (byteOut[i] == 0)
break;
 
return System.Convert.ToBase64String(byteOut, 0, i);
 
The encrypted byte array can contain a zero code character (my case). You should use other construction:
 
byte[] byteOut = streamMemory.GetBuffer();
return System.Convert.ToBase64String(byteOut, 0, (int) streamMemory.Length);

 
Nikolai Serdiuk
GeneralRe: The bug in encryption found... PinsussAnonymous31 May '04 - 12:43 
GeneralRe: The bug in encryption found... PinmemberNikolai Serdiuk31 May '04 - 21:34 
GeneralRe: The bug in encryption found... PinmemberNikolai Serdiuk31 May '04 - 21:56 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130516.1 | Last Updated 15 Mar 2002
Article Copyright 2002 by Frank Fang
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid