Curso de Programación – CLASE 19

(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:

En este programa guardamos el mensaje a cifrar en la variable mensaje, luego la convertimos en mayúsculas, guardando también la longitud del mensaje en la variable L, utilizamos una variable de referencia abc que contendrá todo el alfabeto en una cadena, la longitud de este alfabeto se guardará en la variable abclong, la variable de nombre cifrado comenzará con una cadena vacía que se irá llenando a medida que obtengamos cada carácter cifrado, utilizamos una estructura PARA con la variable i que tomará un valor de 1 hasta L, para recorrer el mensaje a cifrar letra por letra, esta estructura estará anidada a otra estructura PARA con su variable j que tomará un valor de 1 hasta abclong para recorrer letra por letra el alfabeto guardado en la variable abc; gracias a la función subcadena y a dos condicional si-entonces podemos saber:

  1. Si la letra es igual a un espacio en blanco, de ser así concatena un espacio en blanco en la cadena de la variable cifrado.
  2. Si la letra obtenida a partir de la sub cadena de la variable mensaje, es igual a la letra obtenida de la sub cadena de la variable abc, de este modo obtenemos su posición en el alfabeto.

La variable ROT guardará el valor de j (la posición del alfabeto en el momento de la coincidencia), más 13 (el valor de la rotación requerida), con otro condicional si-entonces analizamos si el resultado es superior a abclong, de ser así le restamos el valor de abclong para que vuelva a comenzar a contar posiciones desde la primera letra del alfabeto y así dar con la posición de la letra cifrada resultante, la misma será concatenada a la cadena cifrado.
Al finalizar los procesos de las estructuras PARA nos quedará una cadena resultante guardada en la variable cifrado, que será mostrada en pantalla como el texto resultante de rotar 13 posiciones cada letra.

Analizamos el código

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Algoritmo cesar13
Escribir 'Ingrese el mensaje a cifrar: '
// Se guarda el mensaje a cifrar en la variable (mensaje).
Leer mensaje
// Se convierte el mensaje a cifrar a mayúsculas.
mensaje <- mayusculas(mensaje)
// Se guarda la Longitud del mensaje a cifrar en la variable (L).
L <- longitud(mensaje)
// Se asigna a la variable (abc) una cade con el alfabeto.
abc <- 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
// Se guarda la longitud de la cariable (abc) en la variable (abclong).
abclong <- longitud(abc)
// Se declara una variable llamada (cifrado) para la cadena resultante.
cifrado <- ''
// Se crea un buble para recorrer el mensaje a cifrar letra por letra.
Para i<-1 Hasta L Con Paso 1 Hacer
// Verificamos si es un espacio en Blanco.
Si subcadena(mensaje,i,i)=' ' Entonces
cifrado <- concatenar(cifrado,' ')
FinSi
// Se analiza en un segundo bucle si la letra a analizar existe en el alfabeto.
Para j<-1 Hasta abclong Con Paso 1 Hacer
// Se analiza la subcadena (mensaje) con la sub cadena de (abc).
Si subcadena(mensaje,i,i)=subcadena(abc,j,j) Entonces
// Si hay coincidencia, se le suma a la posición del alfabeto 13 caracteres.
ROT <- j+13
// Si el valor de la variable (ROT) supera al valor de la varible abclong,
// se le resta a (ROT) el valor de (abclong) para que vuelva al inicio.
Si ROT>abclong Entonces
ROT <- ROT-abclong
FinSi
// Se concatena en la variable cifrado la subcadena de (abc) en la posición (ROT).
cifrado <- concatenar(cifrado,subcadena(abc,ROT,ROT))
FinSi
FinPara
FinPara
// Se muestra el mensaje cifrado.
Escribir cifrado
FinAlgoritmo
Algoritmo cesar13 Escribir 'Ingrese el mensaje a cifrar: ' // Se guarda el mensaje a cifrar en la variable (mensaje). Leer mensaje // Se convierte el mensaje a cifrar a mayúsculas. mensaje <- mayusculas(mensaje) // Se guarda la Longitud del mensaje a cifrar en la variable (L). L <- longitud(mensaje) // Se asigna a la variable (abc) una cade con el alfabeto. abc <- 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' // Se guarda la longitud de la cariable (abc) en la variable (abclong). abclong <- longitud(abc) // Se declara una variable llamada (cifrado) para la cadena resultante. cifrado <- '' // Se crea un buble para recorrer el mensaje a cifrar letra por letra. Para i<-1 Hasta L Con Paso 1 Hacer // Verificamos si es un espacio en Blanco. Si subcadena(mensaje,i,i)=' ' Entonces cifrado <- concatenar(cifrado,' ') FinSi // Se analiza en un segundo bucle si la letra a analizar existe en el alfabeto. Para j<-1 Hasta abclong Con Paso 1 Hacer // Se analiza la subcadena (mensaje) con la sub cadena de (abc). Si subcadena(mensaje,i,i)=subcadena(abc,j,j) Entonces // Si hay coincidencia, se le suma a la posición del alfabeto 13 caracteres. ROT <- j+13 // Si el valor de la variable (ROT) supera al valor de la varible abclong, // se le resta a (ROT) el valor de (abclong) para que vuelva al inicio. Si ROT>abclong Entonces ROT <- ROT-abclong FinSi // Se concatena en la variable cifrado la subcadena de (abc) en la posición (ROT). cifrado <- concatenar(cifrado,subcadena(abc,ROT,ROT)) FinSi FinPara FinPara // Se muestra el mensaje cifrado. Escribir cifrado FinAlgoritmo
Algoritmo cesar13
	Escribir 'Ingrese el mensaje a cifrar: '
	// Se guarda el mensaje a cifrar en la variable (mensaje).
	Leer mensaje
	// Se convierte el mensaje a cifrar a mayúsculas.
	mensaje <- mayusculas(mensaje)
	// Se guarda la Longitud del mensaje a cifrar en la variable (L).
	L <- longitud(mensaje)
	// Se asigna a la variable (abc) una cade con el alfabeto.
	abc <- 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
	// Se guarda la longitud de la cariable (abc) en la variable (abclong).
	abclong <- longitud(abc)
	// Se declara una variable llamada (cifrado) para la cadena resultante.
	cifrado <- ''
	// Se crea un buble para recorrer el mensaje a cifrar letra por letra.
	Para i<-1 Hasta L Con Paso 1 Hacer
		// Verificamos si es un espacio en Blanco.
		Si subcadena(mensaje,i,i)=' ' Entonces
			cifrado <- concatenar(cifrado,' ')
		FinSi
		// Se analiza en un segundo bucle si la letra a analizar existe en el alfabeto.
		Para j<-1 Hasta abclong Con Paso 1 Hacer
			// Se analiza la subcadena (mensaje) con la sub cadena de (abc).
			Si subcadena(mensaje,i,i)=subcadena(abc,j,j) Entonces
				// Si hay coincidencia, se le suma a la posición del alfabeto 13 caracteres.
				ROT <- j+13
				// Si el valor de la variable (ROT) supera al valor de la varible abclong,
				// se le resta a (ROT) el valor de (abclong) para que vuelva al inicio.
				Si ROT>abclong Entonces
					ROT <- ROT-abclong
				FinSi
				// Se concatena en la variable cifrado la subcadena de (abc) en la posición (ROT).
				cifrado <- concatenar(cifrado,subcadena(abc,ROT,ROT))
			FinSi
		FinPara
	FinPara
	// Se muestra el mensaje cifrado.
	Escribir cifrado
FinAlgoritmo

Ejecutamos el programa


Veamos el código en C++ (comentado línea por línea):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// 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;
}
// 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; }
// 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;
}


