Aprende Java Fácil. Capítulo 11. Volviendo a hackear el sistema de seguridad

Capítulo 11. Volviendo a hackear el sistema de seguridad

El día ha llegado, la fuga ha comenzado oficialmente y, a partir de hoy, no hay marcha atrás. Pedro debe estar ya en la biblioteca, así que, si todo ocurre como esperamos, en breves momentos sonará la alarma. Bud ya está preparado con su ordenador; sin él no podría llegar hasta el despacho del director. No decimos nada; Bud mira la pantalla fijamente, muy concentrado.

No todos los días le dejan tener el portátil en la celda, pero hoy se aseguró de que así fuera. Se las ingenió para que el sistema de ventilación de la cocina dejase de funcionar y, en teoría, está tratando de repararlo.

Colarse en el despacho del director tiene un único objetivo: acceder a la libreta del director, donde          apunta todo manualmente. Es un señor de edad avanzada, al que no le gusta mucho la informática. Se llama Vicente. La información que tratamos de conseguir es muy valiosa, ya que nos servirá para las siguientes fases del plan.

Por fin, el momento llegó: la alarma se disparó. Era mucho más ruidosa de lo que había imaginado. Vi que Bud empezaba a teclear a toda velocidad. El asalto al despacho de Vicente había comenzado.

Para hacer más amena la espera, vamos a meternos en la piel de Bud y a programar todo el código necesario para llevar a cabo esta parte del plan. Si queremos llegar hasta el final, necesitamos completar cinco pasos y, además, tener algo de fortuna.

Programa 1. Bud necesita desbloquear la puerta principal de su celda. Para ello, debe escribir un programa que verifique un código de seguridad antes de insertarlo. Si se ingresa el código incorrecto, la puerta podría bloquearse. El código correcto está guardado en un array y debe ser comparado con una entrada del usuario.

Instrucciones:

  • Crea un array que contenga el código de seguridad, por ejemplo: {1, 4, 5, 7, 9}.
  • Pide al usuario que ingrese un código de cinco dígitos.
  • Compara el código ingresado con el código almacenado en el array.
  • Si el código es correcto, muestra un mensaje de éxito. Si no, muestra un mensaje de error.

 

Solución:

 

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        int[] codigoSeguridad = {1, 4, 5, 7, 9};

        Scanner scanner = new Scanner(System.in);

        System.out.println("Ingrese el código de seguridad de 5 dígitos:");
        int[] codigoIngresado = new int[5];

        for (int i = 0; i < 5; i++) {
            codigoIngresado[i] = scanner.nextInt();
        }

        boolean esCorrecto = true;

        for (int i = 0; i < 5; i++) {
            if (codigoIngresado[i] != codigoSeguridad[i]) {
                esCorrecto = false;
                break;
            }
        }

        if (esCorrecto) {
            System.out.println("Código correcto. La puerta está desbloqueada.");
        } else {
            System.out.println("Código incorrecto. Inténtelo de nuevo.");
        }
    }
}

Programa 2. Evitar la cámara de Seguridad. Bud necesita moverse por el primer pasillo sin ser detectado por una cámara de seguridad que se enciende y apaga a intervalos regulares. Debe escribir un programa que determine si puede moverse en un momento dado.

En realidad, el programa de Bud es un poco más elaborado que el que vamos a hacer nosotros, ya que él no sabe en qué segundos se encienden las cámaras. Esa información la obtiene directamente gracias a su conexión con el sistema central, y su programa funciona con esos datos.

Instrucciones:

  • Usa un bucle for para simular los segundos de un minuto (0 a 59).
  • La cámara está encendida durante los primeros 10 segundos de cada minuto y apagada durante los siguientes 50 segundos.
  • Pide al usuario que ingrese un segundo en el que planea moverse.
  • Determina si la cámara estará encendida o apagada en ese segundo y muestra un mensaje correspondiente.

 

Solución:

 

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("Ingrese el segundo en el que planea moverse (0-59):");
        int segundo = scanner.nextInt();

        if (segundo >= 0 && segundo < 10) {
            System.out.println("La cámara está encendida. Espere un momento más.");
        } else if (segundo >= 10 && segundo < 60) {
            System.out.println("La cámara está apagada. ¡Puede moverse!");
        } else {
            System.out.println("Entrada inválida. Intente de nuevo.");
        }
    }
}

Programa 3. Hay otro pequeño problema: el despacho se encuentra en una zona separada del pabellón principal. Eso significa que aquí no sonará la alarma de incendios. Por lo tanto, el vigilante permanecerá ahí, justo delante de la puerta a la que necesitamos acceder. Bud tendrá que evitarlo.

La idea es sencilla y a la vez muy efectiva: el plan consiste en aumentar la temperatura del pasillo hasta que el vigilante no pueda soportarla más y se vea obligado a ir a la sala central para bajar los grados. Esto le dará a Bud el tiempo suficiente para entrar y salir del despacho sin ser visto. Las funciones del sistema que no requieren un nivel alto de seguridad, como la regulación del termostato, no están controladas, así que Bud podrá modificar la temperatura sin que nadie lo detecte.

Instrucciones:

