Jump to content
Xtreme .Net Talk

Recommended Posts

Posted (edited)

I have constructed the following class from examples on MSDN and elsewhere, for some reason when decrypting I seem to end up with extra bytes and cannot for the life of me figure out where they are coming from.:confused:

I know I am using a block cipher, and my resulting encrypted data can end up with a different byte count, however after decrypting it should be a byte for byte match of the original.

 

I have to be overlooking something, but it is all blending together and I need another set of eyes to have a look.

 

#Region " Imports "

Imports System.IO
Imports System.Text
Imports System.Security.Cryptography

#End Region

Public Class Encryption

   Private Key() As Byte
   Private CryptoEngine As New  AesManaged

   ' ----- Create initialization vector.
   Private IV() As Byte = Encoding.ASCII.GetBytes(Guid.NewGuid.ToString.Replace("-", Nothing).Substring(16))

   ''' <summary>
   ''' Create a new instance of the encryption class using specified passphrase to en/decrypt.
   ''' </summary>
   ''' <param name="PassPhrase">Passphrase to use when en/decrypting data.</param>
   Public Sub New(ByVal PassPhrase As String)
       Dim HashEngine As New MD5CryptoServiceProvider
       Key = HashEngine.ComputeHash(Encoding.ASCII.GetBytes(PassPhrase))
   End Sub

   ''' <summary>
   ''' Converts plain text into base64 encoded 128bit Rijndael(AES) encrypted string.
   ''' </summary>
   ''' <param name="PlainText">Text to be encrypted</param>
   ''' <returns>String</returns>
   Public Overloads Function Encrypt(ByVal PlainText As String) As String
       Return Convert.ToBase64String(Encrypt(Encoding.ASCII.GetBytes(PlainText)))
   End Function

   ''' <summary>
   ''' Converts base64 encoded 128bit Rijndael(AES) encrypted string into plain text.
   ''' </summary>
   ''' <param name="Encrypted">Text to be decrypted</param>
   ''' <returns>String</returns>
   Public Overloads Function Decrypt(ByVal Encrypted As String) As String
       Return Encoding.ASCII.GetString(Decrypt(Convert.FromBase64String(Encrypted))).Replace(vbNullChar, Nothing)
   End Function

   ''' <summary>
   ''' Encrypts array of Byte() using 128bit Rijndael(AES).
   ''' </summary>
   ''' <param name="Data">Byte array to encrypt</param>
   ''' <returns>Encrypted byte array</returns>
   Public Overloads Function Encrypt(ByVal Data() As Byte) As Byte()
       Try

           Dim Tmp_Stream As New MemoryStream()

           Dim Transform As ICryptoTransform
           Transform = CryptoEngine.CreateEncryptor(Key, IV)

           Dim EncryptionStream As CryptoStream
           EncryptionStream = New CryptoStream(Tmp_Stream, Transform, CryptoStreamMode.Write)

           With EncryptionStream
               .Write(Data, 0, Data.Length)
               .FlushFinalBlock()
           End With

           Tmp_Stream.Close()
           EncryptionStream.Close()

           Return Tmp_Stream.ToArray
       Catch ex As Exception
           Debug.WriteLine(ex.Message)
           Return Nothing
       End Try
   End Function

   ''' <summary>
   ''' Decrypts array of Byte() using 128bit Rijndael(AES).
   ''' </summary>
   ''' <param name="Data">Byte array to decrypt</param>
   ''' <returns>decrypted byte array</returns>
   Public Overloads Function Decrypt(ByVal Data() As Byte) As Byte()
       Try

           Dim Tmp_Bytes(Data.Length - 1) As Byte
           Dim Tmp_Stream As New MemoryStream(Data)


           Dim Transform As ICryptoTransform
           Transform = CryptoEngine.CreateDecryptor(Key, IV)

           Dim EncryptionStream As CryptoStream
           EncryptionStream = New CryptoStream(Tmp_Stream, Transform, CryptoStreamMode.Read)

           EncryptionStream.Read(Tmp_Bytes, 0, Tmp_Bytes.Length)

           Tmp_Stream.Close()
           EncryptionStream.Close()

           Return Tmp_Bytes
       Catch ex As Exception
           Debug.WriteLine(ex.Message)
           Return Nothing
       End Try
   End Function

End Class

Edited by PrOpHeT
Life is a comedy to those who think; a tragedy to those who feel.
Posted

OK, don't you just hate that just after you ask a question it becomes apparent :mad:

 

It makes perfect sense now I am getting the extra bytes due to the fact i am declaring my read buffer equal to the encrypted bytes (padded for the block cipher *DUH*)

Life is a comedy to those who think; a tragedy to those who feel.
Posted (edited)

Hmm, this has raised another interesting question, is how do I know what to dimension my byte array to not knowing what the original data size is?

 

I tried EncryptedStream.Length which is apparently not valid (documentation states "This property exists only to support inheritance from Stream, and cannot be used.") 'O Joy

Edited by PrOpHeT
Life is a comedy to those who think; a tragedy to those who feel.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...