Ahora el código en PYTHON (comentado línea por línea):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# Variable para almacenar el mensaje a cifrar
mensaje = input("Ingrese el mensaje a cifrar: ")
# Conversión del mensaje al mayúsculas
mensaje = mensaje.upper()
# Obtención de la longitud del mensaje
L = len(mensaje)
# Constante que contiene las letras mayúsculas en orden alfabético
abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
# Variable que almacena la longitud de la cadena 'abc'
abclong = len(abc)
# Variable para almacenar el mensaje cifrado
cifrado = ""
# Bucle para iterar sobre cada carácter del mensaje
for i in range(1, L + 1):
# Si el carácter es un espacio, se agrega al mensaje cifrado sin cambios
if mensaje[i-1:i] == " ":
cifrado = cifrado + " "
# Caso de que el carácter no sea un espacio: encontrar la posición correspondiente en la cadena 'abc'
else:
for j in range (1, abclong + 1):
if mensaje[i-1:i] == abc[j-1:j]:
ROT = j+13 # Si hay coincidencia, se le suma a la posición del alfabeto 13 caracteres.
# En caso de que el valor de ROT supere la longitud de 'abc', se ajusta para evitar indices fuera de rango
if ROT > abclong:
ROT = ROT-abclong
# Se concatena en la variable cifrado la subcadena correspondiente a la posición ROT
cifrado = cifrado + abc[ROT-1:ROT]
# Muestra el mensaje cifrado
print(cifrado)
# Variable para almacenar el mensaje a cifrar mensaje = input("Ingrese el mensaje a cifrar: ") # Conversión del mensaje al mayúsculas mensaje = mensaje.upper() # Obtención de la longitud del mensaje L = len(mensaje) # Constante que contiene las letras mayúsculas en orden alfabético abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" # Variable que almacena la longitud de la cadena 'abc' abclong = len(abc) # Variable para almacenar el mensaje cifrado cifrado = "" # Bucle para iterar sobre cada carácter del mensaje for i in range(1, L + 1): # Si el carácter es un espacio, se agrega al mensaje cifrado sin cambios if mensaje[i-1:i] == " ": cifrado = cifrado + " " # Caso de que el carácter no sea un espacio: encontrar la posición correspondiente en la cadena 'abc' else: for j in range (1, abclong + 1): if mensaje[i-1:i] == abc[j-1:j]: ROT = j+13 # Si hay coincidencia, se le suma a la posición del alfabeto 13 caracteres. # En caso de que el valor de ROT supere la longitud de 'abc', se ajusta para evitar indices fuera de rango if ROT > abclong: ROT = ROT-abclong # Se concatena en la variable cifrado la subcadena correspondiente a la posición ROT cifrado = cifrado + abc[ROT-1:ROT] # Muestra el mensaje cifrado print(cifrado)
# Variable para almacenar el mensaje a cifrar
mensaje = input("Ingrese el mensaje a cifrar: ")

