cifrado César... elemental... ¿o no tanto?

Iniciado por Glezo, 13 Octubre 2010, 01:03 AM

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

Glezo

Buenas a todos!

Es la primera vez que comento en este subforo.

La cosa es que me estaba picando unas clases en c++ sobre distintos tipos de cifrados, y, cómo no, comencé por el César, todo un juguete y una reliquia.

 Como era evidente, también he estado haciendo unos métodos para romper el cifrado por fuerza bruta. Para ello, pruebo todos los posibles desplazamientos a piñón (en cifrados césar "sale más barato" ir a fuerza bruta que pensar en heurísticas). Pues bien: tomando por ejemplo el relato de Poe, sea mi texto plano "unbuenvasoenlahosteriadelobispo". Nótese que no tiene espacios en blanco.

 Iré probando todos los desplazamientos, hasta que uno de ellos me devuelva el texto "unbuenvasoenlahosteriadelobispo".

PROBLEMA: teniendo una clase Dictionary, que no es más que una lista enorme de palabras y una interfaz, que entre otros métodos, tiene
bool wordBelongs(char* aWord);
bool isPrefix(char* aWord);

¿a alguien se le ocurre un algoritmo eficiente, eficaz y que no arroje falsos positivos para decidir si éste es un texto perteneciente al lenguaje? (lo de los falsos positivos es porque en el diccionario aparecen "a","b","c"..."z" como palabras, lo cual no me parece descabellado. Y entiéndase lenguaje como el cierre de kleen del conjunto Dictionary)

Gracias a todos.

WestOn

Buenas, pues para evitar falsos positivos comprueba que todas las palabras existan en tu diccionario, si no existe alguna que no arroje el resultado y siga probando.

Porque puedes incluir en tu variable un espacio, ' ', y este será también sustituido por el carácter que le corresponda cuando cifres, si lo haces sin espacios buff ni idea, yo usaría espacios  :xD

En el caso como dices que no hay espacios, ¿porqué será? :P, pues te diria que comprobar una a una pero lo mismo se acaba el mundo antes xD, suerte.

Saludos
En mi cabeza existe una barrera espacio-tiempo de 4cm³. ¿Alguien sabe como eliminarla?.
                                                                                                                                                                                                                            

Glezo

Me temo que no te he entendido o no me he explicado o probablemente ambos

El único algoritmo que se me ha ocurrido es, para una cadena de longitud n, añadir 1 espacio, permutar la cadena y ver si pertenece al lenguagje, añadir 2 espacios, permutar la cadena y ver si pertence al lenguaje,.... y añadir n-1 espacios permutar y ver si pertenece, pero es una gansada de cómputo.
Además, de ahí venía el problema de los falsos positivos: si tiendo a separar todas las letras por espacios me dirá que es un texto que de seguro pertenece al lenguaje.

La gracia del cifrado césar es que no hay que cifrar los espacios (se omiten), porque si cifras también los espacios te lo crackean en menos de 5 minutos.