Crea un programa en el que se cumplan los siguientes requisitos:

  • Ingresa la temperatura inicial del pasillo.
  • Ingresa la cantidad de grados que deseas aumentar.
  • Suma el aumento deseado a la temperatura inicial.
  • Muestra la nueva temperatura del pasillo después del ajuste.

 

Solución:

 

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // Crear un escáner para leer la entrada del usuario
        Scanner scanner = new Scanner(System.in);

        // Solicitar al usuario la temperatura inicial
        System.out.print("Ingresa la temperatura inicial del pasillo (en grados Celsius): ");
        double temperaturaInicial = scanner.nextDouble();

        // Solicitar al usuario la cantidad de aumento deseado
        System.out.print("Ingresa la cantidad de grados para aumentar: ");
        double aumento = scanner.nextDouble();

        // Calcular la nueva temperatura
        double nuevaTemperatura = temperaturaInicial + aumento;

        // Mostrar el resultado
        System.out.println("La nueva temperatura del pasillo es: " + nuevaTemperatura + "°C");

        // Cerrar el escáner
        scanner.close();
    }
}

Programa 4. Contraseña para entrar al despacho. Bud necesita generar un código de seguridad basado en la hora actual (minutos y segundos). Este código cambia cada minuto y debe ser ingresado correctamente para desbloquear una puerta.

Instrucciones:

  1. Usa la clase LocalTime para obtener la hora actual.
  2. Genera un código de seguridad sumando los minutos y los segundos actuales.
  3. Muestra el código generado al usuario.
  4. Pide al usuario que ingrese el código mostrado.
  5. Verifica si el código ingresado es correcto y muestra un mensaje adecuado.

 

Solución:

 

import java.time.LocalTime;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        // Obtener la hora actual
        LocalTime ahora = LocalTime.now();
        int minutos = ahora.getMinute();
        int segundos = ahora.getSecond();

        // Generar el código de seguridad sumando minutos y segundos
        int codigoGenerado = minutos + segundos;

        // Mostrar el código generado
        System.out.println("El código de seguridad generado es: " + codigoGenerado);

        // Pedir al usuario que ingrese el código mostrado
        Scanner scanner = new Scanner(System.in);
        System.out.println("Ingrese el código de seguridad para validar:");
        int codigoIngresado = scanner.nextInt();

        // Verificar si el código ingresado es correcto
        if (codigoIngresado == codigoGenerado) {
            System.out.println("Código correcto. La puerta está abierta.");
        } else {
            System.out.println("Código incorrecto. Inténtelo de nuevo.");
        }

        scanner.close();
    }
}

Programa 5. Una vez dentro, Bud deberá coger la libreta y salir tan rápido como pueda. Aunque probablemente, para cuando la encuentre, el guardia ya habrá regresado a su puesto. Para salir sin ser visto, hay que hacer que el guardia se mueva de nuevo. En la misma sala donde el guardia bajó la temperatura del pasillo, hay una máquina de café. Esta se encuentra estropeada y, cada vez que inicia el proceso de autolimpiado, hace un ruido terrible. Es necesario apagarla manualmente. Así que la idea es activar ese autolimpiado y que el vigilante no tenga más remedio que ir a apagarla.

Por suerte para Bud, este programa ya está creado, dado que la cafetera viene programada de fábrica; aun así, nosotros vamos a crear uno. Como apenas hemos utilizado las condicionales switch-case, creo que es un buen momento para que las repases.

Instrucciones:

  • Implementa un menú simple que permita al usuario seleccionar entre preparar café o limpiar la cafetera.
  • Cuando el usuario elija la opción de limpiar la cafetera, muestra mensajes que indiquen que la limpieza ha comenzado y que ha terminado.
  • Permite que el usuario repita el proceso tantas veces como desee hasta que seleccione la opción de salir del programa.

 

Solución:

 

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        // Crear un objeto Scanner para leer la entrada del usuario
        Scanner scanner = new Scanner(System.in);

        // Variable para controlar si el programa sigue ejecutándose
        boolean continuar = true;

        // Bucle principal del programa
        while (continuar) {

            // Mostrar el menú
            System.out.println("\n--- Menú de la Cafetera ---");
            System.out.println("1. Preparar café");
            System.out.println("2. Activar función de limpieza manual");
            System.out.println("3. Salir");

            System.out.print("Elige una opción: ");

            // Leer la opción seleccionada por el usuario
            int opcion = scanner.nextInt();

            // Procesar la opción seleccionada
            switch (opcion) {
                case 1:
                    System.out.println("Preparando café... ¡Disfruta tu bebida!");
                    break;

                case 2:
                    System.out.println("Iniciando la función de limpieza manual...");
                    // Simulación del proceso de limpieza
                    System.out.println("La cafetera se está limpiando...");
                    System.out.println("¡La limpieza ha finalizado! La cafetera está lista para usarse.");
                    break;

                case 3:
                    System.out.println("Saliendo del programa. ¡Hasta luego!");
                    continuar = false; // Salir del bucle
                    break;

                default:
                    System.out.println("Opción no válida. Por favor, elige una opción del menú.");
                    break;
            }
        }

        // Cerrar el scanner
        scanner.close();
    }
}