Soluciones de Seguridad de Datos en C++ y Python

Cifrado

Proceso de codificación de datos para proteger la información sensible de accesos no autorizados.

Cifrado con algoritmo César en C++

El algoritmo de cifrado utilizado en C++ es el cifrado César, que desplaza cada carácter del texto original un número fijo de posiciones en el alfabeto. El número de desplazamientos está dado por una llave.

Clase Cifrado

#ifndef CIFRADO_H
#define CIFRADO_H
    
#include <string>
using namespace std;
    
class Cifrado { // Clase para cifrar y descifrar
    public:
        string cifrarMensaje(string dato, int llave); // Cifra un mensaje con método Cesar
        string descifrarMensaje(string dato, int llave); // Descifra un mensaje con método Cesar
        void cifrarArchivo(const string &inputFile, const string &outputFile, int llave); // Cifra el contenido de un archivo con el método Cesar
        void descifrarArchivo(const string &inputFile, const string &outputFile, int llave); // Descifra el contenido de un archivo con el método Cesar
};
#endif

Ejemplos de Uso

Cifrar Mensaje

string Cifrado::cifrarMensaje(string dato, int llave) {
string resultado = "";
        
for (char c : dato) {
    if (isalpha(c)) { // Si el carácter es una letra
        char base = islower(c) ? 'a' : 'A';
        resultado += (c - base + llave) % 26 + base;
    } else if (isdigit(c)) { // Si el carácter es un dígito
        resultado += (c - '0' + llave) % 10 + '0';
    } else { // Si el carácter no es una letra ni un dígito
    resultado += c;
        }
    }
    return resultado;
}

Resultado

El texto "Hola Mundo" cifrado con un desplazamiento (llave)de 3 se convierte en "Krod Pxqgr".

Descifrar Mensaje

string Cifrado::descifrarMensaje(string dato, int llave) {
    string resultado = "";
    for (char c : dato) {
        if (isalpha(c)) { // Si el carácter es una letra
            char base = islower(c) ? 'a' : 'A';
            resultado += (c - base - llave + 26) % 26 + base;
        } else if (isdigit(c)) { // Si el carácter es un dígito
            resultado += (c - '0' - llave + 10) % 10 + '0';
        } else { // Si el carácter no es una letra ni un dígito
            resultado += c;
        }
    }
    return resultado;
}

Resultado

El texto "Krod Pxqgr" descifrado con un desplazamiento (llave) de 3 se convierte en "Hola Mundo".

Cifrar Archivo

void Cifrado::cifrarArchivo(const string &inputFile, const string &outputFile, int llave) {
    // Abrir archivo de entrada
    ifstream entrada(inputFile);
    if (!entrada.is_open()) {
        cerr << "Error: No se pudo abrir el archivo de entrada: " << inputFile << endl;
        return;
    }

    // Leer archivo de entrada
    string linea, contenido;
    while (getline(entrada, linea)) {
        contenido += linea + "\n";
    }
    entrada.close();

    // Cifrar el contenido leído
    string contenidoCifrado = cifrarMensaje(contenido, llave);

    // Guardar el archivo cifrado
    ofstream salida(outputFile);
    if (!salida.is_open()) {
        cerr << "Error: No se pudo abrir el archivo de salida: " << outputFile << endl;
        return;
    }
    salida << contenidoCifrado;
    salida.close();
    cout << "El contenido cifrado se ha guardado en " << outputFile << endl;
}

Resultado

archivo.txt:
Datos de persona
Juan Perez
juanperez@gmaillcom
1234567890123456
Transferencia
archivo_cifrado.txt:
Ebupt ef qfstpob
Kvbo Qfsfa
kvboqfsfa@hnbjm.dpn
2345678901234567
Usbotgfsfodjb

Descifrar Archivo

void Cifrado::descifrarArchivo(const string &inputFile, const string &outputFile, int llave) {
    // Abrir archivo de entrada
    ifstream entrada(inputFile);
    if (!entrada.is_open()) {
        cerr << "Error: No se pudo abrir el archivo de entrada: " << inputFile
            << endl;
        return;
    }

    // Leer archivo de entrada
    string linea, contenido;
    while (getline(entrada, linea)) {
        contenido += linea + "\n";
    }
    entrada.close();

    // Descifrar el contenido leído
    string contenidoDescifrado = descifrarMensaje(contenido, llave);

    // Guardar el archivo descifrado
    ofstream salida(outputFile);
    if (!salida.is_open()) {
        cerr << "Error: No se pudo abrir el archivo de salida: " << outputFile
            << endl;
        return;
    }
    salida << contenidoDescifrado;
    salida.close();
    cout << "El contenido descifrado se ha guardado en " << outputFile << endl;
}

Resultado

archivo_cifrado.txt:
Ebupt ef qfstpob
Kvbo Qfsfa
kvboqfsfa@hnbjm.dpn
2345678901234567
Usbotgfsfodjb
archivo_descifrado.txt:
Datos de persona
Juan Perez
juanperez@gmaillcom
1234567890123456
Transferencia