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!!!!!!!
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
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!!
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. :)
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!!!)
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!!!
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!!
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!
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.
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!!
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.
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
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!!
0x5f es 95 en base decimal y 0x20 es 32