# Conversión del mensaje al mayúsculas
mensaje = mensaje.upper()

# Obtención de la longitud del mensaje
L = len(mensaje)

# Constante que contiene las letras mayúsculas en orden alfabético
abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

# Variable que almacena la longitud de la cadena 'abc'
abclong = len(abc)

# Variable para almacenar el mensaje cifrado
cifrado = ""

# Bucle para iterar sobre cada carácter del mensaje
for i in range(1, L + 1):
    # Si el carácter es un espacio, se agrega al mensaje cifrado sin cambios
    if mensaje[i-1:i] == " ":
        cifrado = cifrado + " "

    # Caso de que el carácter no sea un espacio: encontrar la posición correspondiente en la cadena 'abc'
    else:
        for j in range (1, abclong + 1):
            if mensaje[i-1:i] == abc[j-1:j]:
                ROT = j+13   # Si hay coincidencia, se le suma a la posición del alfabeto 13 caracteres.

                # En caso de que el valor de ROT supere la longitud de 'abc', se ajusta para evitar indices fuera de rango
                if ROT > abclong:
                    ROT = ROT-abclong

                # Se concatena en la variable cifrado la subcadena correspondiente a la posición ROT
                cifrado = cifrado + abc[ROT-1:ROT]

# Muestra el mensaje cifrado
print(cifrado)

