(Creado por el analista de sistemas y docente Leonel Iván Saafigueroa)
CRIPTOGRAFÍA
La escritura oculta se lleva practicando desde hace más de 4.000 años. Durante el Imperio Romano se extendió el cifrado César, cuyo uso se atribuye al propio Julio César. En esta sección crearemos programas que utilizarán los mismos métodos de antaño.

La palabra criptografía viene de los términos griegos Kryptos (oculto) y Graphos (escribir), es un método por el cual se utilizan distintas técnicas de cifrado para esconder mensajes, o codificar información sensible que muchas veces es de vital importancia.
En criptografía, el cifrado César, también conocido como cifrado por desplazamiento, es una de las técnicas de codificación más simples, utiliza un tipo de cifrado por sustitución en el que una letra en el texto original es reemplazada por otra letra que se encuentra en un número fijo de posiciones más adelante en el alfabeto. Este método debe su nombre, según Suetonio, a Julio César, que lo usaba para comunicarse con sus generales.

Vamos a crear un programa que permita codificar un mensaje utilizando el cifrado César con rotación 13:

Veamos el código (comentado línea por línea):
// Inclusión de bibliotecas necesarias para la ejecución del programa
#include <iostream> // Biblioteca de entrada/output de datos
#include <string> // Biblioteca para manejo de cadenas de texto
using namespace std; // Permite utilizar los nombres de las clases y funciones de la biblioteca 'std' sin tener que especificar su nombre completo
int main() {
// Variable para almacenar el mensaje a cifrar
string mensaje;
// Peticion al usuario para ingresar un mensaje para cifrar
cout << "Ingrese el mensaje a cifrar: ";
// Lectura del mensaje a partir de la entrada estándar utilizando la función getline()
getline(cin, mensaje);
// Conversión del mensaje a mayúsculas
for (char& c : mensaje) {
// Utiliza la función toupper() para convertir cada carácter a mayúscula
c = toupper(c);
}
// Variable para almacenar la longitud del mensaje
int L = mensaje.length();
// Constante que contiene las letras mayúsculas en orden alfabético
const string abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// Variable para almacenar la longitud de la cadena 'abc'
int abclong = abc.length();
// Variable vacía para almacenar el mensaje cifrado
string cifrado;
// Bucle para iterar sobre cada carácter del mensaje
for (int i = 0; i < L; ++i) {
// Si el carácter es un espacio, se agrega al mensaje cifrado sin cambios
if (mensaje[i] == ' ') {
// Agregación de un espacio al mensaje cifrado
cifrado += " ";
} else {
// Bucle para encontrar la posición correspondiente en la cadena 'abc'
for (int j = 1; j <= abclong; ++j) {
if (mensaje[i] == abc[j - 1]) {
int ROT = j + 13; // Calcula el rotación necesaria
// Si la rotación excede la longitud de 'abc', se ajusta para evitar indices fuera de rango
if (ROT > abclong) {
ROT -= abclong;
}
// Agregación de la subcadena correspondiente a la posición ROT al mensaje cifrado
for (int k = ROT; k <= ROT; ++k) {
cifrado += abc[k - 1];
}
}
}
}
}
// Imprimición del mensaje cifrado en la salida estándar
cout << "Mensaje cifrado: " << cifrado << endl;
// Finalización del programa y devolución de un valor de salida de 0
return 0;
}
Cifrado César con rotación multi
En esta versión agregamos una estructura for con una variable multi con valores que van del 1 al 26, de esta forma logramos que el programa realice todas las rotaciones posibles (el número 26 es por la cantidad de letras que tenemos en nuestro alfabeto).
Veamos el código (comentado línea por línea):
// Inclusión de bibliotecas necesarias para la ejecución del programa
#include <iostream>
#include <string>
// Utilización del espacio de nombres 'std' para evitar tener que especificar su nombre completo en las referencias a sus clases y funciones
using namespace std;
int main() {
// Variable para almacenar el mensaje a cifrar
string mensaje;
// Peticion al usuario para ingresar un mensaje para cifrar
cout << "Ingrese el mensaje a cifrar: ";
getline(cin, mensaje); // Lectura del mensaje desde la entrada estándar utilizando la función getline()
// Conversión del mensaje a mayúsculas
for (char& c : mensaje) {
// Utiliza la función toupper() para convertir cada carácter al mayúsculo
c = toupper(c);
}
// Variable para almacenar la longitud del mensaje
int L = mensaje.length();
// Constante que contiene las letras mayúsculas en orden alfabético
const string abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// Variable que almacena la longitud de la cadena 'abc'
int abclong = abc.length();
cout << "Cifrando César en las 26 rotaciones posibles..." << endl; // Muestra un mensaje para indicar que se está ejecutando el programa
// Bucle para iterar sobre cada una de las 26 posibilidades de rotación
for (int multi = 1; multi <= 26; ++multi) {
string cifrado;
// Bucle para iterar sobre cada carácter del mensaje
for (int i = 0; i < L; ++i) {
if (mensaje[i] == ' ') { // Si el carácter es un espacio, se agrega al mensaje cifrado sin cambios
// Agregación de un espacio al mensaje cifrado
cifrado += " ";
} else {
bool encontrado = false;
// Bucle para encontrar la posición correspondiente en la cadena 'abc'
for (int j = 1; j <= abclong; ++j) {
if (mensaje[i] == abc[j - 1]) {
int ROT = j + multi;
// Si la rotación excede la longitud de 'abc', se ajusta para evitar indices fuera de rango
if (ROT > abclong) {
ROT -= abclong;
}
// Agregación de la subcadena correspondiente a la posición ROT al mensaje cifrado
for (int k = ROT; k <= ROT; ++k) {
cifrado += abc[k - 1];
}
encontrado = true;
}
}
if (!encontrado) { // Si no se ha encontrado, se agrega el carácter original
// Agregación del carácter original al mensaje cifrado
cifrado += mensaje[i];
}
}
}
cout << "ROT " << multi << " " << cifrado << endl; // Muestra el resultado de la rotación para la actual posibilidad
}
return 0;
}
TAREA PARA EL HOGAR
- Modificar la última versión del programa para que pueda calcular las rotaciones necesarias basándose en la longitud de la cadena del alfabeto, de esta forma si agregamos la letra Ñ debería de sumar una rotación más automáticamente.
- Agregar al alfabeto letras con tildes, puntos, comas, y todo lo que haga falta para que podamos copiar un texto, luego pegarlo, y que nada quede fuera del cifrado.
- Utilizando todo lo aprendido, y hacer un nuevo programa que al ingresar un texto nos diga cuantas vocales y consonantes tiene la cadena.