(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:
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.
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).
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
usingnamespace std; // Permite utilizar los nombres de las clases y funciones de la biblioteca 'std' sin tener que especificar su nombre completo
intmain(){
// 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 inrange(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 inrange(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).
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
usingnamespace std;
intmain(){
// 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 inrange(1, 27):
# Variable para almacenar el mensaje cifrado actual
cifrado = ""
# Bucle para iterar sobre cada carácter del mensaje
for i inrange(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 inrange(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
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.