¿Cómo sacar el algoritmo?

Iniciado por P44gl3, 13 Abril 2011, 23:59 PM

0 Miembros y 1 Visitante están viendo este tema.

P44gl3

#10
Hola Zosemu:

Muchas gracias por tu comentario. A ver, estoy de acuerdo contigo en algunas cosas y no en otras:

Es cierto que son dos caracteres, y el primero varía con la POSICIÓN, pero NO con el TAMAÑO.

Para demostrarlo me remito a esto que publiqué en uno de los primeros comentarios:

aaaa   ^@7xY;T6
aaaaaaaaaaaaaaaaa   ^@7xY;T6Q30qdF6wxZ#d^@I+wYG)6w$eX:

El tamaño de la cadena es distinto en ambos sin embargo (a partir del 4 caracteres) el primer carácter siempre es el mismo para cada CARÁCTER, en cada POSICIÓN.

Con respecto a que se modifica el primer carácter cuando el tamaño de la cadena es múltiplo de cuatro, tampoco creo que sea correcto. Te paso como referencia estos cifrados que también publiqué anteriormente:


00000   ]mVf(81A^n
00001   ]mVf(81A^o
00010   hxIYbrz,<L
00011   hxIYbrz,<M
00100   gw)9J[AQ!1
00101   gw)9J[AQ!2
00110   q"y*'8->]m
00111   q"y*'8->]n
01000   (8$5=MHX?O
01001   (8$5=MHX?P
01010   3Ct&x)3D{,
01011   3Ct&x)3D{-
01100   2BSd_pXh`p
01101   2BSd_pXh`q
01110   <LFW<MCT?O
01111   <LFW<MCT?P
10000   CTo >N3C4D
10001   CTo >N3C4E
10010   N_brx){-p!
10011   N_brx){-p"
10100   M^BR`qCSUe
10101   M^BR`qCSUf
10110   Wh5E=N.?4D
10111   Wh5E=N.?4E
11000   k|=NTdIYs$
11001   k|=NTdIYs%
11010   v(0A1A5FRb
11011   v(0A1A5FRc
11100   u'l}u'Yi6F
11101   u'l}u'Yi6G
11110   3_pSdEVr#
11111   3_pSdEVr$

Mi teoría es que el primer carácter varía DEPENDIENDO DE LOS CUATRO PRIMEROS CARACTERES DE LA CADENA. Para demostrar mi teoría he cifrado los siguientes valores:


aaaaaaaaaa   ^@7xY;T6Q30qdF6wxZ#d
baaaaaaaaa   D'P2oQV8(i@"F(+l&g2s
abaaaaaaaa   )jaDoQkM3tA#"cnPA#O1
aabaaaaaaa   gIgI{^dFrTU7wYy[mOC%
aaabaaaaaa   iK*k6w@#0qlNbD3t]?#d
aaaabaaaaa   ^@7xY;T6Q40qdF6wxZ#d
aaaaabaaaa   ^@7xY;T6Q30rdF6wxZ#d
aaaaaabaaa   ^@7xY;T6Q30qdG6wxZ#d
aaaaaaabaa   ^@7xY;T6Q30qdF6xxZ#d

Como ves, cuando los 4 primeros caracteres son distintos, el cifrado es completamente distinto, pero cuando los 4 primeros caracteres se mantienen igual, el cifrado es el mismo.

Con respecto a tu teoría del ruido, he metido los dos valores que me has dado y descarta tu teoría:

O^DR>qESWf   cSkJ!epc9WB4[AJ>qilS
M^BR`qCSUf   't7ukNM@K,3%rV5)sijQ

Con respecto a la cantidad de caracteres ASCII con los que este algoritmo juega, creo que son muchos más que los que citas. Para probarlo, introduje un carácter especial (®) y cifró paréntesis de apertura "(" y un carácter que es una T invertida...

Para estudiar el comportamiento del algoritmo, he ido incrementando el 4 carácter, y este ha sido el resultado:


aaaaaaaaaa   ^@7xY;T6Q30qdF6wxZ#d
aaabaaaaaa   iK*k6w@#0qlNbD3t]?#d
aaacaaaaaa   sUz\qS,olNK-`B0qA#"c
aaadaaaaaa   !bmON0tYK-+l_A-n&g!b
aaaeaaaaaa   ,m`B+l`F*kgI]?*kgI!b
aaafaaaaaa   6wT6fHL3fHG)[='hL.}_
aaagaaaaaa   A#G)C%7~E'&gZ<$e0q}_
aaahaaaaaa   L.:{}_#k$ecEX:!brT|^
aaaiaaaaaa   W9-nZ<lV`BB$V8{]V8{]
aaajaaaaaa   aC}_8yWB?!!bU7xZ:{{]
aaakaaaaaa   lNpRrTC/{]^@S5uW|^z\


Lo he intentado mirar por todos los ángulos y no le encuentro ninguna lógica, todo parece tan random cuando se le modifica uno de los 4 primeros caracteres... Estamos sin lugar a dudas en un algoritmo bastante complejo... Alguna idea por donde continuar investigando?? Muchas gracias a los dos por seguir involucrándoos en este algoritmo. Un saludo a los dos.

zosemu

Cita de: P44gl3 en 18 Abril 2011, 22:39 PM
...
O^DR>qESWf   cSkJ!epc9WB4[AJ>qilS
M^BR`qCSUf   't7ukNM@K,3%rV5)sijQ

Estas eran las cadenas cifradas, me interesaba que las descifraras para ver el resultado de ellas, puedes darme las cadenas:

jjj
jjjj
jjjjj
jjjjjjjj
jjjjjjjjj
jjjjjjjjjjjj
[
\
]
^
Gracias

P44gl3

RESUELTO

Después de tirarme dos días buscando y buscando información, he pillado un programador italiano que había publicado en un foro el source de un programa que descifraba la contraseña.

Este es el algoritmo que usa la función que descifra la password:


void gsa_pwd(u_char *pwd) {
    u_char  *out;
    int     len,
            tmp;

    out = pwd;
    len = strlen(pwd) >> 1;
    while(len--) {
        tmp = *pwd++;
        tmp = *pwd++ - tmp;
        if(tmp < 0) tmp += 0x5f;
        *out++ = tmp + 0x20;
    }
    *out = 0;
}


Así que conseguido, ahora me gustaría estudiarlo y comprenderlo. ¿Alguién me puede explicar porqué le suma ese 0x5f?

Gracias!!

zosemu

0x5f es 95 en base decimal y 0x20 es 32