C# - Serializing/Deserializing a DES encrypted file from a stream

后端 未结 3 828
感动是毒
感动是毒 2020-12-14 04:28

Does anyone have any examples of how to encrypt serialized data to a file and then read it back using DES?

I\'ve written some code already that isn\'t working, but I

相关标签:
3条回答
  • 2020-12-14 04:43

    Here is an example of DES encryption/decription for a string.

    0 讨论(0)
  • 2020-12-14 04:58

    Encryption

    public static void EncryptAndSerialize(string filename, MyObject obj, SymmetricAlgorithm key)
    {
        using(FileStream fs = File.Open(filename, FileMode.Create))
        {
            using(CryptoStream cs = new CryptoStream(fs, key.CreateEncryptor(), CryptoStreamMode.Write))
            {
                XmlSerializer xmlser = new XmlSerializer(typeof(MyObject));
                xmlser.Serialize(cs, obj); 
            }
        }
    }
    

    Decryption:

    public static MyObject DecryptAndDeserialize(string filename, SymmetricAlgorithm key)    
    {
        using(FileStream fs = File.Open(filename, FileMode.Open))
        {
            using(CryptoStream cs = new CryptoStream(fs, key.CreateDecryptor(), CryptoStreamMode.Read))
            {
                XmlSerializer xmlser = new XmlSerializer(typeof(MyObject));
                return (MyObject) xmlser.Deserialize(cs);
            }
        }
    }
    

    Usage:

    DESCryptoServiceProvider key = new DESCryptoServiceProvider();
    MyObject obj = new MyObject();
    EncryptAndSerialize("testfile.xml", obj, key);
    MyObject deobj = DecryptAndDeserialize("testfile.xml", key);
    

    You need to change MyObject to whatever the type of your object is that you are serializing, but this is the general idea. The trick is to use the same SymmetricAlgorithm instance to encrypt and decrypt.

    0 讨论(0)
  • 2020-12-14 05:03

    This thread gave the basic idea. Here's a version that makes the functions generic, and also allows you to pass an encryption key so it's reversible.

    public static void EncryptAndSerialize<T>(string filename, T obj, string encryptionKey) {
      var key = new DESCryptoServiceProvider();
      var e = key.CreateEncryptor(Encoding.ASCII.GetBytes("64bitPas"), Encoding.ASCII.GetBytes(encryptionKey));
      using (var fs = File.Open(filename, FileMode.Create))
      using (var cs = new CryptoStream(fs, e, CryptoStreamMode.Write))
          (new XmlSerializer(typeof (T))).Serialize(cs, obj);
    }
    
    public static T DecryptAndDeserialize<T>(string filename, string encryptionKey) {
      var key = new DESCryptoServiceProvider();
      var d = key.CreateDecryptor(Encoding.ASCII.GetBytes("64bitPas"), Encoding.ASCII.GetBytes(encryptionKey));
      using (var fs = File.Open(filename, FileMode.Open))
      using (var cs = new CryptoStream(fs, d, CryptoStreamMode.Read))
          return (T) (new XmlSerializer(typeof (T))).Deserialize(cs);
    }
    
    0 讨论(0)
提交回复
热议问题