2016-04-21 4 views
0

ich einen Weg gefunden, zu verschlüsseln und serialise/de serialise ein ObjektAnwendung stoppt während/nach der Verschlüsselung/Serialisierung

C# Encrypt serialized file before writing to disk

Hier ist mein Code ...

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Runtime.Serialization.Formatters.Binary; 
using System.Security.Cryptography; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Digital_Only_Calculator 
{ 
    class EncryptionSerialiser 
    { 

     byte[] key = { 1, 2, 3, 4, 5, 6, 7, 8 }; // Where to store these keys is the tricky part, 
               // you may need to obfuscate them or get the user to input a password each time 
     byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 }; 
     string path = Application.StartupPath + @"\" + "test.ser"; 
     DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 



     public void EncryptThenSerialise(object obj) 
     { 

      // Encryption 
      using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write)) 
      using (var cryptoStream = new CryptoStream(fs, des.CreateEncryptor(key, iv), CryptoStreamMode.Write)) 
      { 
       BinaryFormatter formatter = new BinaryFormatter(); 

       // This is where you serialize the class 
       formatter.Serialize(cryptoStream, obj); 

      } 
     } 
public Person DecryptThenSerialise(object obj) 
     { 
      // Decryption 
      using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read)) 
      using (var cryptoStream = new CryptoStream(fs, des.CreateDecryptor(key, iv), CryptoStreamMode.Read)) 
      { 
       BinaryFormatter formatter = new BinaryFormatter(); 

       // This is where you deserialize the class 
       Person deserialized = (Person)formatter.Deserialize(cryptoStream); 

       return deserialized; 
      } 
     } 
    } 
} 

Und den Code für Testen ...

Person p = new Person(); 

      p.Name = "Bill"; 
      p.Age = 40; 


      EncryptionSerialiser ESER = new EncryptionSerialiser(); 
      ESER.EncryptThenSerialise(p); 

      Person p2 = new Person(); 

      p2 = ESER.DecryptThenSerialise(p2); 

Das Problem ist, die Anwendung wird nicht fortgesetzt nach dieser Zeile (die Sie oben in der EncryptThenSerialise-Methode sehen können.

formatter.Serialize(cryptoStream, obj); 

Klasse Person ...

public class Person 
    { 
     public String Name { get; set; } 
     public int Age { get; set; } 
    } 

Es ist jedoch das Objekt zu verschlüsseln und serialise scheint, als eine neue Datei erstellt, die beim Öffnen Looks verschlüsselt. Es geht einfach nicht weiter, um dann die Serialisierung durchzuführen.

Irgendwelche Ideen jemand?

+0

"die Anwendung wird nach dieser Zeile nicht fortgesetzt" Hängt sie oder stürzt sie ab? –

+0

Es scheint zu "Break", d. H., Verlässt von der Methode und ermöglicht Benutzern, Steuerelemente Formen etc. zu verwenden. So ist es fast wie es "denkt", dass es fertig ist, aber es hat nicht. – user3755946

Antwort

0

Ich habe das Attribut [Serializable] zu meiner Personenklasse hinzugefügt. Alles funktioniert jetzt.

[Serializable] 
    public class Person 
    { 
     public String Name { get; set; } 
     public int Age { get; set; } 
    } 
Verwandte Themen