Práctica sobre uso básico de llamadas de sistema I/O en Linux usando C para la materia Programación de Sistemas de la ESPOL.
La práctica consiste en crear un programa en C que encripta o desencripta un archivo usando el algoritmo de encriptación Blowfish. El programa usa la implementación del algoritmo de Blowfish en crypto-algorithms. El programa debe tener el siguiente comportamiento:
$ ./secret -h
secret encripta o desincripta un archivo usando el algoritmo Blowfish.
uso:
./secret [-d] -k <key> <nombre_archivo>
./secret -h
Opciones:
-h Ayuda, muestra este mensaje
-d Desencripta el archivo en lugar de encriptarlo.
-k <key> Específica la clave (key) de encriptación, 8 bytes en hex.
El argumento <nombre_archivo> es obligatorio y especifica el nombre del archivo a encriptar/desencriptar. La opción -d es opcional y especifica que el archivo debe ser desencriptado, por defecto el archivo es encriptado. La opción -k es mandatoria y especifica la clave o key de encriptación/desencriptación. Por simplicidad, en este programa se aceptaran claves de 64 bits (8 bytes) u 16 caracteres hexadecimales. La clave será especificada como argumento de -k en formato hexadecimal. Recordar que todo argumento que reciba el main es considerado como un string.
Para encriptar un archivo, ejemplo el archivo Makefile con la clave de encriptación FF00AA00B50012CD :
./secret -k FF00AA00B50012CD Makefile
Leyendo el archivo Makefile (540 bytes)...
Archivo Makefile encriptado exitosamente en Makefile.enc...
El programa debe crear un nuevo archivo encriptado con el nombre del archivo original y la extensión .enc.
Para desencriptar un archivo ya encriptado, por ejemplo imagen_encriptada.png, que fue encriptada con la clave 0102030405060708 :
$ ./secret -k 0102030405060708 imagen_encriptada.png -d
Leyendo el archivo imagen_encriptada.png (4480 bytes)...
Archivo imagen_encriptada.png desencriptado exitosamente en imagen_encriptada.png.dec...
El programa debe crear un nuevo archivo desencriptado con el nombre del archivo original y la extensión .dec.
El primer reto es traducir la clave especificada en la opción -k de ASCII Hex a su valor númerico byte por byte. Una forma es, en un arreglo de 8 bytes:
BYTE key_arg[8];
usar el siguiente lazo para recorrer byte por byte la clave en ASCII key_arg_str y almacenar el valor de cada byte en key_arg:
//Extraer valor númerico de la clave en ASCII hex....
unsigned short byte, i;
for(i=0;i<8;i++){
sscanf(key_arg_str + 2*i,"%2hx", &byte);
key_arg[i] = (BYTE) byte;
}
El segundo reto es crear un archivo de salida nuevo con el nombre del archivo de entrada concatenando .dec o .enc al final del nombre. Usar calloc, strcpy, strcat para el nuevo nombre y la función open con las banderas O_CREAT, O_TRUNC y O_WRONLY para crear el archivo. Es importante asegurarse que el archivo nuevo tenga permisos de lectura y escritura para el usuario dueño (usar por ejemplo S_IRUSR y S_IWUSR en open).
El tercer reto es leer el archivo de entrada bloque por bloque, desencriptar/encriptar, y escribir el archivo de salida bloque por bloque.
make -f Testfile encrypt
make -f Testfile decrypt