2013-09-04 5 views
4

Я сохраняю свой DataTable в файле, используя приведенную ниже функцию, которую я взял с веб-сайта. Код работает хорошо.Зашифрованная сериализация объектов в C#

Проблема заключается в том:

Я хочу, чтобы применить какой-то шифрования здесь. Как я могу это достичь?

public void SerializeObject<T>(T serializableObject, string fileName) 
    { 
     if (serializableObject == null) { return; } 

     try 
     { 
      XmlDocument xmlDocument = new XmlDocument(); 
      XmlSerializer serializer = new XmlSerializer(serializableObject.GetType()); 
      using (MemoryStream stream = new MemoryStream()) 
      { 
       serializer.Serialize(stream, serializableObject); 
       stream.Position = 0; 
       xmlDocument.Load(stream); 
       xmlDocument.Save(fileName); 
       stream.Close(); 
      } 
     } 
     catch (Exception ex) 
     { 
      //Log exception here 
     } 
    } 

Любая помощь очень ценится.

Благодаря

+1

Ну что вы пробовали? Я ожидаю, что вы просто сможете обернуть соответствующим образом сконфигурированный 'CryptoStream' вокруг' MemoryStream'. Обратите внимание, что вам не нужно вызывать 'stream.Close()', если он уже находится в соответствующем 'использовании'. –

+0

@JonSkeet Не могли бы вы предоставить какой-то код, где я могу связать «CryptoStream вокруг MemoryStream» – Moons

+0

@JonSkeet Я также думаю, что сначала я могу получить строку, а затем сделать шифрование, но мне нужно сохранить множество сложных списков классов и объект, который я не уверен, может быть преобразован в строку. – Moons

ответ

1

Encrypt/дешифрования потокового файла XML с указанным ниже классом: Вы можете использовать другую стратегию шифрования она в зависимости от ваших требований.

public static class EncryptionManagement 
{ 
    private static SymmetricAlgorithm encryption; 
    private const string password = "admin"; 
    private const string Mkey = "MY SECRET KEY"; 

    private static void Init() 
    { 
    encryption = new RijndaelManaged(); 
    var key = new Rfc2898DeriveBytes(password, Encoding.ASCII.GetBytes(Mkey)); 

    encryption.Key = key.GetBytes(encryption.KeySize/8); 
    encryption.IV = key.GetBytes(encryption.BlockSize/8); 
    encryption.Padding = PaddingMode.PKCS7; 
    } 

    public static void Encrypt(Stream inStream, Stream OutStream) 
    { 
    Init(); 
    var encryptor = encryption.CreateEncryptor(); 
    inStream.Position = 0; 
    var encryptStream = new CryptoStream(OutStream, encryptor, CryptoStreamMode.Write); 
    inStream.CopyTo(encryptStream); 
    encryptStream.FlushFinalBlock(); 
    } 


    public static void Decrypt(Stream inStream, Stream OutStream) 
    { 
    Init(); 
    var encryptor = encryption.CreateDecryptor(); 
    inStream.Position = 0; 
    var encryptStream = new CryptoStream(inStream, encryptor, CryptoStreamMode.Read); 
    encryptStream.CopyTo(OutStream); 
    OutStream.Position = 0; 
    } 
} 
+0

Это выглядит многообещающим.Позвольте мне попробовать его реализовать. – Moons

+0

Я думаю, что ваш код может определенно преобразовать шифрование потока, но он не останется в силе как xml, так как я получаю корневой элемент ошибки. – Moons

+0

Этот код использует твердую кодовую соль и, следовательно, жестко закодированный IV, нарушает два основных правила использования AES-CBC, не повторно использует IV с ключом и не имеет предсказуемого IV. – jbtule

Смежные вопросы