Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: bygdle en Enero 10, 2016, 12:38:55 AM

Título: [Solucionado]Error con sistema de encriptación
Publicado por: bygdle en Enero 10, 2016, 12:38:55 AM
Hola, en el proyecto que estoy haciendo llegué a un punto en el que es completamente necesario crear una encriptación para archivos de información, pero esta encriptación no puede ser desencriptable fácilmente, necesita una "clave" para desencriptarla. Por eso el base64 queda fuera, y los Hash igual, así que decidí buscar algunos ejemplos de cualquier lenguaje, y encontré uno muy bueno en PHP, así que me dediqué a traducirlo a GML. Al final me quedó así:

[gml]
///encode
str = argument0;
key = argument1;
result = "";

for(i=0;i<string_length(str);i++)
{
result += chr(string_ord_at(str,i) + string_ord_at(key,i));
}
return base64_encode(result);
[/gml]

Lo cual hace que así se desencripte el base64, haya un segundo nivel de protección para desencriptar el contenido, y este nivel es el que está protegido con contraseña.
Ahora, la desencriptación:

[gml]
///decode
str = base64_decode(argument0);
key = argument1;
result = "";

for(i=0;i<string_length(str);i++)
{
result += chr(string_ord_at(str,i) - string_ord_at(key,i));
}
return result;
[/gml]

Y se supone que con esto debería funcionar, pero sencillamente desencripta cosas que no son, por ejemplo, si encripto "hola", al desencriptar lo que ha encriptado me sale "hhhy", y cosas por el estilo

¿Alguien puede encontrar cuál es el error en este código? Yo no encuentro qué está mal, y aclaro que la clave de encriptación siempre es la misma por si alguien sale con esa idea xD
Título: Re:Error con sistema de encriptación
Publicado por: jmbs19 en Enero 11, 2016, 12:31:15 AM
pues a mi me parece que el problema radica en que tu key no tiene la misma longitud que tu string a encriptar/desencriptar, tu script "string_ord_at", el que no vi antes, entiendo que te da el valor de char de una letra en la posicion x del string, entonces en tu bucle tu le sumas la misma posicion de ambos string, la key y el string a codificar/decodificar, esto no tiene problema hasta que a tu key se le acaban las letras, yo te sugeriria que hicieras lo siguiente, suma todo los valores de tu key en un solo valor y eso es lo que le restaras/sumaras a cada posicion de tu string a codificar/decodificar.

en cualquier caso "string_ord_at" no es una funcion, es un script, y necesitariamos verla para tener una vision mas amplia de tu script codificador y ver donde esta el error.
Título: Re:Error con sistema de encriptación
Publicado por: bygdle en Enero 11, 2016, 02:06:47 AM
Bueno, voy a probar lo de la longitud, se me ha ocurrido algo, que es repetir la clave X veces para rellenar lo que le hace falta para quedar de igual longitud a la cadena...a ver si es eso

