• Publicidad

Programa en Perl que pueda resolver cifrados de sustitución

¿Estás desarrollando un proyecto, o piensas hacerlo? Pon aquí tu propuesta, lo más seguro es que alguien esté interesado en ayudarte.

Programa en Perl que pueda resolver cifrados de sustitución

Notapor jvr42 » 2013-02-11 23:34 @024

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 :(
jvr42
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2013-02-11 23:24 @016

Publicidad

Re: Programa en Perl que pueda resolver cifrados de sustituc

Notapor explorer » 2013-02-12 08:23 @391

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Programa en Perl que pueda resolver cifrados de sustituc

Notapor jvr42 » 2013-02-24 01:18 @096

¿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:
jvr42
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2013-02-11 23:24 @016

Re: Programa en Perl que pueda resolver cifrados de sustituc

Notapor explorer » 2013-02-24 07:55 @371

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Programa en Perl que pueda resolver cifrados de sustituc

Notapor jvr42 » 2013-02-24 14:37 @650

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
jvr42
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2013-02-11 23:24 @016

Re: Programa en Perl que pueda resolver cifrados de sustituc

Notapor explorer » 2013-02-24 15:02 @668

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. :)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Programa en Perl que pueda resolver cifrados de sustituc

Notapor jvr42 » 2013-02-24 15:26 @684

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.
jvr42
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2013-02-11 23:24 @016

Re: Programa en Perl que pueda resolver cifrados de sustituc

Notapor explorer » 2013-02-24 16:47 @741

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Programa en Perl que pueda resolver cifrados de sustituc

Notapor jvr42 » 2013-02-24 16:54 @746

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.
jvr42
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2013-02-11 23:24 @016

Re: Programa en Perl que pueda resolver cifrados de sustituc

Notapor explorer » 2013-02-24 17:25 @767

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().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Proyectos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado