¿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

Hola a todos!

Estoy intentando descifrar un algoritmo de cifrado simétrico. Tengo los datos que introduzco y los datos que el algoritmo devuelve, y quiero saber si hay alguna forma de saber cómo funciona este algoritmo. Os escribo algunos ejemplos:


CARÁCTER ASCII   PASS cifrado
d      (1
n      (v
dd      (l*n
ddd      (l*nN3
dn   (l*x
nn   (v*x
nnd   (v*xN3
judio   {f1'O4?)1!
j   (r
jj   (r*t
jjj   (r*tN9
jjjj   {f*tfQL7
jjjjj   {f*tfQL7Q<
e   (m
f   (n
g   (o
h   (p
i   (q
k   (s
a   (i
aa   (i*k
aaa   (i*kN0
aaaa   ^@7xY;T6
aaaaa   ^@7xY;T6Q3
aaaaaa   ^@7xY;T6Q30q
aaaaaaa   ^@7xY;T6Q30qdF
aaaaaaaa   ^@7xY;T6Q30qdF6w
aaaaaaaaa   ^@7xY;T6Q30qdF6wxZ
aaaaaaaaaa   ^@7xY;T6Q30qdF6wxZ#d
aaaaaaaaaaa   ^@7xY;T6Q30qdF6wxZ#d^@
aaaaaaaaaaaa   ^@7xY;T6Q30qdF6wxZ#d^@I+
aaaaaaaaaaaaa   ^@7xY;T6Q30qdF6wxZ#d^@I+wY
aaaaaaaaaaaaaa   ^@7xY;T6Q30qdF6wxZ#d^@I+wYG)
aaaaaaaaaaaaaaa   ^@7xY;T6Q30qdF6wxZ#d^@I+wYG)6w
aaaaaaaaaaaaaaaa   ^@7xY;T6Q30qdF6wxZ#d^@I+wYG)6w$e
aaaaaaaaaaaaaaaaa   ^@7xY;T6Q30qdF6wxZ#d^@I+wYG)6w$eX:
awwedffrtghhghyhju   mOyq1)jPZ?nUN5K>(|u]]F_H>&.v]WE.^Izp




Sé que a cada carácter le asigna dos caracteres, pero estos dos caracteres dependen de muchos factores, entre ellos, la posición del carácter con respecto a la cadena, el tamaño de la cadena e incluso (como se puede ver en los dos últimos que tienen la misma longitud y sin embargo el primer carácter, la "a", se cifra de forma distinta) los caracteres que forman la cadena...

Quiero seguir investigándolo y sacar el algoritmo, pero ahora mismo estoy completamente stuck, y no sé qué puedo hacer para continuar. ¿Alguna idea?  :)

GRACIAS  ;-) ;-) por adelantado para los que se preocupen en leer el mensaje y darme su opinión!!!!!!!

APOKLIPTICO

Mmh, bastante complejo. Bueno, por lo que veo, infiero que se hace alguna "suma" de todos los caracteres, que luego se aplica a cada uno de los caracteres.
Por otro lado, veo que se utilizan todos caracteres legibles.
Quizás puede llegar a ser algun tipo de cambio de base, como "base 64", pero lo que veo, es que hay relación entre caracteres.
Probá lo siguiente:
aaaajikeldiaopskdi
aaajikeldiaopskdii
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.

zosemu

A ver si entendí, lo que tienes en la tabla es el carácter en ASCII por una parte y en la otra el resultado del cifrado, el pass que usaste para cifrar esa información fue "cifrado", puedes poner otros resultados de las letras usando por ejemplo "0" y "1" para cifrar, o el programa te solicita que el pass de cifrado sea de determinada longitud, lo que puedo ver es que un carácter en determinada posición, es reemplazado por dos caracteres que estos no se alteran bajo determinadas circunstancias, es decir cuando la longitud de la cadena ocupa de 1 a 2 caracteres, cuando la longitud de la cadena es de tres ocurre algo bastante raro y luego cuando son mayores a eso se mantienen constantes otra vez, por lo que infiero que tal vez use algo de módulos, ojala puedas poner otras cadenas y el pass que usaste para cifrar.

SaluDoS!!

P44gl3

Antes de nada, muchísimas gracias a APOKLIPTICO Y zosemu por haberos molestado en contestar. Muchísimas gracias!!!

APOKLIPTICO: Sí, tiene que haber relación entre los caracteres, ya que se modifican según el tipo de los caracteres que hay delante y detrás. Estos son los cifrados de las dos cadenas que me has pedido:


aaaajikeldiaopskdi   ^@7xY;T6Q<0ydP6{xe#g^HI+wgG86*$oX=mW
aaajikeldiaopskdii   aC}_8yWB?)!lU;xe:~{eA#.}+{@4P<uZB,u_

¿Podría saber porqué me has pedido esas cadenas? De nuevo, muchas gracias!!!


Zosemu: Sí, a partir de tres caracteres se modifica todo. He hecho lo que tú me has comentado, he jugado con unos y ceros y ha salido algo bastaaaaante interesante  :)


0   (8
1   (9
00   (8*:
01   (8*;
10   (9*:
11   (9*;
000   (8*:N^
001   (8*:N_
010   (8*;N^
011   (8*;N_
100   (9*:N^
110   (9*;N^
111   (9*;N_
0000   ]mVf(81A
0001   hxIYbrz,
0010   gw)9J[AQ
0011   q"y*'8->
0100   (8$5=MHX
0101   3Ct&x)3D
0110   2BSd_pXh
0111   <LFW<MCT
1000   CTo >N3C
1001   N_brx){-
1010   M^BR`qCS
1011   Wh5E=N.?
1100   k|=NTdIY
1101   v(0A1A5F
1111   3_pSdEV

Es impresionante como se modifica absolutamente todo cuando pasa de 3 caracteres... Si te fijas, el 0100 es el único que mantiene el primer carácter igual que cuando eran menos de 3 caracteres "(8".  :( MMMMmmmm...

¿Alguna idea de qué podría hacer ahora para seguir investigando y sacar más información?

Y de nuevo, y no me cansaré de repetirlo, MUCHÍSIMAS GRACIAS POR AYUDARME.   :)

P44gl3

WOW! He seguido jugando con los ceros y los unos y ya he entendido bastante más cómo funciona este algoritmo!! Muchísimas gracias por vuestro valioso consejo!! Os explico:

Lo que sabía antes era que cada carácter en cada posición de la cadena, tiene dos caracteres asignados. Cuando el carácter aumenta (en valor ASCII), los dos caracteres correspondientes aumentaban de forma proporcional, por lo tanto tiene que haber una relación aritmética fácil de encontrar. El problema era cuando aumentábamos a 4 o más caracteres. Los dos caracteres que se le asignaban eran otros completamente distintos.

Esto son los datos que he conseguido al jugar con los ceros:


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$
000000   ]mVf(81A^nCS
000001   ]mVf(81A^nCT
000010   ]mVf(81A^oCS
000011   ]mVf(81A^oCT
000100   hxIYbrz,<L#3
000101   hxIYbrz,<L#4
000110   hxIYbrz,<M#3
000111   hxIYbrz,<M#4
001000   gw)9J[AQ!1iy
001001   gw)9J[AQ!1iz
001010   gw)9J[AQ!2iy
001011   gw)9J[AQ!2iz
0000000   ]mVf(81A^nCS<L
0001000   hxIYbrz,<L#3:J
0010000   gw)9J[AQ!1iyN^
00000000   ]mVf(81A^nCS<L#3
00010000   hxIYbrz,<L#3:J}.
00100000   gw)9J[AQ!1iyN^gw

Si observáis, la cadena cifrada sigue manteniendo ese aumento proporcional, pero se ve afectada POR LOS CUATRO PRIMEROS CARÁCTERES.

Ahora que sé cómo el algoritmo funciona de forma general, necesito saber cuál es la fórmula matemática que usa para asignar los dos caracteres a cada carácter. Necesito números!!! ¿Cómo podría pasar los caracteres a números para estudiar mejor la relación aritmética?

De nuevo, muchísimas gracias!! Ahora entiendo porqué APLOKÍPTICO me ha pedido las dos cadenas. Eran para ver cómo se transforma cambiando los 4 primeros caracteres, verdad? Qué máquina!! Y muchas gracias Zosemu por tu excelente idea. GRACIAS!!!!

(¿Alguna idea para que pueda pasar los caracteres a números y seguir trabajando? ^^ Graciasssss!!!)

APOKLIPTICO

Mirá, si te manejás bien con los números hexadecimales, usá el código ASCII de cada una de las letras para manejarte bien. Te recomiendo "Cryptool" para hacer manipulaciones de texto, o un editor hexadecimal como xvi32.

Suerte!!!
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.

zosemu

Perdón por no contestar antes pero la diferencia de horarios entre continentes XD...

Bueno ya le eche un vistazo a tus resultados y de manera inicial se me ocurre lo siguiente lo voy a intentar explicar con el cero y el uno iniciales:

cadena = 0
si len(cadena) <= 1
  x = asc(cadena)    '48
  Si x MOD 2 = 0
    y1 = x -8   '40
    y2 = x + 8 '56
  si no
    y1 = x - 9   '40
    y2 = x + 8  '57
  fin si
cifrado = car(y1) & car(y2) '(8

Para dos valores funciona exactamente igual pero en lugar de restar de manera simple le suma dos al valor del carácter en este caso 48 y luego realiza el mismo procedimiento para el valor uno y con la suma de dos para el siguiente valor, hay algo extraño con todo esto, pero ya hiciste que se despertara mi curiosidad puedes poner las siguientes cadenas:

000
111
0000
1111
a
ab
abc
abcd
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
:
;
<
=
>
?
@
A
AA
AAA
AAAA
AAAB
Sigo con la sospecha de que se esta usando algún tipo de modulo aritmético para los valores superiores a cierto número teóricamente 64, pero por eso te pido esos valores.

SaluDoS!!

P44gl3

Gracias APLOKIPTICO, pero, porqué mejor trabajar con hexadecimal que con decimal?

Zosemu: Muchísimas gracias por haberte preocupado en sacar la fórmula, pero me temo, que no es correcta.  :-(

El primer valor (y1) siempre es el mismo para todos los caracteres en esa posición. Así que creo que y1 tiene algo que ver con la posición del carácter y siempre es el mismo para todos los caracteres en esa posición (estoy hablando siempre de las cadenas de menos de 3 caracteres, como sabemos cuando son 4 o más, entran no cumplen esta regla) y "y2" sí que tiene relación aritmética con el valor en ASCII, que como muy bien has dicho, serían valor en ASCII-8 ó ASCII-9 dependiendo si es par o no.

Te copio los cifrados devuelto al meter los valores que me has pedido:


000   (8*:N^
111   (9*;N_
0000   ]mVf(81A
1111   3_pSdEV
a   (i
ab   (i*l
abc   (i*lN2
abcd   ]?= J.N3
a   (i
b   (j
c   (k
d   (l
e   (m
f   (n
g   (o
h   (p
i   (q
j   (r
k   (s
l   (t
m   (u
n   (v
o   (w
p   (x
q   (y
r   (z
s   ({
t   (|
u   (}
v   (~
w   ( (Paréntesis y espacio)
x   (!
y   ("
z   (#
:   (B
;   (C
<   (D
=   (E
>   (F
?   (G
@   (H
A   (i
AA   (i*k
AAA   (i*kN0
AAAA   ^@7xY;T6
AAAB   iK*k6w@#


Gracias a esto, acabo de descubrir otra cosa: La contraseña no es casesensitive. Si te das cuenta A y a tiene el mismo cifrado. Otra cosa a tener en cuenta, no?

También, se puede observar como y1 en el primer carácter es siempre (, y1 del segundo carácter es * y y1 del tercer carácter es N y no se modifica (hasta que llegamos al cuarto caracter  :¬¬) jaja!

Muchísimas gracias por tomaros la molestia y por orientarme en este mundillo que desconocía por completo y me estoy enganchando más y más. Gracias!! Un abrazo!

APOKLIPTICO

P44G3: El hexadecimal es mucho más cómodo para trabajar que el decimal, porque todos los valores se pueden expresar con dos caracteres. Por ejemplo, si uno quisiese expresar tres caracteres en decimal serían: 203 10 55 y los tendríamos que separar con un espacio, haciéndolo dificil para su lectura, en cambio, en hexadecimal: CD0A37. Y listo.
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.

zosemu

Interesante algoritmo ;), según parece el primer carácter se trata de un carácter único y posicional dependiente de la longitud de la cadena y los valores de esta, ṕor ejemplo para cadenas de no más de tres caracteres son "( *" y "N" respectivamente, cuando el problema parece ser en las cadenas cuya longitud es múltiplo de 4, ahí es cuando parece descomponerse, luego se vuelven a ser las mismas, prueba para esas longitudes y veras que hasta las cadenas exactamente iguales cambian, por otra parte tienes razón seguramente esta convirtiendo a minúsculas los caracteres antes de pasar al cifrado.

De acuerdo con esto la cantidad de caracteres ASCII imprimibles es de 94 (93 realmente pero usando el espacio ya son los 93), no creo que se estén usado todos así que lo mejor que se me ocurre es que para cifrar se use un algoritmo y para descifrar otro, el primero tiene como fin agregar ruido en donde realmente no existe, de esa manera lo hace parecer más complejo de lo que es pero para descifrar debe estar usando otro basado únicamente en los segundos caracteres, para probar esto podrías usar una cadena alterada de 5 o más caracteres por ejemplo intentar descifrar esto:
O^DR>qESWf

Suponiendo que el algoritmo use los valores del primer carácter y la posición de este a fin de poder llevar a cabo su función de descifrar el incremento de estos valores debería ser valido para el algoritmo y te daría un resultado que nos ayude a comprender la función empleada para el cifrado, pero por otra parte si solo se trata de ruido, el resultado deberá ser el mismo que para la cadena original: M^BR`qCSUf, en cuyo caso sería valida mi teoría del ruido.

Por otra parte no creo que se estén usando los 94 caracteres imprimibles sino solo 92 o 72 de ellos, lo que nos debería de conducir al algoritmo al evaluar las posiciones los ciclos, por una parte los ciclos tendrían que ser de 18 o 23 (por aquello que ocurre con las longitudes múltiplos de 4); determinar la longitud de la cadena original no debería ser más complicado que aplicar módulos aritméticos a fin de saber cual es el carácter que debe ser usado, si probamos toda la cadena de caracteres del 32 (espacio) al 126 (~) tendríamos una idea más aproximada a la cantidad de caracteres que se están usando para el cifrado y de ahí también podríamos evaluar cuantos se usan realmente, aunque por ahora algo me dice que son 72 y todo los demás son módulos jeje, lo que nos regresa al detalle del primer carácter que de ser usado debe decirle al algoritmo la relación que existe entre nuestro modulo de 72 y el carácter original, a ver si me explico.


SaluDoS!!