Cifrado César en C - Implementación Paso a Paso

advertisement

Cifrado César en Programación C es un proyecto fundamental que todo estudiante de programación en C debe dominar. Este tutorial proporciona una implementación completa y funcional con explicaciones detalladas de cada componente. Para entender los fundamentos teóricos de este cifrado, visita nuestra Guía del Cifrado César.

Paso 1: Incluir las Librerías Necesarias

Primero, debemos incluir las librerías necesarias que proporcionan funciones para entrada/salida, manipulación de cadenas y operaciones con caracteres.

#include <stdio.h>
#include <string.h>
#include <ctype.h>

Paso 2: Crear la Función de Encriptación

La función de encriptación recibe una cadena de texto, un valor de desplazamiento y un buffer de resultado. Procesa cada carácter, desplazando las letras mientras preserva los caracteres no alfabéticos.

// Función para encriptar texto usando cifrado César
void encrypt(char *text, int shift, char *result) {
    int i;
    int length = strlen(text);

    for (i = 0; i < length; i++) {
        char ch = text[i];

        // Encriptar letras mayúsculas
        if (ch >= 'A' && ch <= 'Z') {
            result[i] = ((ch - 'A' + shift) % 26) + 'A';
        }
        // Encriptar letras minúsculas
        else if (ch >= 'a' && ch <= 'z') {
            result[i] = ((ch - 'a' + shift) % 26) + 'a';
        }
        // Mantener caracteres no alfabéticos sin cambios
        else {
            result[i] = ch;
        }
    }
    result[length] = '\0'; // Terminar la cadena con null
}

Paso 3: Implementar la Función de Desencriptación

La desencriptación es simplemente encriptación con el desplazamiento invertido. Calculamos el desplazamiento inverso y utilizamos nuestra función de encriptación.

// Función para desencriptar texto usando cifrado César
void decrypt(char *text, int shift, char *result) {
    // La desencriptación es encriptación con desplazamiento negativo
    int decryptShift = 26 - (shift % 26);
    encrypt(text, decryptShift, result);
}

Paso 4: Construir la Función Principal

La función principal proporciona una interfaz de menú amigable, maneja la validación de entrada y demuestra tanto encriptación como desencriptación.

int main() {
    char text[1000];
    char result[1000];
    int shift = 3; // Desplazamiento César por defecto

    // Ejemplo de uso
    printf("Demo de Cifrado César\n");
    printf("Ingresa el texto: ");
    fgets(text, sizeof(text), stdin);

    // Eliminar salto de línea si está presente
    if (text[strlen(text) - 1] == '\n') {
        text[strlen(text) - 1] = '\0';
    }

    // Encriptar el texto
    encrypt(text, shift, result);
    printf("\nOriginal: %s\n", text);
    printf("Encriptado: %s\n", result);

    // Desencriptar el texto
    decrypt(result, shift, text);
    printf("Desencriptado: %s\n", text);

    return 0;
}

Código del Programa Completo

Aquí está el programa completo de cifrado César, listo para compilar, que combina todos los pasos anteriores:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

// Función para encriptar texto usando cifrado César
void encrypt(char *text, int shift, char *result) {
    int i;
    int length = strlen(text);

    for (i = 0; i < length; i++) {
        char ch = text[i];

        // Encriptar letras mayúsculas
        if (ch >= 'A' && ch <= 'Z') {
            result[i] = ((ch - 'A' + shift) % 26) + 'A';
        }
        // Encriptar letras minúsculas
        else if (ch >= 'a' && ch <= 'z') {
            result[i] = ((ch - 'a' + shift) % 26) + 'a';
        }
        // Mantener caracteres no alfabéticos sin cambios
        else {
            result[i] = ch;
        }
    }
    result[length] = '\0'; // Terminar la cadena con null
}

// Función para desencriptar texto usando cifrado César
void decrypt(char *text, int shift, char *result) {
    // La desencriptación es encriptación con desplazamiento negativo
    int decryptShift = 26 - (shift % 26);
    encrypt(text, decryptShift, result);
}

// Función para mostrar el menú y obtener la elección del usuario
int getChoice() {
    int choice;
    printf("\n=== Programa de Cifrado César ===\n");
    printf("1. Encriptar texto\n");
    printf("2. Desencriptar texto\n");
    printf("3. Salir\n");
    printf("Ingresa tu opción (1-3): ");
    scanf("%d", &choice);
    return choice;
}

