Académique Documents
Professionnel Documents
Culture Documents
Informacin
SegundaPrctica
7/Noviembre/2008
LauraAutnGarcaIngenieraTcnicaInformticadeSistemas
Contenido
INTRODUCCIN.........................................................................................................................4
ESPECIFICACIONTERICA.........................................................................................................4
CONTENIDO...............................................................................................................................5
INSTRUCCIONESPARAELUSUARIO......................................................................................6
EJEMPLODEUSO...................................................................................................................7
CODIGO...............................................................................................................................10
CONCLUSIONES...................................................................................................................16
FUENTESDEINFORMACINCONSULTADAS..........................................................................17
INTRODUCCIN
Estaprctica,consisteenlaimplementacindelosalgoritmosdecifradoydescifradopor
sustitucinmonogrmicamonoalfabtica,solicitandodelusuariolaconstantede
desplazamiento(b)yladedecimacin(a).Vamosautilizarcomoalfabetodepartidatodaslas
letrasmaysculasdenuestroalfabeto,portantoelgrupodetrabajoesn=27.
EstecriptosistemarecibeelnombredeCifradorporsustitucinafnmod27.
ESPECIFICACIONTERICA
Esteesuncriptosistemaporsustitucinpuesloscaracteressesustituyenporotrosdelmismo
alfabeto,ademsesmonogrficoporquesehacelasustitucincarcteracarctery,
monoalfabticoporquecadacarcteressustituidoporunsolocarcterdelmismoalfabeto.
Paraelcasoquenoscompete,lasustitucindeloscaracteresdelmensajeenclaroporlos
caracteresdelmensajecifrado,serealizadeformamatemticaaplicandolasiguiente
expresindeequivalencia:
C
= (o - H
+ b) moJ 7 2
endondeoseconocecomolaconstantededecimacin,bcomolaconstantede
desplazamientoyneselordendelgrup . o
Puedeutilizarsecualquiervalordeoybenlaecuacinanterior?Larespuestaesno.
Enprimerlugar,esobvioqueonopuedeserigualaceropuesnoexistiraunaequivalenciade
alfabetos,porloquedebercumplirsequeo 1.
Porotraparte,paraquelaconstanteotengainverso,debercumplirsequesuvaloryel
mdulo27seanprimosentres;esdecirHC (o, 27) = 1.
Encuantoalaconstantededesplazamientob,stapuedetomarcualquiervalorcomprendido
entreu b 27 - 1.
Laecuacindedescifradoeslasi i gu ente:
H
= o
-1
- (C
- b) moJ 27
Aunquetambinpodemosesc b evitar gativos: ri irlacomosigue para losne
H
= o
-1
- (C
+27 - b) moJ 27
4
CONTENIDO
Estaprcticacontienevariosficheros.Losprincipalessonlosquecontienenladefinicindela
claseAfin,lacualtienelossiguientesatributos:
a) elalfabetoquesevaautilizar(los27caracteresdelcastellano),
b) laconstantededecimacin,
c) laconstantededesplazamiento,
d) yfinalmente,unavariablequecontendrlainversadelaconstantededecimacin
siempreycuandoexista.
Delasfuncionesmiembroquedesarroll,haydosmuyimportantesquesonlasquecontienen
losalgoritmosdecifradoydescifrado.Dependiendodelasnecesidadesdelusuario,harla
llamadaaunauotrafuncin.
Elalgoritmodecifradosebasabsicamenteenlossiguientespasos:
1. Abrimoselficherodeentradaquesolicitamosalusuario.Siexistealgnproblema
lanzaremosunaexcepcindetiporistraquetendrquesercontroladaporelusuario
delaclase.
2. Unavezabiertovamosleyendolneaalnea.Porcadalnearealizamos,latratamos
paradejarlaenmaysculascompletamenteaplicandolaclasemaysculas,ya
continuacin,realizamoselcifradodetodosycadaunodeloscaracteresaplicandola
frmula.
3. FinalmenteescribimosenelficherodesalidallamadoCriptograma.txt.Laaperturade
dichoficheroenmodoescritura,truncasucontenidosiyaexistiera.
Comocaractersticaadicionaldemialgoritmo,aadquelosbloquesdecaracterescifrados
fueranalmacenadosdetamaoaleatorio,siemprecomprendidosteentre1mnimoy5
mximo,talycomosesolicitaenlaspautas.Lohicedeestamaneraparaquenofuerantodos
detamao5.
Elalgoritmodedescifradoestotalmenteanlogoalalgoritmodecifrado:
1. Abrimoselficherodeentradaquesolicitamosalusuariolanzandolamismaexcepcin
encasodenoabrirsedeformacorrecta.
2. Unavezabiertotratamoslneaalnea,porcadaunadelascualesdesciframosunoa
unoloscaracterescifrados,aplicandolasegundadelasfrmulasexpuestasenla
especificacinterica:H
= o
-1
- (C
Porotraparteestelprogramaprincipaldondehagodeusuariodedichaclase,pidiendolos
datosalusuariofinaldelprogramayenfuncindeestos,llamaraunasfuncionesuotras.Para
elloeldesarrollosehabasadoenmens.
1. Elprimermensirveparaelegirelcriptosistema(actualmentesolohayun
criptosistemaperoenlasprcticasposterioresaparecerntodoslosdesarrollados).
2. Acontinuacin,paraestecriptosistemaenconcreto,solicitaambasconstantes,las
cualestienenquedeberansercorrectasyencasocontrarioseavisaalusuario.
3. Finalmenteapareceotromenenelcual,lasopcionesprincipalessoncifrarodescifrar
untextoenclaro.Aadotraopcinparapodermodificarlasconstantessintenerque
volveralmenprincipaldelprograma.
Porltimo,comentarquehiceunpardearchivosllamadoscomunes.hysurespectivo.cpp
con,actualmente,tresalgoritmosquepiensopuedensertilesparaeldesarrollodelas
futurasprcticas.
Unodeelloseselclculodelmximocomndivisor,quesebasaenelprocedimientodeEuler,
paraelcual,aunquenohasidoexplicadoenclasetodava,tenalosapuntesescritosdela
asignaturalgebrayMatemticaDiscreta,dondeunodelostemasprecisamentesellamaba
TeoradelosNmeros,yahvenadetalladoelalgoritmoelcualhepasadoaC++.
Porotroladoseencuentraelclculodelinversodeunaconstantededecimacinparaun
mdulo,ambosdeterminadosenelmomentodelallamada.
Tambinestunafuncinquehaceusodelaclasemaysculas.
INSTRUCCIONESPARAELUSUARIO
Elmanejodelosmensesmuysencillo,yaquesolotienequeintroducirportecladolaopcin
quegusteypulsarintro.Sinointroducelaopcincorrectaselevuelveasolicitar.
Paracadacriptosistema,tendrqueintroducirlosdatosquesesolicitan,loscualestendrn
quecumplirsuspropiedades,encasocontrariosemostrarunmensajedeerrorysevolvera
pedirdenuevodichosdatos.
Elprogramasolicitarlostextosacifrar/descifraralusuario.
Comoresultadodelaaplicacindelalgoritmodecifrado,eltextofinalsedenominar
Criptograma.txt.Asimismo,comoresultadodelaaplicacindelalgoritmodedescifrado,el
textofinalsedenominarMensajeEnClaro.txt.
6
EJEMPLODEUSO
Elprimermenenaparecereselsiguiente:
Introducimoslaopcin1yacontinuacinlasconstantesdedecimacinydesplazamiento:
Elmensiguientenospermiterealizaryacifradosydescifrados:
Unavezintroducidoelnombredelfichero,nosavisadequeseharealizadocorrectamente.
Aparecedenuevoelmensolicitndonosotraopcin:
Lomismoocurriraconlaopcin2haciendoelprocesoinverso:
Sipulsamoslaopcin0volvemosalprincipal:
Enelcasoqueintrodujramosunaopcindemenincorrecta,senossolicitaradenuevola
mismayparaloscasosdeloserroresenlasconstantesdedecimacinydesplazamiento,se
avisaraalusuariodelosvalorescorrectos:
Ennuestroejemploeltextocifradoera:
Desdeunprimermomentotodoapuntababuenasmaneras.DesdeelprimertrailerdeSenjou
noValkyriasehapodidopercibiruninterscrecienteporunjuegoqueaparenteyresultaser
finalmentediferenteenmuchossentidos.Losprimeroscompaseseranbastante
prometedores,yaqueeraelnuevotrabajodelequiporesponsabledelasagaSakuraTaisen,
queacumulaunalargaexperienciacomocreadoresdejuegosdeestrategiaconhistorias
emotivasdepormedio;yademsestabasuindudablebellezavisual.
Elsiguienteseraeltextoenclarorealcontodoenmaysculas:
DESDEUNPRIMERMOMENTOTODOAPUNTABABUENASMANERASDESDEELPRIMERTRAILERDESE
NJOUNOVALKYRIASEHAPODIDOPERCIBIRUNINTERESCRECIENTEPORUNJUEGOQUEAPARENTEY
RESULTASERFINALMENTEDIFERENTEENMUCHOSSENTIDOSLOSPRIMEROSCOMPASESERANBAST
ANTEPROMETEDORESYAQUEERAELNUEVOTRABAJODELEQUIPORESPONSABLEDELASAGASAKU
RATAISENQUEACUMULAUNALARGAEXPERIENCIACOMOCREADORESDEJUEGOSDEESTRATEGIAC
ONHISTORIASEMOTIVASDEPORMEDIOYADEMASESTABASUINDUDABLEBELLEZAVISUAL
Trasaplicarelalgoritmodecifradoconconstantedecimacin2ydesplazamiento4:
KMOKMSDJNTBMNBHBMDQHQHKHEJSDQEGEGSMDEOBEDMNEOKMOKMMZJN
TBMNQNETZMNKMOMDVHSDHUEZXANTEOMREJHKTKHJMNITGTNSDTDQMNMOIN
MITMDQMJHNSDVSMPHLSMEJENMDQMANMOSZQEOMNTDEZBMDQMKTMNM
DQMMDBSIRHOOMDQTKHOZHOJNTBMNHOIHBJEOMOMNEDGEOQEDQMJNHB
MQMKHNMOAELSMMNEMZDSMUHQNEGEVHKMZMLSTJHNMOJHDOEGZMKMZEO
EPEOEXSNEQETOMDLSMEISBSZESDEZENPEMYJMNTMDITEIHBHINMEKHNMOKMV
SMPHOKMMOQNEQMPTEIHDRTOQHNTEOMBHQTUEOKMJHNBMKTHAEKMBEOM
OQEGEOSTDKSKEGZMGMZZMCEUTOSEZ
9
Efectivamente,siaplicamoslaf m o 27 r ulaC
= (2 - H
+ 4) m J
ConlaletraD(cdigo3) C
= (2 - 4 + m 4) oJ 27 = 12 M
Paraelcasocontrario,siaplicamoslafrmulaH
= 14 - (C
CODIGO
Son5ficheros:
AFINMOD27.H
#ifndef AFIN
#define AFIN
#define MOD 27
#include "mayusculas.h"
class Afin{
static char alf[MOD];
int a; // Constante Decimacin. Su valor y el del mdulo tienen
que ser primos
int b; // Constante Desplazamiento. 0 <= des <= mod-1
int inva; // Inverso de la constante de Decimacin
Mayusculas m; // Para pasar el filtro al texto
int busca(char);
// Para buscar el cdigo asociado con el carcter.
char cifra(char);
// Contendr la frmula del cifrado
char descifra(char);
public:
// Contendr la frmula del descifrado
Afin();
// Constructor
~Afin();
// Destructor
void ponDecimacion(int);
// Dicha constante tiene que cumplir que el MCD(a,MOD) = 1
// en caso contrario, lanzar una excepcin.
void ponDesplaza(int);
// Dicha constante tiene que estar entre 0 <= b <= MOD-1
// en caso contrario, lanzar una excepcin.
void acifrado (string);
// Algoritmo de Cifrado.
void adescifrado (string);
// Algoritmo de Descrifrado.
};
#endif /*AFIN*/
10
AFINMOD27.CPP
#include <iostream>
#include <fstream>
using namespace std;
#include "afinmod27.h"
#include "comunes.h"
char Afin::alf[MOD] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
'L', 'M', 'N', '', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
'V', 'W', 'X', 'Y', 'Z'};
Afin::Afin(){}
Afin::~Afin(){}
void Afin::ponDecimacion(int a){
// Tiene que cumplir los requisitos.
if (a == 0 or mcd(a,MOD) != 1) throw "Ha introducido una constante de
decimacion incorrecta.";
else{
n caso de ser correcta, la almacenamos junto con su inversa // E
this->a = a;
inva = inv(a, MOD);
}
}
void Afin::ponDesplaza(int b){
Tiene q cumplir lo uisitos. // ue s req
if (b < 0 or b >= MOD) throw "Ha introducido una constante de
desplazamiento incorrecta.";
else this->b = b;
}
char Afin::cifra(char c){
// Devuelve aquel caracter cuyo cdigo sea el obtenido con la frmula de
cifrado
return alf[(a*busca(c) + b)%MOD];
}
char Afin::descifra(char c){
// Devuelve aquel caracter cuyo cdigo sea el obtenido con la frmula de
rado descif
return alf[(busca(c) + 27 - b)*inva%MOD];
}
int Afin::busca(char c){
for (int i = 0; i < MOD; i++){
if (alf[i] == c) return i;
}
return 0;
}
void Afin::acifrado (string fent){
ifstream entrada(fent.c_str());
if (entrada.fail()) throw "Error de apertura de fichero de entrada.";
ofstream salida("Criptograma.txt");
string linea, lcifr; // linea contendr la lnea leda
// lcifr contendr la lnea cifrada
int cont, lon; // cont sirve para controlar el
almacenamiento de la cifra en bloques
// lon guardar el tamao de la lnea leda
char c; // c contendr cada caracter de la linea
// Leemos el fichero de entrada
while(!entrada.fail()){
// Leemos una lnea,
11
getline(entrada, linea);
if (entrada.fail()) break;
// la tratamos
m.reinicia();
trataclave(linea, m);
linea = m.dameString();
lon = linea.length();
cont = rand()%5 + 1; // Determinamos de forma aleatoria de
cuntos caracteres
// ser el bloque almacenado
for (int i = 0; i < lon; i++, cont--){
c = cifra(linea[i]);
if (cont == 0){
// Hemos terminado de completar un bloque,
// aadimos un caracter en blanco como separador
lcifr += " ";
// y comenzamos el siguiente bloque
cont = rand()%5 + 1;
}
lcifr += c;
}
// y finalmente la escribimos en el fichero de salida.
salida << lcifr << endl;
lcifr = "\0";
}
cout << "Fin de proceso. Nombre de fichero: Criptograma.txt" << endl;
}
void Afin::adescifrado (string fent){
ifstream entrada(fent.c_str());
if (entrada.fail()) throw "Error de apertura de fichero de entrada.";
ofstream salida("MensajeEnClaro.txt");
if (salida.fail()) throw "Error de apertura de fichero de salida.";
string linea, ldcifr; // linea contendr la lnea leda
// ldcifr contendr la lnea descifrada
int lon; // lon guardar el tamao de la lnea leda
// Leemos el fichero de entrada
while(!entrada.fail()){
// Leemos una lnea,
getline(entrada, linea);
if (entrada.fail()) break;
// la tratamos
lon = linea.length();
for (int i = 0; i < lon; i++){
if (linea[i] == ' ') continue; // Elminamos espacios en
blanco
ldcifr += descifra(linea[i]);
}
// y finalmente la escribimos en el fichero de salida.
salida << ldcifr << endl;
ldcifr = "\0";
}
cout << "Fin de proceso. Nombre de fichero: MensajeEnClaro.txt" << endl;
}
12
PRACTICA2.CPP
#include <iostream>
using namespace std;
#include "afinmod27.h"
#include "math.h"
void introducirDatosAfin(Afin &C){
int cdecimac, cdesplaza;
// Primero introducimos la constante de decimacin controlando que sea
correcta
//
do{
mediante el manejo de excepciones
try{
cout << endl << "Introduzca la constante de decimacion: ";
n >> cdecimac; ci
if (atoi(cdecimac.c_str()) >= 0){
for (unsigned int i = 0; i < cdecimac.length(); i++){
if (cdecimac[i] < '0' or cdecimac[i] > '9')
throw 0;
}
}
C.ponDecimacion(atoi(cdecimac.c_str()));
break;
}catch(int){
cout << ene que introducir un valor entero." << endl; "Ti
}catch(const char *s){
cout << s << endl;
cout << "La constante y el modulo del alfabeto (" << MOD <<
") tienen que ser primos entre si.\n";
cout << "Su valor tiene que ser tambin distinto de 0.\n"
<< endl;
}
}while(1);
// y por ltimo la constante de desplazamiento, controlando de la misma
rma fo
do{
try{
cout<< endl<<"Introduzca la constante de desplazamiento: ";
n >> cdesplaza; ci
if (atoi(cdesplaza.c_str()) >= 0){
for (unsigned int i = 0; i < cdesplaza.length(); i++){
if (cdesplaza[i] < '0' or cdesplaza[i] > '9')
throw 0;
}
}
Desplaza(atoi(cdesplaza.c_str())); C.pon
break;
}catch(int){
cout << ene que introducir un valor entero." << endl; "Ti
}catch(const char *s){
cout << s << endl;
cout << "La constante tiene que estar entre 0 y " << MOD -
1 << "." << endl;
}
}while(1);
}
void mostrarMenu(string s){
cout << endl << "*---------------------------------------------------*" << endl;
printf ("* %28s *\n", s.c_str());
cout << "*---------------------------------------------------*" << endl;
cout << "* 1. Algoritmo de Cifrado *" << endl;
cout << "* 2. Algoritmo de Descrifrado *" << endl;
cout << "* 3. Reintroducir datos *" << endl;
13
COMUNES.H
#ifndef COMUNES
#define COMUNES
int inv(int, int);
// Calcula el inverso de una constante de multiplicacin
int mcd (int, int);
// Maximo Comn Divisor
void trataclave (string, Mayusculas &);
// Para realizar el filtrado de letras, palabras o frases.
#endif /*COMUNES*/
COMUNES.CPP
#include "comunes.h"
int inv(int a){
int i = 1;
while ((a*i)%27 != 1){
i++;
}
return i;
}
int mcd(int u, int v)
{
int aux;
while (u > 0)
{
if (u < v){
// Intercambiamos valores
aux = u;
u = v;
v = aux;
}
u -= v; // Por el algoritmo de Euclides
}
return v;
}
void trataclave (string linea, Mayusculas &S){
int lon = linea.length(); // longitud de la linea leda del fichero.
int caracter;
Re remos la lnea letra a letra. // cor
for (int i = 0; i < lon; i++){
caracter = S.buscaIncorrecta(linea[i]);
if (caracter != -1)
// Hemos encontrado el caracter, lo sustituimos por el
correcto.
S.anadeCaracter(caracter);
else{
// Buscamos en las maysculas por si se tratara de un signo
de puntuacin
racter = S.buscaEnCorrectas(linea[i]); ca
if (caracter != -1)
// Es una letra maycula, por tanto la agregamos. No
hay problema.
S.anadeCaracter(caracter);
15
else
// Lo ignoramos, en un espacio o signo de
n. puntuaci
continue;
}
}
}
CONCLUSIONES
Lomscostosodelaelaboracindeestealgoritmo,hasidosindudaelmanejodelosmens
paraquesalieratodoensusitio.
Durantelasprximasprcticas,seguramentevayamejorandoalgunosaspectosdelprograma
principalpractica2.cpp.Estonosignificaqueloquehehechoestmal,sinoque
posiblementesemeocurrannuevasideasdebidoaquevoyaestartrabajandoconeste
esquemaduranteelrestodelcuatrimestre.
Despusdeprepararlaexposicindeloscifradosbasadosenhomfonosmientrastrabajaba
enesteprograma,medianmscuentadelovulnerablequepuedellegarasereste
criptosistema,yaquealserunalgoritmoquesustituyecadaletraporotradelmismoalfabeto,
lafrecuenciadelasletrasdeltextooriginalsemantieneenelcriptogramalocualesfcilmente
abordableparaelcriptoanlisis.
16
17
FUENTESDEINFORMACINCONSULTADAS
ManualdeC++delaasignaturaEstructurasdeDatos2delaEUI,alojadaenelservidor
dedicadoalGrupodeEstructurasdeDatosyLingstica
Computacional:https://www.gedlc.ulpgc.es/docencia/ed_ii/
Ustambinelblogdeunchicodehablahispanaelcualofreceartculosmuyinteresantesde
C++:http://kithkananprogramacionencpp.blogspot.com/