Solved

Serialize, encrypt & Deserialize, decrypt

Posted on 2006-06-27
5
835 Views
Last Modified: 2010-05-19
vb2005

i am trying to serialize some data and then encrypt it. The encryption process goes fine i think, no errors there. Its when i decrypt that i get the errors. could somebody help me with the code?

1 form with 2 buttons and some textboxes has to serialize some of the data in the textboxes and store as a file. first button encrypts, second button decrypts.

my code for encrypting goes like this:
            Dim fs As New FileStream(sFile, FileMode.Create) ', FileAccess.Write, FileShare.Write)
            ' Construct a formatter.
            Dim Formatter As New BinaryFormatter
            ' Create the cryptographic object.
            Dim Rijndael As New RijndaelManaged()
            ' Serialize the object to file and encrypt it.
            Dim cs As New CryptoStream(fs, Rijndael.CreateEncryptor(Key, IV), CryptoStreamMode.Write)
            Formatter.Serialize(cs, fd)

my code for decrypting goes like this:
            Dim fs As New FileStream(sFile, FileMode.Create, FileAccess.Read, FileShare.Write)
            ' Construct a formatter.
            Dim Formatter As New BinaryFormatter
            ' Create the cryptographic object.
            Dim Rijndael As New RijndaelManaged()
            ' Deserialize the object to file and decrypt it.
            Dim cs As New CryptoStream(fs, Rijndael.CreateDecryptor(Key, IV), CryptoStreamMode.Read)
            fd = TryCast(Formatter.Deserialize(cs), FormData)

on the line fd = TryCast(Formatter.Deserialize(cs), FormData) i get the following error: Cryptographic exception was unhandled: Padding is invalid and cannot be removed.

any help or link greatly appreciated. thanks
0
Comment
Question by:newyuppie
  • 3
  • 2
5 Comments
 
LVL 4

Expert Comment

by:sr101880
Comment Utility
You should cange your Filemode.Create to Filemode.open in your decrypting section.  Let me know if you have any questions.
0
 
LVL 13

Author Comment

by:newyuppie
Comment Utility
ok did that but keep getting the padding error still.
any ideas?
0
 
LVL 4

Accepted Solution

by:
sr101880 earned 500 total points
Comment Utility
Here is a good sample I found on the net that has everything you need.

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

Module RijndaelSample

    Sub Main()
        Try
            ' Create a new Rijndael object to generate a key
            ' and initialization vector (IV).
            Dim RijndaelAlg As Rijndael = Rijndael.Create

            ' Create a string to encrypt.
            Dim sData As String = "Here is some data to encrypt."
            Dim FileName As String = "CText.txt"

            ' Encrypt text to a file using the file name, key, and IV.
            EncryptTextToFile(sData, FileName, RijndaelAlg.Key, RijndaelAlg.IV)

            ' Decrypt the text from a file using the file name, key, and IV.
            Dim Final As String = DecryptTextFromFile(FileName, RijndaelAlg.Key, RijndaelAlg.IV)

            ' Display the decrypted string to the console.
            Console.WriteLine(Final)
        Catch e As Exception
            Console.WriteLine(e.Message)
        End Try

        Console.ReadLine()

    End Sub


    Sub EncryptTextToFile(ByVal Data As String, ByVal FileName As String, ByVal Key() As Byte, ByVal IV() As Byte)
        Try
            ' Create or open the specified file.
            Dim fStream As FileStream = File.Open(FileName, FileMode.OpenOrCreate)

            ' Create a new Rijndael object.
            Dim RijndaelAlg As Rijndael = Rijndael.Create

            ' Create a CryptoStream using the FileStream
            ' and the passed key and initialization vector (IV).
            Dim cStream As New CryptoStream(fStream, _
                                           RijndaelAlg.CreateEncryptor(Key, IV), _
                                           CryptoStreamMode.Write)

            ' Create a StreamWriter using the CryptoStream.
            Dim sWriter As New StreamWriter(cStream)

            Try

                ' Write the data to the stream
                ' to encrypt it.
                sWriter.WriteLine(Data)
            Catch e As Exception

                Console.WriteLine("An error occurred: {0}", e.Message)

            Finally

                ' Close the streams and
                ' close the file.
                sWriter.Close()
                cStream.Close()
                fStream.Close()

            End Try
        Catch e As CryptographicException
            Console.WriteLine("A Cryptographic error occurred: {0}", e.Message)
        Catch e As UnauthorizedAccessException
            Console.WriteLine("A file error occurred: {0}", e.Message)
        End Try
    End Sub


    Function DecryptTextFromFile(ByVal FileName As String, ByVal Key() As Byte, ByVal IV() As Byte) As String
        Try
            ' Create or open the specified file.
            Dim fStream As FileStream = File.Open(FileName, FileMode.OpenOrCreate)

            ' Create a new Rijndael object.
            Dim RijndaelAlg As Rijndael = Rijndael.Create

            ' Create a CryptoStream using the FileStream
            ' and the passed key and initialization vector (IV).
            Dim cStream As New CryptoStream(fStream, _
                                            RijndaelAlg.CreateDecryptor(Key, IV), _
                                            CryptoStreamMode.Read)

            ' Create a StreamReader using the CryptoStream.
            Dim sReader As New StreamReader(cStream)

            ' Read the data from the stream
            ' to decrypt it.
            Dim val As String = Nothing

            Try

                val = sReader.ReadLine()

            Catch e As Exception
                Console.WriteLine("An Cerror occurred: {0}", e.Message)
            Finally
                ' Close the streams and
                ' close the file.
                sReader.Close()
                cStream.Close()
                fStream.Close()


            End Try

            ' Return the string.
            Return val

        Catch e As CryptographicException
            Console.WriteLine("A Cryptographic error occurred: {0}", e.Message)
            Return Nothing
        Catch e As UnauthorizedAccessException
            Console.WriteLine("A file error occurred: {0}", e.Message)
            Return Nothing
        End Try
    End Function
End Module
0
 
LVL 13

Author Comment

by:newyuppie
Comment Utility
i figured it out, oddly enough just 1 line of code was sufficient to eliminate the padding error:

i added

cs.FlushFinalBlock

after encrypting. seems that gets rid of some remaining block of text which was causing the problems.

anyway i have decided to give the points to sr101880 because the code he provided served me to double check my code and because apparently its the only code i have seen that is not C# and that it has everything that i need. if you have the time please tell me how you googled for that!

thank you very much for this helpful code and probably will serve to others who search for this too.
0
 
LVL 4

Expert Comment

by:sr101880
Comment Utility
Good work!  I went to google typed in cryptostream and it was the first hit that came up on the screen.  The example is half way down the page.  :-)
0

Featured Post

Maximize Your Threat Intelligence Reporting

Reporting is one of the most important and least talked about aspects of a world-class threat intelligence program. Here’s how to do it right.

Join & Write a Comment

Introduction As chip makers focus on adding processor cores over increasing clock speed, developers need to utilize the features of modern CPUs.  One of the ways we can do this is by implementing parallel algorithms in our software.   One recent…
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
Illustrator's Shape Builder tool will let you combine shapes visually and interactively. This video shows the Mac version, but the tool works the same way in Windows. To follow along with this video, you can draw your own shapes or download the file…
This video demonstrates how to create an example email signature rule for a department in a company using CodeTwo Exchange Rules. The signature will be inserted beneath users' latest emails in conversations and will be displayed in users' Sent Items…

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now