PrOpHeT Posted June 24, 2008 Posted June 24, 2008 (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 June 24, 2008 by PrOpHeT Quote Life is a comedy to those who think; a tragedy to those who feel.
PrOpHeT Posted June 24, 2008 Author Posted June 24, 2008 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*) Quote Life is a comedy to those who think; a tragedy to those who feel.
PrOpHeT Posted June 24, 2008 Author Posted June 24, 2008 (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 June 24, 2008 by PrOpHeT Quote Life is a comedy to those who think; a tragedy to those who feel.
PrOpHeT Posted June 24, 2008 Author Posted June 24, 2008 I found the solution here http://blogs.clearscreen.com/jfbonnin/archive/2007/05/28/6414.aspx Quote Life is a comedy to those who think; a tragedy to those who feel.
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.