Cifrado César con rotación multi

En esta versión agregamos una estructura PARA 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).

Analizamos el código

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Algoritmo cesar_multi
Escribir 'Ingrese el mensaje a cifrar: '
// Se guarda el mensaje a cifrar en la variable (mensaje)
Leer mensaje
// Se convierte el mensaje a cifrar a mayúsculas.
mensaje <- mayusculas(mensaje)
// Se guarda la longitud del mensaje a cifrar en la variable (L).
L <- Longitud(mensaje)
// Se asigna a la variable (abc) una cadena con el alfabeto.
abc <- 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
// Se guarda la longitud de la variable (abc) en la variable (abclong).
abclong <- Longitud(abc)
Escribir 'Cifrando César en las 26 rotaciones posible...'
// Rotamos y mostramos resultado por cada una de las 26 posibilidades.
Para multi<-1 Hasta 26 Hacer
// Se declara una variable llamada (cifrado) para la cadena resultante.
cifrado <- ''
// Se crea un bucle para recorrer el mensaje a cifrar letra por letra.
Para i<-1 Hasta L Hacer
// Verificamos si es un espacio en blanco.
Si subcadena(mensaje,i,i)=' ' Entonces
cifrado <- concatenar(cifrado,' ')
FinSi
// Se analiza en un segundo bucle si la letra a analizar existe en el alfabeto.
Para j<-1 Hasta abclong Hacer
// Se analiza la sub cadena de (mensaje) con la sub cadena de (abc).
Si subcadena(mensaje,i,i)=subcadena(abc,j,j) Entonces
// Si hay coincidencia se le sema a la posici{on del alfabeto el valor a rotar.
ROT <- j+multi
// Si el valor de la variable (ROT) supera al valor de la variable (abclong),
// se le resta a (ROT) el valor de (abclong) para que vuelva al inicio.
Si ROT>abclong Entonces
ROT <- ROT-abclong
FinSi
// Se concatena en la variable (cifrado) la subcadena de (abc) en la posición (ROT).
cifrado <- concatenar(cifrado,subcadena(abc,ROT,ROT))
FinSi
FinPara
FinPara
// Se muestra el mensaje cifrado.
Escribir 'ROT', multi, ' ', cifrado
FinPara
FinAlgoritmo
Algoritmo cesar_multi Escribir 'Ingrese el mensaje a cifrar: ' // Se guarda el mensaje a cifrar en la variable (mensaje) Leer mensaje // Se convierte el mensaje a cifrar a mayúsculas. mensaje <- mayusculas(mensaje) // Se guarda la longitud del mensaje a cifrar en la variable (L). L <- Longitud(mensaje) // Se asigna a la variable (abc) una cadena con el alfabeto. abc <- 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' // Se guarda la longitud de la variable (abc) en la variable (abclong). abclong <- Longitud(abc) Escribir 'Cifrando César en las 26 rotaciones posible...' // Rotamos y mostramos resultado por cada una de las 26 posibilidades. Para multi<-1 Hasta 26 Hacer // Se declara una variable llamada (cifrado) para la cadena resultante. cifrado <- '' // Se crea un bucle para recorrer el mensaje a cifrar letra por letra. Para i<-1 Hasta L Hacer // Verificamos si es un espacio en blanco. Si subcadena(mensaje,i,i)=' ' Entonces cifrado <- concatenar(cifrado,' ') FinSi // Se analiza en un segundo bucle si la letra a analizar existe en el alfabeto. Para j<-1 Hasta abclong Hacer // Se analiza la sub cadena de (mensaje) con la sub cadena de (abc). Si subcadena(mensaje,i,i)=subcadena(abc,j,j) Entonces // Si hay coincidencia se le sema a la posici{on del alfabeto el valor a rotar. ROT <- j+multi // Si el valor de la variable (ROT) supera al valor de la variable (abclong), // se le resta a (ROT) el valor de (abclong) para que vuelva al inicio. Si ROT>abclong Entonces ROT <- ROT-abclong FinSi // Se concatena en la variable (cifrado) la subcadena de (abc) en la posición (ROT). cifrado <- concatenar(cifrado,subcadena(abc,ROT,ROT)) FinSi FinPara FinPara // Se muestra el mensaje cifrado. Escribir 'ROT', multi, ' ', cifrado FinPara FinAlgoritmo
Algoritmo cesar_multi
	Escribir 'Ingrese el mensaje a cifrar: '
	// Se guarda el mensaje a cifrar en la variable (mensaje)
	Leer mensaje
	// Se convierte el mensaje a cifrar a mayúsculas.
	mensaje <- mayusculas(mensaje)
	// Se guarda la longitud del mensaje a cifrar en la variable (L).
	L <- Longitud(mensaje)
	// Se asigna a la variable (abc) una cadena con el alfabeto.
	abc <- 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
	// Se guarda la longitud de la variable (abc) en la variable (abclong).
	abclong <- Longitud(abc)
	Escribir 'Cifrando César en las 26 rotaciones posible...'
	// Rotamos y mostramos resultado por cada una de las 26 posibilidades.
	Para multi<-1 Hasta 26 Hacer
		// Se declara una variable llamada (cifrado) para la cadena resultante.
		cifrado <- ''
		// Se crea un bucle para recorrer el mensaje a cifrar letra por letra.
		Para i<-1 Hasta L Hacer
			// Verificamos si es un espacio en blanco.
			Si subcadena(mensaje,i,i)=' ' Entonces
				cifrado <- concatenar(cifrado,' ')
			FinSi
			// Se analiza en un segundo bucle si la letra a analizar existe en el alfabeto.
			Para j<-1 Hasta abclong Hacer
				// Se analiza la sub cadena de (mensaje) con la sub cadena de (abc). 
				Si subcadena(mensaje,i,i)=subcadena(abc,j,j) Entonces
					// Si hay coincidencia se le sema a la posici{on del alfabeto el valor a rotar.
					ROT <- j+multi
					// Si el valor de la variable (ROT) supera al valor de la variable (abclong),
					// se le resta a (ROT) el valor de (abclong) para que vuelva al inicio.
					Si ROT>abclong Entonces
						ROT <- ROT-abclong
					FinSi
					// Se concatena en la variable (cifrado) la subcadena de (abc) en la posición (ROT).
					cifrado <- concatenar(cifrado,subcadena(abc,ROT,ROT))
				FinSi
			FinPara
		FinPara
		// Se muestra el mensaje cifrado.
		Escribir 'ROT', multi, ' ', cifrado
	FinPara
