Página 1 de 1

Programa en Perl que pueda resolver cifrados de sustitución

NotaPublicado: 2013-02-11 23:34 @024
por jvr42
Hola,

Voy a escribir y probar un programa en Perl que pueda resolver cifrados simples de sustitución, es decir, un cifrado donde cada instancia de una letra en particular, en el original, se reemplaza por la misma letra en el código texto.

El programa debe utilizar las características de Perl tanto como sea posible y cumplir con los siguientes requisitos:

(A) leer en el texto cifrado

(B) utilizar las frecuencias de las letras en el texto cifrado y las frecuencias de las letras en el idioma Inglés o Español, véase, por ejemplo http://www.math.cornell.edu/mec/2003-20 ... ncies.html hacer una conjetura en cuanto al texto original

(C) permitir al usuario ajustar la tabla de sustitución de forma interactiva (y mostrar los resultados actualizados) repetidamente hasta que el texto se considera descifrado

(D) la salida de la tabla de sustitución

¿Alguna idea de cómo comenzar? Soy nuevo en Perl :(

Re: Programa en Perl que pueda resolver cifrados de sustituc

NotaPublicado: 2013-02-12 08:23 @391
por explorer
Bienvenido a los foros de Perl en Español, jvr42.

La forma de empezar es leyendo algunos de los tutoriales que hay en nuestra web.

Y leer muchos de los mensajes del subforo Básico.

También puedes revisar el hilo Por dónde empezar.

Por aquí estaremos para ayudarte, cuando te atasques con el código. ¡Adelante!

P.D. Hay un módulo en CPAN, Crypt::Caesar, que está basado en esa misma idea. Puedes consultar su código fuente.

Re: Programa en Perl que pueda resolver cifrados de sustituc

NotaPublicado: 2013-02-24 01:18 @096
por jvr42
¿No me puede ayudar, por lo menos para empezar? Cualquier ayuda se le agradecería.

Lo que ando buscando hacer es igual o parecido al problema de Letter Frequency Decryption Program que está en esta página

Imagen

Cualquier cosa, gracias.

:oops:

Re: Programa en Perl que pueda resolver cifrados de sustituc

NotaPublicado: 2013-02-24 07:55 @371
por explorer
Lo que no sabemos es tu nivel de Perl...

¿Has visto los tutoriales? Si eres nuevo en Perl, debes empezar por ahí.

Si no, empezar por una tarea así, puede ser algo complicado.

Re: Programa en Perl que pueda resolver cifrados de sustituc

NotaPublicado: 2013-02-24 14:37 @650
por jvr42
Sí, soy nuevo en el mundo de Perl. Ya estuve viendo tutoriales, y pude contar la frecuencia de los caracteres, pero de ahí no sé cómo seguir.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. #lee contenido del archivo cifrado
  7. my $contenido;
  8. open(FH, "<$ARGV[0]") or die ("No se pudo abrir $ARGV[0]: $!");
  9. {
  10.     local($/) = undef;
  11.     $contenido = <FH>;
  12. }
  13. close(FH);
  14.  
  15. # divide el contenido en caracteres
  16. my @chars = split(//, $contenido);
  17.  
  18. # construye el hash de cada carácter y la frecuencia de cada uno
  19. my %cuenta = map {
  20.  
  21.     # usa lc($_) para que no importe si es mayúscula o minúscula
  22.     my $foo = $_;
  23.  
  24.     # flitra nuevas lineas
  25.     $_ ne "\n" ?
  26.         ($foo => scalar grep {$_ eq $foo} @chars) :
  27.         () } @chars;
  28.  
  29. # ordena los valores del hash e imprime (el más alto primero)
  30. foreach(sort {$cuenta{$a} <=> $cuenta{$b}} keys %cuenta) {
  31.     print "$_: $cuenta{$_}\n";
  32. }
  33.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Re: Programa en Perl que pueda resolver cifrados de sustituc

NotaPublicado: 2013-02-24 15:02 @668
por explorer
Has hecho el paso A y la mitad del paso B. Te queda por terminar ese paso.

Debes escoger un texto grande, en el idioma en que vas a trabajar (Inglés, Español), y hacer lo mismo que has hecho con el texto cifrado: sacar las estadísticas de aparición de cada carácter.

Lo de la tercera parte del paso B... hacer una "conjetura", puede resultar algo más complejo, sobre todo porque la palabra "conjetura" no es muy computable (traducible a lenguaje informático :) )

Mi "conjetura" es la de ordenar numéricamente las frecuencias de aparición de cada carácter, y ese será el orden de los caracteres a descifrar en el texto cifrado. Ejemplo: si la letra 'e' es la que más se repite en Español, asignaré como 'e' el descifrado de la letra que más se repite en el texto cifrado. Y luego paso a la segunda que más se repite: se la asigno a la segunda que más se repite en el texto cifrado. Y así.

Para no saber nada de Perl, tu programa tiene un nivel bastante alto. :)