int main() {
    char text[1000];
    char result[1000];
    int shift;
    int choice;

    printf("¡Bienvenido al Programa de Cifrado César!\n");

    do {
        choice = getChoice();

        switch(choice) {
            case 1:
                printf("\nIngresa el texto a encriptar: ");
                getchar(); // Limpiar buffer
                fgets(text, sizeof(text), stdin);

                // Eliminar salto de línea si está presente
                if (text[strlen(text) - 1] == '\n') {
                    text[strlen(text) - 1] = '\0';
                }

                printf("Ingresa el valor de desplazamiento (1-25): ");
                scanf("%d", &shift);

                // Validar valor de desplazamiento
                if (shift < 1 || shift > 25) {
                    printf("¡Valor de desplazamiento inválido! Usando desplazamiento por defecto de 3.\n");
                    shift = 3;
                }

                encrypt(text, shift, result);
                printf("\nTexto original: %s\n", text);
                printf("Texto encriptado: %s\n", result);
                break;

            case 2:
                printf("\nIngresa el texto a desencriptar: ");
                getchar(); // Limpiar buffer
                fgets(text, sizeof(text), stdin);

                // Eliminar salto de línea si está presente
                if (text[strlen(text) - 1] == '\n') {
                    text[strlen(text) - 1] = '\0';
                }

                printf("Ingresa el valor de desplazamiento usado para encriptar (1-25): ");
                scanf("%d", &shift);

                // Validar valor de desplazamiento
                if (shift < 1 || shift > 25) {
                    printf("¡Valor de desplazamiento inválido! Usando desplazamiento por defecto de 3.\n");
                    shift = 3;
                }

                decrypt(text, shift, result);
                printf("\nTexto encriptado: %s\n", text);
                printf("Texto desencriptado: %s\n", result);
                break;

            case 3:
                printf("\n¡Gracias por usar el Programa de Cifrado César!\n");
                break;

            default:
                printf("\n¡Opción inválida! Por favor intenta de nuevo.\n");
        }
    } while (choice != 3);

    return 0;
}

Cómo Funciona el Programa

El programa consiste en varios componentes clave que trabajan juntos:

  • Función de Encriptación - Recibe texto de entrada y valor de desplazamiento, transforma cada letra moviéndola hacia adelante en el alfabeto
  • Función de Desencriptación - Invierte el proceso de encriptación desplazando las letras hacia atrás
  • Función Principal - Proporciona interfaz de usuario con sistema de menú para operaciones de encriptación/desencriptación

Características Clave de la Implementación:

  • Maneja correctamente tanto letras mayúsculas como minúsculas
  • Preserva espacios, números y caracteres especiales
  • Utiliza aritmética modular para el envolvimiento del alfabeto
  • Incluye validación de entrada y manejo de errores
  • Sistema de menú interactivo para operación amigable
  • Manejo apropiado de cadenas con terminación null

Compilación y Ejecución

Para compilar y ejecutar este programa en la mayoría de sistemas, usa los siguientes comandos:

gcc -o caesar_cipher caesar_cipher.c
./caesar_cipher

# En Windows:
gcc -o caesar_cipher.exe caesar_cipher.c
caesar_cipher.exe

Ejemplo de Salida del Programa

Esto es lo que verás al ejecutar el programa:

¡Bienvenido al Programa de Cifrado César!

=== Programa de Cifrado César ===
1. Encriptar texto
2. Desencriptar texto
3. Salir
Ingresa tu opción (1-3): 1

Ingresa el texto a encriptar: Hola Mundo!
Ingresa el valor de desplazamiento (1-25): 3

Texto original: Hola Mundo!
Texto encriptado: Krod Pxqgr!

Gestión de Memoria y Seguridad

Esta implementación utiliza arrays de caracteres de tamaño fijo para evitar la complejidad de la asignación dinámica de memoria. El programa incluye verificación apropiada de límites y terminación null de cadenas para prevenir desbordamientos de buffer. Para uso en producción, considera implementar asignación dinámica de memoria para manejar textos más grandes.

Consideraciones de Seguridad

Recuerda que el cifrado César es un cifrado de sustitución simple y proporciona seguridad mínima. Es fácilmente descifrable mediante análisis de frecuencia o ataques de fuerza bruta. Esta implementación está destinada para propósitos educativos y comprensión de conceptos criptográficos básicos.

Objetivos de Aprendizaje

Implementar el cifrado César en C enseña varios conceptos fundamentales de programación:

  • Manipulación de cadenas y manejo de arrays de caracteres
  • Aritmética de caracteres ASCII y conversión de tipos
  • Aritmética modular y operaciones matemáticas
  • Diseño de funciones y paso de parámetros
  • Validación de entrada y manejo de errores
  • Estructura de programa dirigido por menú
  • Fundamentos de criptografía y conciencia de seguridad

Posibles Mejoras

Esta implementación básica puede ser extendida de varias maneras:

  • Operaciones de E/S de archivos para encriptar/desencriptar archivos de texto
  • Soporte para caracteres Unicode y alfabetos internacionales
  • Implementación de otros cifrados clásicos (Vigenère, ROT13)
  • Desencriptación por fuerza bruta para valores de desplazamiento desconocidos
  • Soporte de argumentos de línea de comandos para procesamiento por lotes
  • Interfaz gráfica de usuario usando librerías como GTK+

Resumen

Esta implementación del cifrado César en C demuestra conceptos fundamentales de programación mientras introduce principios criptográficos básicos. El código está bien estructurado, incluye manejo apropiado de errores y proporciona una base sólida para entender tanto la programación en C como las técnicas elementales de encriptación. Practicar con este ejemplo fortalecerá tu comprensión de manipulación de cadenas, operaciones matemáticas y diseño de programas en C.