Capítulo 13. Recopilando pruebas contra Phil
Tras el incidente con la alarma y el posterior apagón, los funcionarios de la prisión están alerta. Empiezan a sospechar algo y se están tomando medidas de precaución extraordinarias. La mayoría de ellas no nos afectan, pero para poder acceder al hospital de la cárcel, lo primero que Bud deberá hacer es desactivar la localización GPS de su portátil. Después de lo que ocurrió con la alarma de incendios, se están tomando muchas medidas de seguridad y todo el mundo está controlado. Es muy probable que los funcionarios de la prisión ya sospechen de Bud y Pedro. Desde ahora, hay que ser totalmente invisibles.
Ejercicio 1. Cambiar la señal de GPS: Bud y Pedro deben cambiar la señal de GPS de sus ordenadores para que los guardias no puedan rastrear su ubicación real. Escribiremos un programa que nos ayude con esta tarea.
Instrucciones:
- Crea un array que contenga las coordenadas reales de cada ordenador.
- Permite al usuario ingresar coordenadas falsas.
- Verifica si las coordenadas ingresadas están dentro de un rango aceptable (por ejemplo, dentro de un radio de 1 km de las coordenadas reales).
- Si las coordenadas son aceptables, 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) {
double[] coordenadasReales = {40.7128, -74.0060}; // (ejemplo: Nueva York)
Scanner scanner = new Scanner(System.in);
System.out.println("Ingrese las coordenadas falsas de una en una (latitud y longitud):");
double latitudFalsa = scanner.nextDouble();
double longitudFalsa = scanner.nextDouble();
double distancia = Math.sqrt(
Math.pow(latitudFalsa - coordenadasReales[0], 2) +
Math.pow(longitudFalsa - coordenadasReales[1], 2)
);
if (distancia <= 0.01) { // Aproximadamente 1 km de radio
System.out.println("Coordenadas falsas aceptadas. Los guardias no podrán rastrearte.");
} else {
System.out.println("Coordenadas falsas fuera de rango. Inténtelo de nuevo.");
}
scanner.close();
}
}
Nada más entrar al hospital, hay una sala con un nivel de seguridad medio que cuenta con cinco cámaras. Además, los funcionarios son registrados siempre al entrar para evitar que introduzcan objetos del exterior. El problema es que no se les registra al salir, lo que permite a Phil robar el material. En esa sala, Bud deberá evitar las cámaras.
Lo primero que hay que hacer es comprobar que todas las cámaras están encendidas, ya que, de ser así, Bud podrá interceptarlas y apagarlas. Si alguna está apagada de antemano, no se podrá interceptar. Que nuestro programa indique que una cámara está apagada no significa necesariamente que realmente lo esté; puede que utilice otro tipo de fuente de alimentación para funcionar. Sería un riesgo muy grande. Por tanto, el objetivo es verificar que todas estén activas y, luego, apagarlas.
Ejercicio 2. Interceptar Señales de Video. Bud necesita interceptar las señales de video de las cámaras de seguridad. Escribe un programa que simule la interceptación de las señales de video y que muestre un mensaje cada vez que se intercepte una señal.
Instrucciones:
- Declara 5 variables boolean. (En el programa real de la cárcel no sabremos si están declaradas como true o false. Simplemente para ver si el programa funciona las declaramos con valores aleatorios)
- Usa un bucle for para simular la interceptación de señales de video de varias cámaras (por ejemplo, 5 cámaras). Haz que compruebe el estado de las 5 cámaras.
- Muestra un mensaje indicando que la señal de cada cámara ha sido interceptada. True significa que está encendida y por tanto el programa la intercepta. False será que está apagada y el programa no podrá interceptarla.
Solución:
public class Main {
public static void main(String[] args) {
// Declaración de las variables boolean
// Como comentamos en el enunciado, en el sistema de la cárcel no sabremos el estado de las cámaras.
// Por eso creamos este programa con valores de prueba para comprobar el funcionamiento.
boolean camara1 = true;
boolean camara2 = false;
boolean camara3 = true;
boolean camara4 = false;
boolean camara5 = true;
// Bucle for para comprobar el estado de cada cámara
for (int i = 1; i <= 5; i++) {
boolean estado = false;
if (i == 1) {
estado = camara1;
} else if (i == 2) {
estado = camara2;
} else if (i == 3) {
estado = camara3;
} else if (i == 4) {
estado = camara4;
} else if (i == 5) {
estado = camara5;
}
if (estado) {
System.out.println("Cámara " + i + " está en estado: Interceptada");
} else {
System.out.println("Cámara " + i + " está en estado: No interceptada");
}
}
}
}
En la siguiente sala, el nivel de seguridad es alto. Ya no se utilizan cámaras, sino sensores de movimiento, en concreto, cinco. Para llegar a la sala de los ordenadores, es necesario atravesar esta habitación.
Ejercicio 3: Desactivar Sensores de Movimiento. Ahora Bud deberá desactivar los sensores de movimiento para moverse sin ser detectado. Escribe un programa que permita desactivar los sensores uno por uno.
Instrucciones:
- Usa un array booleano para representar el estado de los sensores (activado o desactivado).
- Usa un bucle para permitir al usuario desactivar cada sensor.
- Muestra el estado de los sensores después de cada cambio.
Solución:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
boolean[] sensores = {true, true, true, true, true}; // Todos los sensores están activados inicialmente
Scanner scanner = new Scanner(System.in);
for (int i = 0; i < sensores.length; i++) {
System.out.println("¿Desea desactivar el sensor " + (i + 1) + "? (true/false)");
boolean respuesta = scanner.nextBoolean();
sensores[i] = !respuesta; // Si el usuario dice true (quiere desactivarlo), lo ponemos en false
}
System.out.println("Estado de los sensores:");
for (int i = 0; i < sensores.length; i++) {
System.out.println("Sensor " + (i + 1) + ": " + (sensores[i] ? "Activado" : "Desactivado"));
}
scanner.close();
}
}
Protegiendo la sala de los ordenadores, hay una puerta que requiere una clave de acceso numérica. Si se introduce una contraseña incorrecta o no numérica, el programa lo detectará y se activará una alerta. Necesitamos crear un programa utilizando try y catch que avise en caso de introducir un código no numérico o incorrecto. Esta es una precaución por si el código robado a Vicente no funciona. Si eso ocurriese, el plan se vería comprometido y no podríamos escapar, pero al menos no nos descubrirían tratando de huir.
Ejercicio 4. Manejo de Excepciones al Hackear el Sistema de Seguridad. Bud intenta acceder al sistema de seguridad, pero puede cometer errores durante el proceso. Escribe un programa que simule el hackeo y que maneje posibles excepciones (como ingresar un valor no numérico).
Instrucciones:
- Pide al usuario que ingrese un código numérico.
- Usa try y catch para manejar posibles excepciones si el usuario ingresa un valor no numérico.
- Si el valor 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) {
Scanner scanner = new Scanner(System.in);
try {
System.out.println("Ingrese el código de hackeo (número entero):");
int codigo = Integer.parseInt(scanner.nextLine());
System.out.println("Código correcto. Hackeo exitoso.");
} catch (NumberFormatException e) {
System.out.println("Error: Ingresó un valor no numérico. Inténtelo de nuevo.");
}
scanner.close();
}
}
Una vez dentro de la última habitación necesitamos acceder al ordenador. Esta última contraseña funciona de forma peculiar. Cada vez utiliza un nuevo código para poder entrar. Esto hace que sea prácticamente imposible de hackear. Para acceder al sistema vamos a necesitar una clave obtenida del despacho de Vicente que después se combina de forma aleatoria con dos otros números. Antes de ingresarla hay que comprobar exactamente cuáles son esos dos números.
Ejercicio 5. Crea un programa que encuentre la clave completa de 6 dígitos a partir de una clave base de 4 dígitos. La clave base se combina con un número variable de dos dígitos para formar una clave completa.
- Crea tres variables int, una para la contraseña incompleta que tenemos, otra para la contraseña final y otra temporal que utilizaremos dentro de nuestro for para comprobar todas las combinaciones de 00 a 99.
- Usa un bucle for para iterar desde 0 hasta 99, representando todas las posibles combinaciones de los últimos dos dígitos.
- En cada iteración del bucle, combina la clave base con el número actual del bucle multiplicado por 100, sumando el valor del bucle. Esto genera una posible clave completa (claveComprobada).
- Compara la clave generada en cada iteración (claveComprobada) con la clave completa conocida. Si se encuentra una coincidencia, imprime la clave completa encontrada y finaliza el bucle.
En el programa que Bud utilice para encontrar la contraseña, evidentemente no tendría la contraseña final. Pero nosotros la hemos incluido en este ejercicio para comprobar que funciona bien.
Solución:
public class Main {
public static void main(String[] args) {
// Clave base conocida
int claveBase = 8787;
// Clave completa que se quiere encontrar
int claveCompleta = 878793;
// Variable para guardar la clave que se va comprobando
int claveComprobada;
// Comprobar combinaciones de los últimos dos dígitos
for (int i = 0; i < 100; i++) {
claveComprobada = (claveBase * 100) + i;
System.out.println(claveComprobada);
if (claveComprobada == claveCompleta) {
System.out.println("Esta es la clave completa: " + claveComprobada);
break;
}
}
}
}