Re: Programa en Perl que pueda resolver cifrados de sustituc

NotaPublicado: 2013-02-24 15:26 @684
por jvr42
Aquí es lo que tenía en mente para resolver el problema. Coincide un poco con su conjetura:

1. Leer el archivo y crear la tabla de contador para los caracteres
2. Codificar la tabla de frecuencias palabra: http://www.math.cornell.edu/~mec/2003-2 ... ncies.html
3. Ordenar tabla de contador en orden descendente...
4. Utilice tanto tabla de contador y tabla de frecuencia para crear un hash. (Por ejemplo: contador [0] => frequency_table [0] ....)
5. Leer el archivo de nuevo y sustituir a cada uno de hash utilizando caracteres

Sobre escoger un texto grande, y sacar las estadísticas de aparición de cada carácter puedo usar esta tabla http://www.math.cornell.edu/~mec/2003-2 ... ncies.html y pensé que podía hacer algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my %freq = (e => 12.02, t => 9.10, a => 8.12, o => 7.68, n => 6.95, r => 6.02,
  2.          i => 7.31, s => 6.28, h => 5.92, d => 4.32, l => 3.98, u => 2.4, c => 2.71,
  3.          m => 2.61, f => 2.30, y => 2.11, w => 2.09, g => 2.03, p => 1.82,
  4.          b => 1.49, v => 1,11, k => 0.69, x => 0.17,  q => 0.11, j => 0.10,
  5.          z => .07
  6. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Después de tener esto, no sé cómo hacer lo que usted me propuso, de:
a letra 'e' es la que más se repite en Español, asignaré como 'e' el descifrado de la letra que más se repite en el texto cifrado. Y luego paso a la segunda que más se repite: se la asigno a la segunda que más se repite en el texto cifrado. Y así


No sé si me pueda dar una mano y si mi hash de las frecuencias esté bien.

Re: Programa en Perl que pueda resolver cifrados de sustituc

NotaPublicado: 2013-02-24 16:47 @741
por explorer
La tabla está bien, pero fíjate que es para el idioma Inglés. Si el texto a descifrar estaba escrito en Inglés, entonces es perfecto. Si está en Español, pues algunas letras no serán iguales.

Luego, lo que he dicho de ir guardando las letras por orden de frecuencia, es de hacerlo en arrays.

Además, en el siguiente paso, tienes que permitir al usuario el poder cambiar ese orden, así que si lo guardas en un array, es mucho más fácil de mostrar y modificar. Y de descifrar el texto.

Re: Programa en Perl que pueda resolver cifrados de sustituc

NotaPublicado: 2013-02-24 16:54 @746
por jvr42
Lo que estoy intentanto descifrar ahorita si está en Inglés, quizá después lo pueda cambiar para que funcione con Español.

Esa sería mi siguiente pregunta, como permitir al usuario el poder cambiar ese orden. ¿Algún ejemplo donde pudiera ver? Y también, ya que tengo ordenadas las letras, ¿cómo las guardo en arrays? Por ejemplo, en el código que tengo hasta ahora.

¿Debería cambiar el hash que cuenta la frecuencia de las letras para que fuera más fácil o hacerlo de otra forma?

Gracias.

Re: Programa en Perl que pueda resolver cifrados de sustituc

NotaPublicado: 2013-02-24 17:25 @767
por explorer
Pues supongo que habría que hacer un bucle, hasta que el usuario esté conforme con el resultado.

Dentro de él, se saca el contenido del array de letras, y debajo de él, unos números, y le pedimos qué números quiere intercambiar. Y el texto, descifrado, para que vea los cambios inmediatamente.

Para guardar los valores en el array, lo puedes hacer con push().