FinAlgoritmo

Ejecutamos el programa


Veamos el código en C++ (comentado línea por línea):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// 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;
}
// 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; }
// 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;
}


Ahora el código en PYTHON (comentado línea por línea):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# Variable para almacenar el mensaje a cifrar
mensaje = input("Ingrese el mensaje a cifrar: ")
# Conversión del mensaje al mayúsculas
mensaje = mensaje.upper()
# Obtención de la longitud del mensaje
L = len(mensaje)
# Constante que contiene las letras mayúsculas en orden alfabético
abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
# Variable que almacena la longitud de la cadena 'abc'
abclong = len(abc)
print("Cifrando César en las 26 rotaciones posible...") # Muestra un mensaje para indicar que se está ejecutando el programa
# Bucle para iterar sobre cada una de las 26 posibilidades
for multi in range(1, 27):
# Variable para almacenar el mensaje cifrado actual
cifrado = ""
# Bucle para iterar sobre cada carácter del mensaje
for i in range(1, L + 1):
if mensaje[i-1:i] == " ":
# Si el carácter es un espacio, se agrega al mensaje cifrado sin cambios
cifrado = cifrado + " "
else:
# Caso de que el carácter no sea un espacio: encontrar la posición correspondiente en la cadena 'abc'
for j in range (1, abclong + 1):
if mensaje[i-1:i] == abc[j-1:j]:
ROT = j+multi # Si hay coincidencia, se le suma a la posición del alfabeto 13 caracteres.
# En caso de que el valor de ROT supere la longitud de 'abc', se ajusta para evitar indices fuera de rango
if ROT > abclong:
ROT = ROT-abclong
# Se concatena en la variable cifrado la subcadena correspondiente a la posición ROT
cifrado = cifrado + abc[ROT-1:ROT]
# Se muestra el mensaje cifrado actual
print(f"ROT {multi}, {cifrado}")
# Variable para almacenar el mensaje a cifrar mensaje = input("Ingrese el mensaje a cifrar: ") # Conversión del mensaje al mayúsculas mensaje = mensaje.upper() # Obtención de la longitud del mensaje L = len(mensaje) # Constante que contiene las letras mayúsculas en orden alfabético abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" # Variable que almacena la longitud de la cadena 'abc' abclong = len(abc) print("Cifrando César en las 26 rotaciones posible...") # Muestra un mensaje para indicar que se está ejecutando el programa # Bucle para iterar sobre cada una de las 26 posibilidades for multi in range(1, 27): # Variable para almacenar el mensaje cifrado actual cifrado = "" # Bucle para iterar sobre cada carácter del mensaje for i in range(1, L + 1): if mensaje[i-1:i] == " ": # Si el carácter es un espacio, se agrega al mensaje cifrado sin cambios cifrado = cifrado + " " else: # Caso de que el carácter no sea un espacio: encontrar la posición correspondiente en la cadena 'abc' for j in range (1, abclong + 1): if mensaje[i-1:i] == abc[j-1:j]: ROT = j+multi # Si hay coincidencia, se le suma a la posición del alfabeto 13 caracteres. # En caso de que el valor de ROT supere la longitud de 'abc', se ajusta para evitar indices fuera de rango if ROT > abclong: ROT = ROT-abclong # Se concatena en la variable cifrado la subcadena correspondiente a la posición ROT cifrado = cifrado + abc[ROT-1:ROT] # Se muestra el mensaje cifrado actual print(f"ROT {multi}, {cifrado}")
# Variable para almacenar el mensaje a cifrar
mensaje = input("Ingrese el mensaje a cifrar: ")

