Comunidad Game Maker

Ayuda => Desarrollo de Scripts => Mensaje iniciado por: bygdle en Marzo 25, 2016, 08:24:57 PM

Título: Sistema de encriptación #2
Publicado por: bygdle en Marzo 25, 2016, 08:24:57 PM
Autor: NiuWeb
Versión de GM utilizada: GMS 1.4.1657 stable, aunque funciona perfectamente en GM8.0
Descripción: Encripta una cadena con una contraseña para hacer ilegible su contenido. A diferencia del primer sistema que hice (ronda por aquí en esta sección), este sistema no devuelve caracteres especiales, y por ello los resultados son más "normales", aparte de que el proceso de encriptación es diferente. Pero este sistema tiene dos desventajas: Las cadenas encriptadas resultantes tienen un largor 25 veces mayor a la cadena original, lo que le hace un poco tedioso con cadenas muy largas.  La otra es que si la cadena a encriptar tiene un caracter con valor decimal mayor a 99999, el proceso fallará y no se encriptará como debe D:

Código:
Encriptador:
[gml]
///encode(str, key);
var str, key;
str = string(argument0);
key = string(argument1);
var i, j, d, c, nstr1, nstr2;
nstr2 = "";
nstr1 = "";
for(i = 1; i <= string_length(str); i += 1)
{
    c = string(ord(string_char_at(str, i)));
    while(string_length(c) < 5)
        c = "0"+c;
    nstr1 += c;
}
for(j = 1; j <= string_length(key); j += 1)
{
    d = string(ord(string_char_at(key, j)));
    while(string_length(d) < 5)
        d = "0" + d;
    nstr2 += d;
}

if string_length(nstr2) > string_length(nstr1)
    nstr2 = string_copy(nstr2, 1, string_length(nstr1));
while(string_length(nstr2) < string_length(nstr1))
    nstr2 += string_copy(nstr2, 1, string_length(nstr1) - string_length(nstr2));
   
var str2, k, l, e, f, str3;
str2 = "";
str3 = "";

for(k = 1; k <= string_length(nstr1); k += 1)
{
    e = chr(ord(string_char_at(nstr1, k)) + ord(string_char_at(nstr2, k)));
    str2 += e;
}
for(l = 1; l <= string_length(str2); l += 1)
{
    f = string(ord(string_char_at(str2, l)));
    while(string_length(f) < 5)
        f = "0" + f;
    str3 += f;
}
return str3;
[/gml]
Argumentos:
str: La cadena a encriptar
key: La clave para encriptar la cadena.

Ahora, el desencriptador:
[gml]
///decode(str, key);
var str, key;
str = string(argument0);
key = string(argument1);

var i, a, ns1;
ns1 = "";
for(i = 1; i < string_length(str); i += 5)
{
    a = chr(real(string_copy(str, i, 5)));
    ns1 += a;
}
var j, b, ns2;
ns2 = "";
for(j = 1; j <= string_length(key); j += 1)
{
    b = string(ord(string_char_at(key, j)));
    while(string_length(b) < 5)
        b = "0"+b;
    ns2 += b;
}
if string_length(ns2) > string_length(ns1)
    ns2 = string_copy(ns2, 1, string_length(ns1));
while(string_length(ns2) < string_length(ns1))
    ns2 += string_copy(ns2, 1, string_length(ns1) - string_length(ns2));

var k, c, d, e, ns3;
ns3 = "";
for(k = 1; k <= string_length(ns1); k += 1)
{
    c = string_char_at(ns1, k);
    d = string_char_at(ns2, k);
    e = ord(c) - ord(d);
    ns3 += chr(e);
}
var l, f, ns4;
ns4 = "";
for(l = 1; l <= string_length(ns3); l += 5)
{
    f = string_copy(ns3, l, 5);
    f = chr(real(string_digits(f)));
    ns4 += f;
}
return ns4;
[/gml]
Argumentos:
str: Una cadena encriptada por el script anterior, la que queremos desencriptar.
key: La clave con la que se encriptó la cadena.


[spoiler]Spam:
http://niuweb-blog.blogspot.com.co/2016/03/sistema-de-encriptacion-de-cadenas-para.html
[/spoiler]
Título: Re:Sistema de encriptación #2
Publicado por: VisualGames en Marzo 25, 2016, 09:25:17 PM
Me acabo de meter a tu blog... Esta weno :)

pa cuando terminarás tu proyecto ese para hacer dibujos??
Título: Re:Sistema de encriptación #2
Publicado por: brunoxzx en Abril 02, 2016, 09:18:15 PM
Mira, yo lo habría escrito así.
[gml]///encode(str, key);
var str, key, i, nstr1, nstr2, str2, size;
str = string(argument0);
key = string(argument1);
nstr2 = "";
nstr1 = "";

for(i = 1; i <= string_length(str); i += 1)
{
    nstr1 += "00000"+string_char_at(str, i);
}
//Puedes usar i en ambos casos, usar otra variable como j es para ciclos anidados...
for(i = 1; i <= string_length(key); i += 1)
{
    nstr2 += "00000"+string_char_at(key, i);
}

str2 = "";
size=string_length(nstr1);
//Normalmente es mejor guardar el numero de veces que se va a iterar en un ciclo, así no tienes que calcular el largo de tu cadena cada vez.

for(i = 1; i <= size; i += 1)
{
    str2 += "00000" + string_char_at(nstr1, i) + ( string_char_at(nstr2, 1+ ( (i-1) mod size ) )  );
}
return str2;[/gml]
Título: Re:Sistema de encriptación #2
Publicado por: bygdle en Abril 02, 2016, 09:31:59 PM
Yo no, porque sencillamente tu código no hace lo que el mio.
Por ejemplo, si tengo una string como "ABC" tu código devolvería "00000A00000B00000C", en cambio, el mio devolvería la string como "000970009800099"
Título: Re:Sistema de encriptación #2
Publicado por: brunoxzx en Abril 02, 2016, 11:03:30 PM
Cita de: NiuWeb en Abril 02, 2016, 09:31:59 PM
Yo no, porque sencillamente tu código no hace lo que el mio.
Por ejemplo, si tengo una estructura como "ABC" tu código devolvería "00000A00000B00000C", en cambio, el mio devolvería la str como "000970009800099"
Oh, tienes razón, , me confundí, por algúna razón creí que estabas redundando, siendo ese el caso, está bien que uses el while.
Para que quede como dices lo habría hecho así (pero no te confundas el while está perfecto)...

[gml]
///encode(str, key);
var str, key, i, nstr1, nstr2, str2, size, s;
str = string(argument0);
key = string(argument1);
nstr2 = "";
nstr1 = "";

for(i = 1; i <= string_length(str); i += 1)
{
    s=string( ord( string_char_at(str, i) ) );
    nstr1 += string_repeat('0', 5-string_length(s) ) + s;
}
//Puedes usar i en ambos casos, usar otra variable como j es para ciclos anidados...
for(i = 1; i <= string_length(key); i += 1)
{
    s=string( ord( string_char_at(key, i) ) );
    nstr2 += string_repeat('0', 5-string_length(s) ) + s;
}

str2 = "";
size=string_length(nstr1);
//Normalmente es mejor guardar el numero de veces que se va a iterar en un ciclo, así no tienes que calcular el largo de tu cadena cada vez.

for(i = 1; i <= size; i += 1)
{
    s= string( ord( string_char_at(nstr1, i) ) + ord( string_char_at(nstr2, 1+ ( (i-1) mod size ) ) ) )
    str2 += string_repeat('0', 5-string_length(s) ) + s;
}
return str2;
[/gml]

En todo caso la optimizacion está en quitar los ciclos que hacen que la llave tenga el mismo tamaño que el texto.