Ayuda con una modificacion del cifrado cesar en c++( Ubuntu ).

Iniciado por mat.marchantt, 10 Julio 2011, 10:29 AM

0 Miembros y 2 Visitantes están viendo este tema.

mat.marchantt

 Hola maestros,  les cuento,  soy un novato en esto y necesito hacer un programa que " Des cifre" un texto, pero sin conocer la clave ( o el numero de desplazamientos en el abecedario ), en vez de eso, conociendo una palabra que se incluye dentro del texto cifrado.

Por más que e buscado no logro dilucidar como lograr que lo haga, algún maestro que me pueda ayudar ?

Saludos.

APOKLIPTICO

Hola! Mirá, lo que se suele hacer con cifrado cesar, es un análisis de frecuencias, aunque realmente es bastante simple de crackear, si tenés una palabra entera, y sabés en donde está, lo único que tendrías que hacer es fijarte cuantos desplazamientos se están haciendo. Por ejemplo:
"Uq vwujzm ma Ixwstqxbqkw g awg cacizqw lm mtpiksmz.vmb lmalm mt 22 lm Vwdqmujzm lm 2004."

Uno entonces puede pensar que "Vwdqmujzm" puede significar un mes, los únicos meses que tienen 9 letras, son "Diciembre" "Noviembre" y si se escribe de esa manera "Setiembre". Diciembre no puede ser, porque la segunda y cuarta letra deberían ser iguales y "Setiembre" no puede ser, porque la tercera letra debería ser "w" en vez de "d". Nos queda que es "Noviembre".
Agarramos y nos fijamos que la cantidad de letras entre "N" y "V" son 8. Desciframos el texto con esa clave y nos queda:

"Mi nombre es Apokliptico y soy usuario de elhacker.net desde el 22 de Noviembre de 2004."

Un abrazo
Apokliptico

PD: Para estas cosas, te conviene utilizar cryptool. Tiene incluso un crackeador incluido.
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.

mat.marchantt

Entiendo lo que me planteas, es lo lógico, pero el problema es que me exigen que el programa de forma autonoma pruebe todas las combinaciones necesaria para identifica donde esta la palabra "Conocida", y que este me informe por ejemplo; El numero de desplazamientos para que dentro del texto diga "Casa"  son (ej) 5, y asi yo utilizar esa clave para descifrar lo demas del texto. 

Eso es el pero , como puedo lograr eso? no logro dar con la estructura que le ordene eso al programa. Por lo demas necesito hacerlo en C++ por que es lo unico que conozco, llevo apenas un curso de programacion....

Espero su ayuda con ideas porfavor.

Saludos.

APOKLIPTICO

La estructura es bastante simple, le tendrías que dar de datos de entrada al programa la frase cifrada, la palabra descifrada (o incluso el caracter cifrado, ya que sólo se necesitaría eso) y la ubicación de la palabra o caracter en el texto. Luego el programa tendría que hacer una diferencia para ver cuál es la clave, y descifrar el texto con esa clave, no veo cual es el problema.
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.

mat.marchantt

Ahh, entiendo lo que  dices, pero si no se la ubicacion de la palabra en el texto, que codigo hace que busque la ubicacion?

raul338

Puedes separar las palabras y buscar las palabras con la misma longitud de caracteres (strtok o algo asi podes usar) y comprobar luego (tal como hizo Apokilptico con el nombre del mes) la diferencia entre sus caracteres

APOKLIPTICO

También podés analizar las palabras para buscar correlaciones, es decir, la palabra "auto" tiene unas determinadas diferencias entre sus letras, de la "a" a la "u" hay una cantidad de caracteres de la "u" a la "t" hay otra y así, si vos agarrás ese "patrón" y lo buscás en el texto, si encontrases una palabra que siguiese ese patrón, entonces lo más probable es que esa sea la palabra que tengas que reemplazar. La otra opción, es utilizando un diccionario.
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.

Died

Suerte tienes de que tenga abierto un código para lo que necesitas :D
Modifícalo un poco, está hecho según mis necesidades xD. La cosa es que le pongas una diferencia mínimamente alta (10, 20...) y mires si alguna frase tiene sentido lingüistico. Demasiado sencillo ;)


#include <stdio.h>
#include <string.h>

int a, i;

int main (int argc, char *argv [])
{
printf ("Distancer 0.1 : Sagrini 11 : H-Sec.org");
if (argc != 3) { printf ("\nUse: %s <string> <diff>\n\n", argv [0]); return 0; }

for (i=1; i<=atoi (argv [2]); i++)
{
printf ("\nMoving %d chars...\n\t", i);
for (a=0; a < strlen (argv [1]); a++)
printf ("%c", argv [1][a] + i);

}

printf ("\n\n");
return 0;
}


Un saludo! Sagrini