Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Vectivus en Diciembre 21, 2011, 09:04:00 PM

Título: Encriptar/cifrar o algo asi el save
Publicado por: Vectivus en Diciembre 21, 2011, 09:04:00 PM
Hola a todos, tengo una duda respecto a los saves.

Aunque tambien influye en otro tipo de juegos, para crear un juego del estilo "I wanna be the guy" ocurre que tienes que pones los saves para que se guarde partida, archive las coordenadas y lo que posees o cualquier informaci?n.

Pues a mi me surge un problema, un dia jugando un "IWBT" se me bugeo una parte, y lo intente solucionar desde el save, y me fije en que el save apenas tenias que abrirlo con el bloc de notas y ya puedes editarte todo, la posici?n las pertenencias etc, es decir todo.

Yo pensaba que no tenia solucion, pero tras revisar otros "IWBT" vi que al abrirlos solo se veian muchisimos espacios y algun simbolo como &%/& o cosas as?, y eso es justo lo que quiero. ?Podriais decirme la forma de hacer que los saves guarden la partida de esa forma cifrada especial para que no se pueda editar?

Me gustaria que mis juegos no los puedieran editar :)

Please. ?Cual es la forma?
Título: Re: Encriptar/cifrar o algo asi el save
Publicado por: henkuu en Diciembre 22, 2011, 09:28:36 AM
Lo m?s com?n ser?a utilizar una DLL especializada en encriptaci?n de texto; en Game Maker est? disponible Base64, la puedes encontrar en el anexo de DLLs del subforo de F.A.Q.

En mi experiencia, utilizar sistemas o algoritmos de encriptaci?n populares por si solo no sirve de mucho (finalmente, alguien utilizando el mismo m?todo, te va a desencriptar el archivo y volverlo a encriptar). Tienes que darle un apoyo o crear tu propio algoritmo de encriptaci?n.

Hace tiempo, utilizaba archivos de lenguaje externo para tener varias traducciones del juego de la manera m?s f?cil posible, y me preocupaba mucho que un pelele metiera mano a los archivos haciendo uso de su bendito argot.

Lo que hice fue crear un algoritmo que generase un "c?digo de seguridad", parseando letra por letra el contenido del archivo. El "c?digo de seguridad" se generaba haciendo toda clase de operaciones (conversiones a valores ASCII, valores ASCII modificados por ecuaciones, reemplazo de cadenas por s?mbolos  especiales, etc?tera). La idea era que el algoritmo generara un "c?digo de seguridad" corto, pero al ser resultado de un parseo letra a letra, UNA SOLA LETRA diera resultado a un c?digo totalmente distinto.

OBVIO, ese c?digo era IMPOSIBLE de desencriptar (hasta para m?), por la p?rdida de informaci?n en las operaciones y conversiones.

?Y eso de qu? serv?a si NO encriptaba el archivo? Bueno, teniendo el generador de "c?digos de seguridad", generaba los c?digos del contenido de MIS archivos originales, insert?ndolos al final del archivo. Posteriormente, en el juego, utilizando el mismo algoritmo, se parseaba el archivo generando de nuevo un c?digo de seguridad, para compararlo con el c?digo anexado en el archivo.

Si los c?digos coincid?an, quer?a decir que el archivo NO hab?a sido maleado; si eran diferentes, significaba que ALGUIEN modific? por lo menos una letra del archivo, pues el algoritmo habr?a generado un c?digo DISTINTO al anexado en el archivo original, y de esa manera pod?as EVITAR  su lectura.

En pocas palabras, aunque le dabas permiso al usuario de poder leer el contenido de los archivos, si se atrev?an a modificarlos (pasandose de listillos), se hallar?an con la linda sorpresa de que su archivo no puede ser le?do.

Hacer un algoritmo de ese tipo no es muy complejo, aqu? te anexo un ejemplo MUY soso y programado a la r?pida:"

[gml]texto = argument0;
//ejemplo: ""Lorem ipsum dolor sit amet ac nisi enim. Duis tempor risus id massa placerat lacinia."";\
encriptacion = 0;
contador = 0;

for(i = 0; i <=string_length(texto); i += 1)
{
   letra = string_char_at(texto, i);
   
   if(contador == 0)
   {encriptacion += (real(ord(letra)) ^ 2);}
   else if(contador == 1)
   {encriptacion *= (real(ord(letra)) / 3);}
   else  if(contador == 2)
   {encriptacion /= real(ord(letra));}
   else if(contador == 3)
   {encriptacion -= real(ord(letra));}
   else if(contador == 4)
   {encriptacion += (real(ord(letra)) / 10) ^ 3;}
   else if(contador == 5)
   {encriptacion /= (real(ord(letra)) / 8) ^ 2;}
   
   if(contador < 5)
   {contador += 1;}
   else
   {contador = 0;}
}

return encriptacion;[/gml]

Lo que har?a este algoritmo (repito soso y mal hecho) ser?a regresarte un valor num?rico de acuerdo al string insertado (argument0), que deber?a ser distinto nada mas con cambiar una sola letra de un string.

Tu puedes reforzarlo agregando mas operaciones a los valores ASCII (obtenidos de la funci?n ord(); ), o reemplazando letras por cadenas, etc?tera.

El mecanismo para hacer todo lo que te dije no se te deber?a complicar mucho programarlo :P.

Saludos.
Título: Re: Encriptar/cifrar o algo asi el save
Publicado por: Vectivus en Diciembre 22, 2011, 06:40:34 PM
Creo que mas o menos lo he entendido, har? un par de pruebas y dir? como ha ido.

Gracias