Tema destacado: [AIO elhacker.NET] Compilación herramientas análisis y desinfección malware
Autor
|
Tema: Prueba romper algoritmo ¿Serás capaz de trazar mi algoritmo? (Leído 3,668 veces)
|
Debci
Wiki
Desconectado
Mensajes: 1.945
Actualizate o muere!
|
Hola a todos los de elhacker.net, quiero proponeros un reto, que seais capaces de trazar y romper mi algoritmo de cifrado en java, puede que os sea facil o puede que no, he retorcido muchisimo el codigo, todo lo que he podido para que cueste mas de resolver, ahi va: public void cifra() { String cadenaIntroducida = new String("Hola"); String Clave = new String("debci"); String SubClave = Clave.substring(Clave.length() / 2); String Subcadena = cadenaIntroducida.substring(cadenaIntroducida.length() / 2); String SubClave1 = Clave.substring(0, (Clave.length() / 2)); String Subcadena1 = cadenaIntroducida.substring(0, (cadenaIntroducida.length() / 2)); SubClave1 = SubClave1.toLowerCase(); Subcadena1 = Subcadena1.toLowerCase(); int maximoValor = Clave.length() + cadenaIntroducida.length(); String mezclaBytesCadena[] = new String[maximoValor]; for(int i = 0; i < 3; i++){ String claveVolatil = Clave.substring(i, (Clave.length() / 2)) + cadenaIntroducida.substring(i, (cadenaIntroducida.length() / 2)); mezclaBytesCadena[i] = claveVolatil; } String CadenaFinal = Subcadena + SubClave + (Subcadena1 + SubClave1) + mezclaBytesCadena[0] + mezclaBytesCadena[1] + mezclaBytesCadena[2]; CadenaFinal = CadenaFinal.toLowerCase(); System.out.println(CadenaFinal); } Y con las dos calves introducidas obetenemos como resultado lo siguiente: labcihodedehoeo Suerte a todos. Saludos
|
|
|
|
|
En línea
|
|
|
|
Debci
Wiki
Desconectado
Mensajes: 1.945
Actualizate o muere!
|
Nadie se atreve?
Saludos
|
|
|
|
|
En línea
|
|
|
|
LastDragon
Desconectado
Mensajes: 847
Usuario Baneado (troll)
|
Nadie se atreve?
Saludos
Lee el codigo de openssl, reescribe el programa despues de lo aprendido del que te sugeri y cre oque a mas gente le va a interesar
|
|
|
|
|
En línea
|
|
|
|
raul338
Desconectado
Mensajes: 2.370
La sonrisa es la mejor forma de afrontar las cosas
|
No entiendo bien lo que hace (a simple vista  se puede usar eso en javascript?, no se java y no voy a bajar un IDE para eso solo) lo ideal seria que no pongas el codigo, ya que se hace el paso inverso para desencriptarlo no? XD hubieras puesto asi Cadena: Hola Cadena enriptada: labcihodedehoeo y de ahi ir poniendo pistas para que uno se rompa el coco xD Ahora una pregunta, si encriptas varias veces "hola", te sale siempre lo mismo? intenta hacer un algoritmo que siempre devuelva valores distintos y de ahi desencriptarlo 
|
|
|
|
|
En línea
|
|
|
|
jdc
Desconectado
Mensajes: 3.253
janito dos cuatro...
|
El problema al parecer es que puede llegar desde hola a labcihodedehoeo pero no desde labcihodedehoeo a hola xD
Osea es como si te mostrara como cifra algo a sha1 y te dijera que lo devolvieras xD
|
|
|
|
|
En línea
|
|
|
|
LastDragon
Desconectado
Mensajes: 847
Usuario Baneado (troll)
|
El problema al parecer es que puede llegar desde hola a labcihodedehoeo pero no desde labcihodedehoeo a hola xD
Osea es como si te mostrara como cifra algo a sha1 y te dijera que lo devolvieras xD
Es encriptacionde una via, tipo Triple DES, de hecho.. ni siquiera DES, es version hiper ligera, bueno solo es una encriptacion de una via Alguien dijo que era Java, yo creo que es C# No he intentado entender el codigo pero se ve sencillo, debe ser posible reverir con la llave correcta, basicamente haciendolo a la inversa exactamente
|
|
|
|
« Última modificación: 11 Enero 2010, 20:05 por LastDragon »
|
En línea
|
|
|
|
Novlucker
Ninja y
Ex-Staff
Desconectado
Mensajes: 10.239
Yo que tu lo pienso dos veces
|
Java .... C# por ejemplo no tiene toLowerCase(), en su lugar tiene ToLower(), pero eso no quita que son dos lenguajes terriblemente parecidos labcihodedehoeo Luego me fijo, pero por lo que veo con solo conocer la longitud del texto cifrado y la longitud de la contraseña se podría "descifrar", ya que por lo que veo solo corta y suma fragmentos de "texto" y "clave", no es poca cosa pero por fuerza bruta se podría 
|
|
|
|
« Última modificación: 11 Enero 2010, 20:16 por Novlucker »
|
En línea
|
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD http://twitter.com/novlucker "Hay dos cosas infinitas: el Universo y la estupidez humana. Y de la primera no estoy muy seguro." Albert Einstein
|
|
|
raul338
Desconectado
Mensajes: 2.370
La sonrisa es la mejor forma de afrontar las cosas
|
no tengo idea de java, asi que lo pase a C# y quedo asi public static string cifra(string cadenaIntroducida, string Clave) { string SubClave = Clave.Substring(Clave.Length / 2); string Subcadena = cadenaIntroducida.Substring(cadenaIntroducida.Length / 2); string SubClave1 = Clave.Substring(0, (Clave.Length / 2)); string Subcadena1 = cadenaIntroducida.Substring(0, (cadenaIntroducida.Length / 2)); SubClave1 = SubClave1.ToLower(); Subcadena1 = Subcadena1.ToLower(); int maximoValor = Clave.Length + cadenaIntroducida.Length; string[] mezclaBytesCadena = new string[maximoValor]; for(int i = 0; i < 3; i++){ string claveVolatil = Clave.Substring(i, (Clave.Length / 2)) + cadenaIntroducida.Substring(i, (cadenaIntroducida.Length / 2)); mezclaBytesCadena[i] = claveVolatil; } string CadenaFinal = Subcadena + SubClave + (Subcadena1 + SubClave1) + mezclaBytesCadena[0] + mezclaBytesCadena[1] + mezclaBytesCadena[2]; CadenaFinal = CadenaFinal.ToLower(); return CadenaFinal; } La diferencia es que me devuelve labcihodedehoebolbcla y no labcihodedehoeo como puso ..::| D3Bć1 |::.  Pero es verdad, no se puede recomponer, descifrar, porque borras gran parte de lo que se cifra jeje EDIT 1:Advertencia - mientras estabas escribiendo, fueron publicadas 2 respuestas. Probablemente desees revisar tu mensaje. Novlucker ya lo hizo xD EDIT 2:string CadenaFinal = Subcadena + SubClave + (Subcadena1 + SubClave1) .... Eso te dice como Novlucker logro sacarlo xD, en lugar de hacer todo lo que hiciste antes, si vas a hacer eso, rellena el resultado con letras basura, siguiendo un patron, y despues devuelves la cadena original =) int maximoValor = Clave.Length + cadenaIntroducida.Length; string[] mezclaBytesCadena = new string[maximoValor]; Para que haces eso si solo vas a usar 3 valores? Que gran gasto de memoria 
|
|
|
|
« Última modificación: 11 Enero 2010, 20:27 por raul338 »
|
En línea
|
|
|
|
|
Kasswed
|
A mí si me lo dais en C++ o python me pongo al lío, pero con Java no me apaño 
|
|
|
|
|
En línea
|
"He who allows himself to be insulted, deserves to be." Repórtame cualquier falta a las normas del foro por mensaje privado.
|
|
|
raul338
Desconectado
Mensajes: 2.370
La sonrisa es la mejor forma de afrontar las cosas
|
using System.Text.RegularExpressions; //... public static string descifra(string cadenaIntroducida, string Clave) { string SubClave = Clave.Substring(Clave.Length / 2); string SubClave1 = Clave.Substring(0, (Clave.Length / 2)); SubClave1 = SubClave1.ToLower(); string Pattern = @"^([\w\s]*)" + SubClave + @"([\w\s]*)(?:" + SubClave1 + @"){2}"; Regex reg = new Regex(Pattern); Match matches = reg.Match(cadenaIntroducida); return matches.Groups[2].Value + matches.Groups[1].Value; } Ahi tienen la forma para descifrar a fuerza bruta, adivinando la clave  Ahora vere la forma total de desencriptarlo facilmente 
|
|
|
|
|
En línea
|
|
|
|
Novlucker
Ninja y
Ex-Staff
Desconectado
Mensajes: 10.239
Yo que tu lo pienso dos veces
|
raul388, no mire el algoritmo en C#, pero tiene que haber un pequeño error en algún sitio, a mi me da tal cual lo puso debci. A mí si me lo dais en C++ o python me pongo al lío, pero con Java no me apaño   def cifra(cadenaIntroducida, Clave): SubClave = Clave[len(Clave)//2:] Subcadena = cadenaIntroducida[len(cadenaIntroducida)//2:] SubClave1 = Clave[0:len(Clave)//2].lower() Subcadena1 = cadenaIntroducida[0:len(cadenaIntroducida)//2].lower() mezclaBytesCadena = [] for i in range(3): claveVolatil = Clave[i:len(Clave)//2] + cadenaIntroducida[i:len(cadenaIntroducida)//2] mezclaBytesCadena.append(claveVolatil) CadenaFinal = Subcadena + SubClave + Subcadena1 + SubClave1 + ''.join(mezclaBytesCadena) CadenaFinal = CadenaFinal.lower() return CadenaFinal print(cifra("Hola","debci")) Saludos
|
|
|
|
« Última modificación: 11 Enero 2010, 21:08 por Novlucker »
|
En línea
|
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD http://twitter.com/novlucker "Hay dos cosas infinitas: el Universo y la estupidez humana. Y de la primera no estoy muy seguro." Albert Einstein
|
|
|
Novlucker
Ninja y
Ex-Staff
Desconectado
Mensajes: 10.239
Yo que tu lo pienso dos veces
|
Era más sencillo de lo que pensé! La mitad del texto se tiene al principio del mensaje, y la longitud de la contraseña se saca por fuerza bruta  Texto: Novlucker rompe importante cifrado  Clave: passsecreto Resultado: portante cifrado :pecretonovlucker rompe impassspasssnovlucker rompe imasssovlucker rompe imsssvlucker rompe im def descifra(CadenaFinal,LenFragmento): result = [] for i in range(15): cadena = CadenaFinal[LenFragmento+i:LenFragmento*2+i-1]+CadenaFinal[0:LenFragmento] if (cadena not in result): result.append(cadena) for i in range(15): cadena = CadenaFinal[LenFragmento+i:LenFragmento*2+i]+CadenaFinal[0:LenFragmento] if (cadena not in result): result.append(cadena) return result d = descifra('portante cifrado :pecretonovlucker rompe impassspasssnovlucker rompe imasssovlucker rompe imsssvlucker rompe im',19) for t in d: print(t) Salida: D:\Py>python descifra.py ecretonovlucker roportante cifrado :p cretonovlucker romportante cifrado :p retonovlucker rompportante cifrado :p etonovlucker rompeportante cifrado :p tonovlucker rompe portante cifrado :p onovlucker rompe iportante cifrado :p novlucker rompe importante cifrado :p ovlucker rompe impportante cifrado :p vlucker rompe impaportante cifrado :p lucker rompe impasportante cifrado :p ucker rompe impassportante cifrado :p cker rompe impasssportante cifrado :p ker rompe impassspportante cifrado :p er rompe impassspaportante cifrado :p r rompe impassspasportante cifrado :p ecretonovlucker romportante cifrado :p cretonovlucker rompportante cifrado :p retonovlucker rompeportante cifrado :p etonovlucker rompe portante cifrado :p tonovlucker rompe iportante cifrado :p onovlucker rompe importante cifrado :p novlucker rompe impportante cifrado :p ovlucker rompe impaportante cifrado :p vlucker rompe impasportante cifrado :p lucker rompe impassportante cifrado :p ucker rompe impasssportante cifrado :p cker rompe impassspportante cifrado :p ker rompe impassspaportante cifrado :p er rompe impassspasportante cifrado :p r rompe impassspassportante cifrado :p A la función le paso el texto cifrado y el largo del texto reconocido a "simple vista", ya que al estar la mitad del texto al inicio ,debería de ser legible por una persona. [Edito]Había olvidado decir que; en el bucle del for he puesto 15 iteraciones por el simple hecho de que estoy descifrando un texto para una contraseña de dicho número de caracteres, y salen 30 soluciones porque hay que probar textos de longitud par e impar, así que por ej de estar buscando una pass de hasta 50 caracteres, igual hubiesen sido solamente 100 soluciones  Saludos
|
|
|
|
« Última modificación: 11 Enero 2010, 22:52 por Novlucker »
|
En línea
|
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD http://twitter.com/novlucker "Hay dos cosas infinitas: el Universo y la estupidez humana. Y de la primera no estoy muy seguro." Albert Einstein
|
|
|
Novlucker
Ninja y
Ex-Staff
Desconectado
Mensajes: 10.239
Yo que tu lo pienso dos veces
|
Si, yo otra vez, por tercera vez consecutiva raul338, ya vi cual era el problema en tu código, la manera en la que utilizabas las funciones substring de C# y Java de igual manera Lo que ocurre es que en Java la función substring recibe un rango de caracteres a extraer (desde/hasta), y en cambio en C# es "desde la posición x, n caracteres" for(int i = 0; i < 3; i++){ string claveVolatil = Clave.Substring(i, (Clave.Length / 2)) + cadenaIntroducida.Substring(i, (cadenaIntroducida.Length / 2)); mezclaBytesCadena[i] = claveVolatil;}for(int i = 0; i < 3; i++){ string claveVolatil = Clave.Substring(i, (Clave.Length / 2)-i) + cadenaIntroducida.Substring(i, (cadenaIntroducida.Length / 2)-i); mezclaBytesCadena[i] = claveVolatil;}Saludos
|
|
|
|
« Última modificación: 12 Enero 2010, 01:05 por Novlucker »
|
En línea
|
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD http://twitter.com/novlucker "Hay dos cosas infinitas: el Universo y la estupidez humana. Y de la primera no estoy muy seguro." Albert Einstein
|
|
|
|
|