Otra cosa, ¿Cómo que string_ord_at() no es una función?, yo la uso a diario, y es más, mira:
(https://i.gyazo.com/bc700963e28d3c2ca1897f3154b2ddd7.png)

En mi GMS (1.4.1657) string_ord_at() es una función...


EDIT: antes de hacer los cambios de la key nombrados arribita (^), hice una pequeña prueba, encriptando "hola" con la clave "hola" (según lo que dice jmbs19, debería funcionar así), y al encriptarlo, me sale esto "w5DDkMOew5g=",el problema radica en que cuando lo desencripto, me sale esta mierda: "hhar"....el GM me odia T_T
Título: Re:Error con sistema de encriptación
Publicado por: jmbs19 en Enero 11, 2016, 02:37:08 AM
Pues la verdad no me sale. Incluso busque en san Google y no encontré esa funciona nisiquiera en el manual http://docs.yoyogames.com/source/dadiospice/002_reference/strings/index.html . De todas maneras me parece que tu error tambien parece estar en i=0 dentro de tu for. Porque esa posicion no existe. Ademas ese for deberia ser <= porque si no es asi la última posicion no se tomara en cuenta. Entonces para resumir me parece que tu problema son una serie de errores.
Título: Re:Error con sistema de encriptación
Publicado por: bygdle en Enero 11, 2016, 02:50:51 AM
Bueno, lo de la función ya tengo claro que sí existe. No aparece en el manual online, pero si miras el que viene con GMS, podrás encontrar la función completamente documentadita

Cambié lo del for, poniendo i=1;i<=(...), y me funcionó perfecto. Desencripto bien...PEEERO...
La seguridad es baja. Si intentas desencriptar con una clave incorrecta, sólo aparecen incorrectos los X (donde X = string_length(key)) primeros caracteres de la cadena, lo cual hace bastante inseguro.
Comento que ya cambié el código, no sé si está bien, pero lo puese así:
[gml]
///encode( str, key );
var str = argument0;
var key = argument1;

//Aquí, esto es lo importante...se supone que se rellena la clave para quedar igual que la cadena, pero si no marqué como solucionado es porque no funca xD
if string_length(key) < string_length(str)
{
    var falt = string_length(str) - string_length(key);
    var mas = string_copy(key,1,falt);
    key += mas;
}

result = "";

for(i=1;i<=string_length(str);i++)
{
result += chr(string_ord_at(str,i) + string_ord_at(key,i));
}
return base64_encode(result);
[/gml]

[gml]
///decode( str, key );
str = base64_decode(argument0);
key = argument1;
result = "";

//Igual que en a codificación
if string_length(key) < string_length(str)
{
    var falt = string_length(str) - string_length(key);
    var mas = string_copy(key,1,falt);
    key += mas;
}

for(i=1;i<=string_length(str);i++)
{
result += chr(string_ord_at(str,i) - string_ord_at(key,i));
}
return result;
[/gml]
Título: Re:Error con sistema de encriptación
Publicado por: jmbs19 en Enero 11, 2016, 03:18:47 AM
Sigue teniendo el mismo problema de la longitud de tu key. El problema es que con eso ahora a lo sumo lo que hace es copiarlo dos veces. Esto es debido a que estás usando mal la función String copy http://docs.yoyogames.com/source/dadiospice/002_reference/strings/string_copy.html después de la última posición de tu key lo único que vas a estar copiando son caracteres vacíos. Es por eso que después de cierto número de caracteres dejara de codificarlo.

Ps: estoy escribiendo desde un teléfono usando la herramienta de reconocimiento de vos. Porque me cansé del teclado táctil. Esa es la razón por la que hay tantos acentos.
Título: Re:Error con sistema de encriptación
Publicado por: bygdle en Enero 11, 2016, 03:27:18 AM
Oka, ya entiendo. Pero ahora mismo no se me ocurre una forma de "copypastear" la cadena como se supone debería hacerlo.
¿Cómo me recomiendas que lo haga?
Título: Re:Error con sistema de encriptación
Publicado por: jmbs19 en Enero 11, 2016, 03:41:37 AM
Como dije en el mensaje anterior estoy desde un teléfono. Así que no puedo escribir muy bien código. Así que lo que haré explicarte cómo hacerlo. Primero cambia el if por un while. Segundo, en vez de usar copy string has key +=key_original. y tercero quita lo del falt = ... y mas=....

Te pongo lo de la key original para evitar crear un String demasiado largo. Por supuesto esta variable debería de haberse creado anteriormente con el argumento key
Título: Re:Error con sistema de encriptación
Publicado por: arcangelcaos en Enero 11, 2016, 01:57:05 PM
Hola, no me leo el tocho entero, sorry.
Aquí te dejos varios ejemplos de encriptación que tenia por aki en el pc.

Mira haber si alguno te puede valer.

Saludos.
Título: Re:Error con sistema de encriptación
Publicado por: bygdle en Enero 11, 2016, 08:34:43 PM
No, arcangelcaos, ni siquiera lo voy a descargar xD . La razón es que sencillamanet el título dice "Error con sistema de encriptación", no dice "denme un sistema de encriptación". No me gusta copypastear y ya, prefiero hacer mis propios códigos, y si necesito ayuda, pues abro un tema como este xD

Volviendo al tema, usé un while como dijo jmbs19, y sirvió a la perfección. Aquí dejo cómo quedó el código:

[gml]
///encode( str, key );
var str = argument0;
var key = argument1;

while string_length(str) > (string_length(key) + 1)
         {
            var rest = string_length(str) - string_length(key);
            var falt = string_copy(key,1,rest);
            key += falt;
         }
//show_message(key);

result = "";

for(i=1;i<=string_length(str);i++)
{
    result += chr(string_ord_at(str,i) + string_ord_at(key,i));
}
return base64_encode(result);
[/gml]

[gml]
///decode( str, key );
str = base64_decode(argument0);
key = argument1;
result = "";

while string_length(str) > (string_length(key) + 1)
         {
            var rest = string_length(str) - string_length(key);
            var falt = string_copy(key,1,rest);
            key += falt;
         }
//show_message(key);

for(i=1;i<=string_length(str);i++)
{
result += chr(string_ord_at(str,i) - string_ord_at(key,i));
}
return result;
[/gml]

SOLUCIONAOH
Título: Re:[Solucionado]Error con sistema de encriptación
Publicado por: kostra en Enero 12, 2016, 12:21:41 AM
guarda eso bajo llave, ya te lo pediré :B
Título: Re:[Solucionado]Error con sistema de encriptación
Publicado por: Grewyks en Enero 12, 2016, 12:26:32 AM
Muchos  XD  es muy bueno.