#include <iostream>
// se incluye la clase Cifrado para despues llamar a sus metodos
#include "Cifrado.h"
using namespace std;
int main(void)
{
// se crea un objeto de la clase Cifrado (Instanciaciación)
Cifrado *obj = new Cifrado();
// se define la variable "cla" de tipo entero y "msg" de tipo string
int cla;
string msg;
cout << "=============== CIFRADO CESAR ===============" << endl;
// pedimos el mensaje para guardarlo en la variable "msg"
cout << "Digite mensaje: \t";
getline(cin, msg); //el metodo getline permite leer cadenas con espacios
obj->setMensaje(msg);
// pedimos la clave para guardarla en la variable "cla"
cout << "Digite clave: ";
cin >> cla;
obj->setClave(cla);
obj->cifradoCesar(); // se llama al metodo para cifrar el mensaje
cout << "Mensaje cifrado: \t" << obj->getMensaje() << endl;
}
#ifndef CIFRADO_H
#define CIFRADO_H
#include
using namespace std;
class Cifrado
{
public:
Cifrado();
virtual ~Cifrado();
// se definen el metodo publico cifradoCesar() de tipo void
void cifradoCesar();
// se definen los metodos Setters y Getters de los atributos de la clase
void setClave(int n);
int getClave();
void setMensaje(string n);
string getMensaje();
protected:
private:
// se definen los atributos privados de la clase
int clave;
string mensaje;
};
#endif // CIFRADO_H
#include "Cifrado.h"
Cifrado::Cifrado()
{
clave = 0;
mensaje = " ";
}
Cifrado::~Cifrado()
{
//dtor
}
/** para poder entender este cifrado se debe tener en claro el cifrado cesar
* y los valores ASCII de las letras del alfabeto en ingles ya sean mayusculas
* o minusculas, sabemos que hay 26 letras en el alfabeto ingles
* la primera letra en minuscula "a" en la tabla ASCII tiene el vblog e 97
* ahora vamos a realizar el siguiente calculo para poder cifrar el mensaje:
* 1. al caracter de la pesto de "mensaje" se le asignara:
* el valor del caracter "mensaje" en la posicion "i" menos la primera letra "a"
* mas el valor de la clave, sabiendo este resultado, calcularemos el RESTO (modulo)
* se calcula el RESTO entre el resultado anterior y 26 + 97 (123)
* el resultado sera el caracter cifrado
* POR EJEMPLO: supongamos que tenemos la palabra "omar"
* y se ingreso la clave 5, eso significa que se correran 5 veces las letras
* realizando los calculo, 'rounded's:
* la posicion 0 de "mensaje" sera el caracter "o" que tiene el valor "111" en ASCII
* a esa posicion se le asigna la la posicion 0 de "mensaje" (111) menos el caracter "a"
* que equivale a 97 en ASCII mas la clave (5) ese resultado daria 19
* ahora que sabemos el resultado calcularemos el RESTO o modulo
* el RESTO del resultado anterior (19) entre 26 + 97 (123)
* es igual a 116, el 116 en la tabla ASCII es una "t" minuscula y podemos
* notar que se corrieron 5 letras desde la "o" y listo el mismo procedimiento
* con las demas letras en las mayusculas o minusculas :) ESPERO HABERTE AYUDADO
*/
void Cifrado::cifradoCesar()
{
/* bucle para empezar a encriptar el mensaje
* se utiliza el metodo size() para saber la longitud de caracteres del mensaje
*/
for (int i = 0, j = mensaje.size(); i < j; i++)
{
/* utilizaremos el metodo isalpha(), este metodo comprueba si un carácter es alfabético.
* isalpha verifica el entero "char" que pertenezca al rango de letras (A a Z o a a z), por defecto. La
* verificación se hace mediante una tabla.
*/
// para las letras minúsculas islower()
if (islower(mensaje[i]) && isalpha(mensaje[i]))
{
mensaje[i] = (mensaje[i] - 'a' + clave) % 26 + 97;
}
// para las letras mayúsculas isupper()
else if (isupper(mensaje[i]) && isalpha(mensaje[i]))
{
mensaje[i] = (mensaje[i] - 'A' + clave) % 26 + 65;
}
}
}
// implementacion de los metodos Setters y Getters
void Cifrado::setClave(int n)
{
clave = n;
}
int Cifrado::getClave()
{
return clave;
}
void Cifrado::setMensaje(string n)
{
mensaje = n;
}
string Cifrado::getMensaje()
{
return mensaje;
}