Vous êtes sur la page 1sur 17

SeguridadyProteccindela

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

+27 - b) moJ 27.


3. FinalmenteescribimosenelficherodesalidallamadoMensajeEnClaro.txt.
Comoapunteadicionalenestecasotambin,loscaracteresenblancodelcriptogramalos
ignoramosyconvertimoseltextoenunnicobloque.
Elrestodefuncionesmiembrosirvenparainicializarlaconstantededecimacinyde
desplazamiento,controlandoentodomomentoqueseanvalorescorrectos.Encasodeque
algunadelasconstantesnoseacorrectaselanzarunaexcepcindetiporistraqueelusuario
delaclasetendraquecontrolar.
5

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 - S +4) moJ 27 = 1uK


ConlaletraE(cdigo4) C

= (2 - 4 + m 4) oJ 27 = 12 M
Paraelcasocontrario,siaplicamoslafrmulaH

= 14 - (C

+ 27 -4) moJ 27siendo14el


inversodeo = 2.
ConlaletraK(cdigo10) H

= 14 - (1u +27 - 4)moJ 27 = SD


ConlaletraM(cdigo12) H

= 14 - (12 +27 - 4)moJ 27 = 4 E

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

cout << "* 0. Volver *" << endl;


cout << "*---------------------------------------------------*" << endl;
}


int main(){
char opt1, opt2;
char *nfich;
srand(time(NULL));

Afin C;

do{

// Mostramos el men principal y elegimos la opcin
cout << "*---------------------------------------------------*" << endl;
cout << "* CRIPTOSISTEMAS CLASICOS *" << endl;
cout << "*---------------------------------------------------*" << endl;
cout << "* 1. Criptosistema Afin Modulo 27 *" << endl;
cout << "* 0. Salir *" << endl;
cout << "*---------------------------------------------------*" << endl;
cout << endl << "Introduzca la opcion: ";
cin >> opt1;

// Seg
switch (opt1){
n la opcin elegida solicitamos al usuario los datos pertinentes
case '1':
// Mostramos la cabecera y pedimos los datos
cout << endl << "*-------------------------------------------*" << endl;
cout << "* Criptosistema Afin Modulo 27 *" << endl;
cout << "*-------------------------------------------*" << endl;
introducirDatosAfin(C);
mostrarMenu("Criptosistema Afin Modulo 27");
do{
try{
cout << endl << "Introduzca la opcion: ";
cin >> opt2;
switch (opt2){
case '1': // Algoritmo de cifrado
cout << endl << "Introduzca el nombre del fichero a
cifrar: ";
cin >> nfich;
C.acifrado(nfich);
mostr
break;
arMenu("Criptosistema Afin Modulo 27");

case '2': // Algoritmo de descifrado
cout << endl << "Introduzca el nombre del fichero a
descifrar: ";
cin >> nfich;
C.adescifrado(nfich);
mostrarMenu("Criptosistema Afin Modulo 27");
break;

case '3': // Reintroducimos los datos
introducirDatosAfin(C);
mostrarMenu("Criptosistema Afin Modulo 27");
break;
}
}catch(const char *s){
// Control para las posibles excepciones lanzadas en los algoritmos
cout << s << endl;
}
}while (opt2 != '0');
break;
}
}while (opt1 != '0');
return 0;
}
14

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/