# Conversión del mensaje al mayúsculas
mensaje = mensaje.upper()

# Obtención de la longitud del mensaje
L = len(mensaje)

# Constante que contiene las letras mayúsculas en orden alfabético
abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

# Variable que almacena la longitud de la cadena 'abc'
abclong = len(abc)

print("Cifrando César en las 26 rotaciones posible...") # Muestra un mensaje para indicar que se está ejecutando el programa

# Bucle para iterar sobre cada una de las 26 posibilidades
for multi in range(1, 27):
    # Variable para almacenar el mensaje cifrado actual
    cifrado = ""

    # Bucle para iterar sobre cada carácter del mensaje
    for i in range(1, L + 1):
        if mensaje[i-1:i] == " ":
            # Si el carácter es un espacio, se agrega al mensaje cifrado sin cambios
            cifrado = cifrado + " "

        else:
            # Caso de que el carácter no sea un espacio: encontrar la posición correspondiente en la cadena 'abc'
            for j in range (1, abclong + 1):
                if mensaje[i-1:i] == abc[j-1:j]:
                    ROT = j+multi  # Si hay coincidencia, se le suma a la posición del alfabeto 13 caracteres.

                    # En caso de que el valor de ROT supere la longitud de 'abc', se ajusta para evitar indices fuera de rango
                    if ROT > abclong:
                        ROT = ROT-abclong

                    # Se concatena en la variable cifrado la subcadena correspondiente a la posición ROT
                    cifrado = cifrado + abc[ROT-1:ROT]

    # Se muestra el mensaje cifrado actual
    print(f"ROT {multi}, {cifrado}")


TAREA PARA EL HOGAR

  1. 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.
  2. 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.
  3. Utilizando todo lo aprendido, y hacer un nuevo programa que al ingresar un texto nos diga cuantas vocales y consonantes tiene la cadena.