Parte A
¿Qué significa ECB como modo de ejecución del algoritmo de
cifrado?
ECB es un modo de operación en el que cada bloque del mensaje se
cifra por separado usando la misma clave simétrica, dividiendo el texto
en bloques de tamaño fijo.
¿Cuál es la ventaja de ECB comparado con CBC?
ECB es más simple y rápido que CBC porque no requiere vector de
inicialización (IV). Sin embargo, CBC es más seguro porque introduce
aleatoriedad en el proceso de cifrado.
¿Qué es y para qué se necesita el padding?
El padding rellena los bloques de texto que no alcanzan el tamaño
requerido (ej. 128 bits para AES). Se necesita para asegurar que el
tamaño del mensaje sea múltiplo del tamaño de bloque del algoritmo.
¿Cuánto tiempo tarda cifrar y descifrar el mensaje de entrada?
¿Qué resultado se obtiene al descifrar tc1 con k1?
El resultado que se obtiene es el mismo mensaje original.
¿Qué resultado se obtiene al descifrar tc1 con k2?
El resultado es incorrecto y se lanza una excepción, que tiene que ver
con el uso de las llaves para la descifrado, ya que las llaves son
distintas.
El método main2 se describe a continuación
public class Main2 {
private final static String ALGORITMO = "AES";
public static void imprimir(byte[] datos) {
for (byte b : datos) {
[Link](b + " "); }
[Link]();
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner([Link]);
[Link]("Ingrese un mensaje: ");
String mensaje = [Link]();
byte[] textoClaro = [Link]();
KeyGenerator keyGen = [Link](ALGORITMO);
[Link](128);
SecretKey k1 = [Link]();
SecretKey k2 = [Link]();
Simetrico simetrico = new Simetrico();
byte[] tc1 = [Link](textoClaro, k1);
[Link]("Texto cifrado con k1: ");
imprimir(tc1);
byte[] tc2 = [Link](textoClaro, k2);
[Link]("Texto cifrado con k2: ");
imprimir(tc2);
byte[] descifrado_k1 = [Link](tc1, k1);
[Link]("Descifrado tc1 con k1: " + new
String(descifrado_k1));
try {
byte[] descifrado_k2 = [Link](tc1, k2);
[Link]("Descifrado tc1 con k2: " + new
String(descifrado_k2)); }
catch (Exception e) {
[Link]();
Los métodos main 3 y main 4 se describen a continuación:
Main 3 y Main 4
==Main 3==
public class Main3 {
private final static String ALGORITMO = "AES";
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner([Link]);
[Link]("Ingrese un mensaje: ");
String mensaje = [Link]();
byte[] textoClaro = [Link]();
KeyGenerator keyGen = [Link](ALGORITMO);
[Link](128);
SecretKey llave = [Link]();
try (FileOutputStream out = new FileOutputStream("[Link]"))
{
[Link]([Link]());
Simetrico simetrico = new Simetrico();
byte[] textoCifrado = [Link](textoClaro, llave);
try (FileOutputStream out = new
FileOutputStream("[Link]")) {
[Link](textoCifrado);
[Link]("Llave y mensaje cifrado guardados en
archivos.");
==Main 4===
public class Main4 {
private final static String ALGORITMO = "AES";
public static void main(String[] args) throws Exception {
byte[] llaveBytes = new byte[16];
try (FileInputStream in = new FileInputStream("[Link]")) {
[Link](llaveBytes);
}
SecretKey llave = new SecretKeySpec(llaveBytes, ALGORITMO);
byte[] textoCifrado = new byte[1024];
int bytesRead;
try (FileInputStream in = new FileInputStream("[Link]")) {
bytesRead = [Link](textoCifrado);
byte[] mensajeRecortado = new byte[bytesRead];
[Link](textoCifrado, 0, mensajeRecortado, 0,
bytesRead);
Simetrico simetrico = new Simetrico();
byte[] textoDescifrado = [Link](mensajeRecortado,
llave);
String mensaje = new String(textoDescifrado);
[Link]("Mensaje descifrado: " + mensaje);