Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Encriptar/Desencriptar clase y de/serializar a fichero

Iniciado por iRobb, Abril 23, 2016, 01:35:42 AM

Tema anterior - Siguiente tema
Abril 23, 2016, 01:35:42 AM Ultima modificación: Abril 23, 2016, 01:38:06 AM por iRobb
Dado un topic por aquí de alguien que le han pirateado el juego que ha colgado (luego coloco el link de este topic en el referido) he decidido hacer una par de funciones para poder serializar y deserializar cualquier clase a un fichero, pero con la diferencia que el fichero queda encriptado.La parte del encriptado no la he puesto, ya que al final cada uno hace el suyo a partir de las funciones de .NET. Lo único que requieren las funciones son chorreos de byte[] tanto de entrada como de salida. No es muy difícil de hacer y si os interesa lo puedo explicar más adelante. Pero vamos a lo que os comentaba:Para serializar la clase, que aquí se llama _parametersData (puede ser cualquier clase) y guardarla en el persistentPath, tenemos:
FileStream stream = File.Create(Application.persistentDataPath + "/" + this.PlayerDataFile);
            using (MemoryStream mstream = new MemoryStream()) {
                BinaryFormatter bf = new BinaryFormatter();
                // Buffer 16Kb
                byte[] buffer = new byte[16384];
                // Encrypted bytes to be written
                byte[] encrypted;
                int bytesWrite;

                // First serialize class
                bf.Serialize(mstream, this._parametersData);
                // Encrypt data
                encrypted = cDataCryptManager.encryptBytes(mstream.ToArray());

                using (MemoryStream msEncrypted = new MemoryStream(encrypted)) {
                    msEncrypted.Seek(0, SeekOrigin.Begin);
                    msEncrypted.Flush();

                    // Now write to file in chunks
                    while ((bytesWrite = msEncrypted.Read(buffer, 0, buffer.Length)) > 0) {
                        stream.Write(buffer, 0, bytesWrite);
                    }
                }
            }
            // Close file stream
            stream.Close();
  • PlayerDataFile es el nombre del fichero con el cual vamos a guardar la clase.
  • Serializamos la clase _parametersData en un memoryStream.
  • La función static encryptBytes de la clase static cDataCryptManager es una función que recibe byte[] y devuelve byte[]. Lo único que tenéis que hacer es procesarlos con el algoritmo que más os guste y devolverlo igual en byte[].
  • Luego procesamos en otro memoryStream los byte[] encriptados y los guardamos en el fichero en bloques de 16Kb en este caso.
Hasta aquí la serialización encriptada. Si queréis que continue me lo decís.


Abril 23, 2016, 02:26:38 AM #2 Ultima modificación: Abril 23, 2016, 08:41:24 AM por iRobb
No funciona bien en Android. Además, esto solamente es un checksum. No encripta nada.Me refiero a lo del genuine claro. Las funciones que he puesto más arriba sí. Además, el propio algoritmo de encriptación/desencriptación ya funciona como un checksum.

Abril 23, 2016, 04:21:20 AM #3 Ultima modificación: Abril 23, 2016, 04:27:20 AM por pioj
Me llama mucho la atención la forma en la que haces uso del Using para instanciar...
using (MemoryStream msEncrypted = new MemoryStream(encrypted)) {
...
}
A qué es debido? Qué ventajas o inconvenientes tiene esta implementación, respecto a la típica de declarar la variable antes, e inicializarlo más tarde en el código?Me voy a poner a buscar más referencias de ésto, a ver qué le encuentro... [Update]Meh!, Vaya chasco, resulta que es la sintaxis habitual de cómo se crear el stream... Me he ilusionado por nada  XDD

Si, en el memstream es típico. Cuando son variables locales con un alcance limitado el using lo hace más claro el código.Con el filestream hago cosas después que no venían al caso y lo reconvertí al típico.

Etiquetas: