Marzo 25, 2016, 08:24:57 PM Ultima modificación: Marzo 25, 2016, 08:42:27 PM por NiuWeb
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]
alaberga regué el café.

BA:STFW&RTFM

Me acabo de meter a tu blog... Esta weno :)

pa cuando terminarás tu proyecto ese para hacer dibujos??

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]

#3 Abril 02, 2016, 09:31:59 PM Ultima modificación: Abril 03, 2016, 01:53:05 AM por NiuWeb
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"
alaberga regué el café.

BA:STFW&RTFM

#4 Abril 02, 2016, 11:03:30 PM Ultima modificación: Abril 02, 2016, 11:40:38 PM por brunoxzx
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.