/**************************************************************************** Garbo 0.2 José Manuel López López Objetivo: Codificar y descodificar textos utilizando el sistema de clave del agente doble español Garbo, que trabajó para los aliados durante la segunda guerra mundial. Idea y documentación: Boletín Enigma (números 28, 29 y 31) del profesor Arturo Quirantes. Uso: garbo -c/-d fich_entrada fich_salida [fecha] -c codifica, -d decodifica, fecha en formato DDMM La entrada consiste en texto plano ASCII con un máximo de 2000 caracteres. Sólo admite letras minúsculas entre la 'a' y la 'z', salvo la 'k'. Espacios, signos de puntuación, números, letra ñ, vocales acentuadas y otros caracteres especiales son ignorados. Por ahora sólo está implementada la codificación. Historia: 0.1 Sólo codificación 0.2 Corregido bug al seleccionar columna inicial según la fecha. 1.0 Codificación / decodificación (en fase de desarrollo). Bugs conocidos: * Si se introduce una fecha erronea siempre elige el 3 de marzo. Por hacer: * Implementar la descodificación de mensajes. ****************************************************************************/ //--------------------------------------------------------------------------- #pragma hdrstop #include #include //--------------------------------------------------------------------------- #pragma argsused #define BUFFER_SIZE 2000 #define NUM_COLUMNAS 31 const int version_mayor = 0, version_menor = 2; int mes = 3, dia = 3; //Alfabetos para la sustitución polialfabética char *alfabetos[]= {"ABCDEFGHIJKLMNOPQRSTUVWXYZ", "VFWEOLNGABKURYXTDIHZJMPQSC", "CROHGIFBZMKAPLNQSTJDVWXYUE", "IJZQDBHSRUKFVGEWXMYPLACONT", "LHATZGEDFSKNJOCMPBQRYUVWXI"}; //Orden en que se colocan las columnas //char columnas[] = {16, 1,7,23,19,12, 14,2,20,31,3, 8,21,9,17,13, 24,6,15,10,27, 22,25,11,28,4, 29,26,30,5,18}; char columnas[] = {1,7,10,25,29, 17,2,11,13,19, 23,5,15,6,18, 0,14,30,4,8, 12,21,3,16,22, 27,20,24,26,28, 9}; void ayuda( void ) { cout << "\nUso: garbo -c|-d fich_entrada fich_salida [DDMM]" << endl << "\t-c\tCodificar con la clave de Garbo" << endl << "\t-d\tDescodificar con la clave de Garbo" << endl << "\tDDMM\tfecha para codificar/descodificar, en el formato dia-mes." << endl << "\t\tSi no se indica la fecha, se utiliza la de hoy." << endl; } char polialfa( char llano, int alfa ) { int j=0; for( char c='a'; c<='z'; c++ ) { if( c == llano ) return alfabetos[ alfa ][ j ]; j++; } return 'K'; } int main(int argc, char* argv[]) { int fecha = 0, tamanyo = 0, nfilas = 0, i=0, j=0; fstream entrada, salida; char c='K', h=' '; cout << "Garbo " << version_mayor << "." << version_menor << " Jose Manuel Lopez Lopez 2005" << endl; if( argc < 4 ) { cout << "Numero de parametros insuficiente." << endl; ayuda(); return 1; } if( argv[1][0] != '-' ) { cout << "Especificar modo de operacion." << endl; ayuda(); return 1; } if( argc > 4 ) { fecha = atoi( argv[ 4 ] ); mes = fecha % 100; dia = fecha / 100; if( mes < 1 || mes > 12 || dia < 1 || dia > 31 ) { cout << "Fecha de clave incorrecta, usando actual." << endl; mes = 3; dia = 3; } } cout << "Fecha de clave: dia " << dia << ", mes " << mes << endl; switch( argv[1][1] ) { case 'c': { cout << "Codificando " << argv[ 2 ] << endl; break; } case 'd': { cout << "La descodificacion esta en fase de desarrollo por jmlopezl@ugr.es" << endl; return 2; } default: { cout << "Opcion incorrecta." << endl; ayuda(); return 1; } } entrada.open( argv[ 2 ], ios::in ); if( !entrada.is_open() ) { cout << "No se encuentra el fichero de entrada." << endl; return 2; } //Lee el archivo de entrada char *buffer = new char[BUFFER_SIZE]; for( i=0; i> c; if( c >= 'a' && c <= 'z' ) //Ignora caracteres extraños y números buffer[ i ] = c; else i--; } entrada.close(); //Completa con 'x' i--; while( i%5 ) buffer[ i++ ] = 'x'; buffer[ (tamanyo = i) ] = '\0'; char *buffer2 = new char [ tamanyo+1 ]; cout << "\n\nTexto plano:\n" << buffer << endl; //Codifica mediante sustitución polialfabética for( i=0; i