Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / security / cryptography
Print

Secret Key Encryption Demo

4.94/5 (17 votes)
6 Jun 2013CPOL1 min read 56.2K   3.4K  
This is an alternative for Secret Key Encryption Demo

Encryption

Introduction

Encryption is the process of transforming electronic data from a "plain text" state to an unreadable state by use of a cipher, also known as an algorithm.

Although formerly pretty complex, encryption can now be implemented very easily in any .NET application using the various encryption classes in the System.Security.Cryptography namespace.

I've put together an encryption demo program that demonstrates how to encrypt and decrypt documents using the following encryption methods:

  • AES (Advanced Encryption Standard)
  • DES (Data Encryption Standard)
  • RC2 ("Ron's Code" or "Rivest Cipher")
  • Rijndael
  • Triple DES (Triple Data Encryption Standard)

This application uses persistent keys in combination with the respective algorithms to encrypt and decrypt data.

When appropriate, you will see a C# snippet first, and then a VB version of the same.

Using the Code

  • Pass the selected file to the Encrypt and Decrypt methods below:
  • VB.NET
    Dim path As String = "C:\temp\Encryption\Encrypt-decrypt.doc"
    Dim encrytedPath As String = String.Empty
    
    encrytedPath = Encrypt(path)
    MessageBox.Show("The following file has been encrypted:" & _
                              vbCrLf & vbCrLf & encrytedPath)
    
    path = Decrypt(encrytedPath)
    MessageBox.Show("The following file has been decrypted:" & _
                              vbCrLf & vbCrLf & path)
  • Declare the instance of the AES class that will be used to encrypt and decrypt:
  • //Create the a new instance of AES
    private System.Security.Cryptography.Aes mAes = System.Security.Cryptography.Aes.Create();
  • The code for the Encrypt method:
  • public override void Encrypt(string inputFilePath, string outputFilePath)
    {
    
        //Get a persisted key and vector
        byte[] key = this.GetKey();
        byte[] iv = this.GetIV();
    
        // When a new instance of the AES class is created, a new random Key and Vector (IV)
        // are created automatically.  You can use these to encrypt and decrypt your files,
        // however, they are only good until a new instance of this class is created.  Once
        // a new random Key and Vector (IV) are created, you won't be able to decrypt files,
        // because the Key and Vector (IV) will have changed.  The solution is use them 1  
        // time to create a random Key and Vector (IV) (which can be viewed in the Immediate 
        // window by typing "?mAes.Key" or "?mAes.IV", and pressing 
        // Enter), and then somehow  in your application (like in a class, or in a .DLL, or in
        // an encrypted file or something), which I've done as an example in the GeyKey() and 
        // GetIV() methods.
        //The auto-generated random key can be used by uncommenting these lines, and the 
        // corresponding lines in the Decrypt method below
        //key = mAes.Key
        //iv = mAes.IV
    
        //Create the Encryptor using the Key and Vector (IV)
        ICryptoTransform encryptor = mAes.CreateEncryptor(GetKey(), GetIV());
    
        //Call the PerformEncryption method in the _BaseEncryption base class
        base.PerformEncryption(encryptor, inputFilePath, outputFilePath);
    
    }
  • The code for the Decrypt method:
  • public override void Decrypt(string inputFilePath, string outputFilePath)
    {
    
        byte[] key = this.GetKey();
        byte[] iv = this.GetIV();
    
        //You can use this to generate a new Key and Vector (IV) for use in your applications.
        //  *** Do not use the key that comes with this demo, 
        //      because everyone who uses this demo will have it. ***
        //key = mAes.GenerateKey()
        //iv = mAes.GenerateIV()
    
        //Create the Decryptor using the Key and Vector (IV)
        ICryptoTransform decryptor = mAes.CreateDecryptor(key, iv);
    
        //Call the PerformDecryption method in the _BaseEncryption base class
        base.PerformDecryption(decryptor, inputFilePath, outputFilePath);
    
    }
  • Persisted Key and Vector (IV):
  • //*** Just a note - DO NOT USE THIS KEY FOR YOUR OWN ENCRYPTION
    // Create a new key by using the GenerateKey() method
    private byte[] GetKey()
    {
     
        //32 length byte array
        byte[] key = new byte[32/span>];
        key[<span class="code-digit">0] = 195;
        key[1] = 201;
        key[2] = 141;
        key[3] = 238;
        key[4] = 118;
        key[5] = 179;
        key[6] = 108;
        key[7] = 7;
        key[8] = 37;
        key[9] = 109;
        key[10] = 7;
        key[11] = 48;
        key[12] = 66;
        key[13] = 141;
        key[14] = 2;
        key[15] = 65;
        key[16] = 213;
        key[17] = 136;
        key[18] = 141;
        key[19] = 210;
        key[20] = 78;
        key[21] = 234;
        key[22] = 83;
        key[23] = 34;
        key[24] = 41;
        key[25] = 238;
        key[26] = 152;
        key[27] = 88;
        key[28] = 228;
        key[29] = 72;
        key[30] = 160;
        key[31] = 174;
     
        return key;
     
    }
     
    //*** Just a note - DO NOT USE THIS Vector (IV) FOR YOUR OWN ENCRYPTION
    // Create a new Vector (IV) by using the GenerateIV() method, _
    // or changing the bytes below to whatever you want.
    private byte[] GetIV()
    {
     
        //16 length byte array    
        byte[] IV = new byte[16];
        IV[0] = 30;
        IV[1] = 185;
        IV[2] = 3;
        IV[3] = 73;
        IV[4] = 26;
        IV[5] = 247;
        IV[6] = 159;
        IV[7] = 124;
        IV[8] = 211;
        IV[9] = 112;
        IV[10] = 251;
        IV[11] = 231;
        IV[12] = 69;
        IV[13] = 25;
        IV[14] = 132;
        IV[15] = 1;
     
        return IV;
     
    }

Points of Interest

The process for encrypting and decrypting each of the different algorithms is the same. One of the things you will find different is the number of bytes that are used in the different key and vector arrays.

Hopefully, this demo is helpful to you!

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)