C # - La serialización / deserializar un archivo cifrado DES de una corriente
-
12-09-2019 - |
Pregunta
¿Alguien tiene algún ejemplo de cómo cifrar datos serializados en un archivo y luego leer de nuevo usando el DES?
He escrito algo de código ya que no funciona, pero yo prefiero ver un nuevo intento en lugar de perseguir mi código.
Editar : Lo sentimos, se olvidó de mencionar que necesito un ejemplo usando XmlSerializer.Serialize / Deserialize
.Solución
Cifrado
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);
}
}
}
Descifrado:
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);
}
}
}
Uso:
DESCryptoServiceProvider key = new DESCryptoServiceProvider();
MyObject obj = new MyObject();
EncryptAndSerialize("testfile.xml", obj, key);
MyObject deobj = DecryptAndDeserialize("testfile.xml", key);
Es necesario cambiar MiObjeto a cualquiera que sea el tipo de su objeto es que está serializando, pero esta es la idea general. El truco es utilizar la misma instancia SymmetricAlgorithm para cifrar y descifrar.
Otros consejos
Este hilo dio la idea básica. Aquí hay una versión que hace las funciones genéricas, y también le permite pasar una clave de cifrado por lo que es 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);
}
Aquí es un ejemplo de encriptación DES / decription para una cadena.