Languages » VB.NET » HowTo     Intermediate License: The Code Project Open License (CPOL)

Secret Key Encryption Demo

By VB Rocks

This application demonstrates how to perform secret encryption using VB.Net and the .Net Framework 3.0.
VB (VB 9.0, VB), .NET, Dev

Posted: 25 Jul 2008
Updated: 25 Jul 2008
Views: 391
1 vote for this article.
Popularity: 0.00 Rating: 5.00 out of 5
0 votes, 0.0%
1
0 votes, 0.0%
2
0 votes, 0.0%
3
0 votes, 0.0%
4
1 vote, 100.0%
5
Note: This is an unedited contribution. If this article is inappropriate, needs attention or copies someone else's work without reference then please Report This Article


Secret Key Encryption Demo Preview

Encryption

Introduction

Encryption is the processes of transforming electronic data from a "plain text" state to an unreadable state by use of a cipher, also known as a 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 classes:

  • 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.

Using the code

  • Pass the selected file to the Encrypt and Decrypt methods below
    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 mAes As System.Security.Cryptography.Aes = _
                             System.Security.Cryptography.Aes.Create()
  • The code for the Encrypt Method

    ''' <summary>
    ''' This function Encryptes a document and returns the encrypted document path.
    ''' </summary>
    ''' <param name="path">The path of the file to encrypt.</param>
    ''' <returns>The path of the encrypted file.</returns>
    ''' <remarks></remarks>
    Private Function Encrypt(ByVal path As String) As String
    
        Dim outputPath As String = String.Concat(path, ".enc")
    
        'Encryption example using AES
    
        'Get a persisted key and vector
        Dim key As Byte() = GetKey()
        Dim iv As Byte() = 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 persist it 
        ' 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)
        Dim encryptor As ICryptoTransform = mAes.CreateEncryptor(GetKey(), GetIV())
    
        'Open both the input file for reading, and
        ' the output file for writing.
        Dim reader As New FileStream(path, FileMode.Open, FileAccess.Read)
        Dim writer As New FileStream(outputPath, FileMode.Create, FileAccess.Write)
    
        'Create an Encrypted Stream using the "encryptor" we created above
        Dim encryptedStream As _
                    New System.Security.Cryptography.CryptoStream(writer, _
                    encryptor, CryptoStreamMode.Write)
    
        Dim bites(1023) As Byte 'Stores 1 KB
        Dim bitesRead As Int32 = 0 'Number of Bytes read
        Dim totalBites As Int64 = 0 'Total Number of Bytes read
    
    
        'Loop through the entire file reading 1 kb at a time
        Do Until totalBites >= reader.Length
    
            bitesRead = reader.Read(bites, 0, 1024) 'Read the bytes from the input file.
    
            encryptedStream.Write(bites, 0, bitesRead) 'Write the encrypted bytes to the output file.
    
            totalBites += bitesRead
    
        Loop
    
    
        'Close and release streams:
        encryptedStream.Close()
        encryptedStream.Dispose()
    
        reader.Close()
        reader.Dispose()
    
        writer.Close()
        writer.Dispose()
    
        'Return the output file
        Return outputPath
    
    End Function
  • The code for the Decrypt Method

    ''' <summary>
    ''' This function Encryptes a document and returns the encrypted document path.
    ''' </summary>
    ''' <param name="path">The path of the file to encrypt.</param>
    ''' <returns>The path of the encrypted file.</returns>
    ''' <remarks></remarks>
    Private Function Decrypt(ByVal path As String) As String
    
        Dim decryptedPath As String = path.Replace(".enc", "")
    
        Dim key As Byte() = GetKey()
        Dim iv As Byte() = 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)
        Dim decryptor As ICryptoTransform = mAes.CreateDecryptor(key, iv)
    
        'Open both the input file for reading, and
        ' the output file for writing.
        Dim reader As New FileStream(path, FileMode.Open, FileAccess.Read)
        Dim writer As New FileStream(decryptedPath, FileMode.Create, FileAccess.Write)
    
        'Create an Encrypted Stream using the "encryptor" we created above
        Dim decryptedStream As _
                        New System.Security.Cryptography.CryptoStream(writer, _
                        decryptor, CryptoStreamMode.Write)
    
        Dim bites(1023) As Byte 'Stores 1 KB
        Dim bitesRead As Int32 = 0 'Number of Bytes read
        Dim totalBites As Int64 = 0 'Total Number of Bytes read
    
    
        'Loop through the entire file reading 1 kb at a time
        Do Until totalBites >= reader.Length
    
           bitesRead = reader.Read(bites, 0, 1024) 'Read the bytes from the input file.
    
           decryptedStream.Write(bites, 0, bitesRead) 'Write the encrypted bytes to the output file.
    
           totalBites += bitesRead
    
        Loop
    
    
        'Close and release streams:
        decryptedStream.Close()
        decryptedStream.Dispose()
    
        reader.Close()
        reader.Dispose()
    
        writer.Close()
        writer.Dispose()
    
        Return decryptedPath
    
    End Function
  • 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 Function GetKey() As Byte()
    
        '32 length byte array
        Dim key(31) As Byte
        key(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
    
    End Function
    
    
    
    '*** Just a note - DO NOT USE THIS Vector (IV) FOR YOUR OWN ENCRYPTION
    ' Create a new Vector (IV) by using the GenerateIV() method
    Private Function GetIV() As Byte()
    
        '16 length byte array
        Dim IV(15) As Byte
        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
    
    End Function

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!

VBRocks
2008 MS Visual Basic MVP

VisualBasicRocks.com

License

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

About the Author

VB Rocks



Occupation: Software Developer
Company: VisualBasicRocks.com
Location: United States United States

Discussions and Feedback

Comment 0 messages have been posted for this article. Visit http://www.codeproject.com/KB/vb/SecretEncryptionDemo.aspx to post and view comments on this article, or click here to get a print view with messages.

PermaLink | Privacy | Terms of Use
Last Updated: 25 Jul 2008
Editor:
Copyright 2008 by VB Rocks
Everything else Copyright © CodeProject, 1999-2008
Web08 | Advertise on the Code Project