Compresión y encriptación asimétrica mediante GPG: sfxcompress
En la entrada que hablamos sobre el compresor que genera ficheros autoextraibles, explicamos la manera de generar dichos ficheros mediante un script de shell.
A este tipo de ficheros podemos añadir una nueva característica: encriptación asimétrica. La criptografía asimétrica es el método criptográfico que usa un par de claves para el almacenamiento o envío de información: una denominada pública y otra privada. La clave pública se puede entregar a cualquier persona y la privada debe mantenerse en secreto, de modo que con este método se encripta con la clave pública y se desencripta con la privada. Uno de los programas que se encarga de esta tarea es el denominado GNU Privacy Guard (GPG), pero existen otros, por ejemplo: DSA, PGP, SSH, SSL y TLS.
El objetivo del script de shell es simplificar las opciones a utilizar y generar ficheros comprimidos, encriptados y auto-extraibles, de modo que se facilite su uso. Para ello partimos del código explicado en la entrada mencionada.
Primero, dado que el número de opciones ha aumentado, es necesario tratar los parámetros de entrada de manera más cuidadosa. Se va a definir las siguientes opciones:
| Opción | Parámetro | Descripción |
| -f | filename | Indica el nombre base del fichero de salida y su path. |
| -g | Indica que se utilice compresión gzip. | |
| -b | Indica que se utilice compresión bzip2 (es la opción por defecto). | |
| -k | Indica que debe encriptarse el fichero de salida. | |
| -h | Muestra las opciones | |
| -v | Muestra la versión del programa y la licencia |
Como se observa, se ha definido los parámetros como los estándares de UNIX: opciones de una sola letra con un guión delante.
Para hacer el análisis de los parámetros de entrada, se utiliza el siguiente bucle:
# Parse the parameters
while getopts ":bf:ghkv" flag
do
chooseOptions $flag "$OPTARG"
done
Donde la función chooseOptions recibe cada parámetro y asigna las variables necesarias antes de la compresión:
# function name: chooseOptions, the function shows by screen the version of the program
# parameters: - the valid option (b, f, g, h, k, or v)
# - the parameter needed, for instance "f" needs the filename
function chooseOptions {
if [ "$1" = "g" ]; then
compresor="z"
extension="tgz"
else
if [ "$1" = "b" ]; then
compressorByDefault
else
if [ "$1" = "k" ]; then
encriptar="si"
else
if [ "$1" = "f" ]; then
filename="$2"
else
if [ "$1" = "h" ]; then
syntax
else
if [ "$1" = "v" ]; then
version
else
echo "ERROR: \"$2\" is an invalid option."
echo
exit -1
fi
fi
fi
fi
fi
fi
} # chooseOptions
Si todo es correcto, el programa llama a la función compress que se encarga de comprimir (y encriptar) el fichero de salida. Es importante señalar que la compresión se hace en la memoria de tal forma que no se generan ficheros intermedios que puedan comprometer información sensible. Primero comprueba si existe el fichero “.exclude” que indica los ficheros que deben ignorarse, por ejemplo, en ciertas circunstancias puede ser interesante ignorar los ficheros que terminen en ‘~’: “*~”.
# function name: compress, the main function of the program
# parameters: - the base name
function compress {
compressed=$(mktemp -t XXXXXXXXXXXXXXXX)
encrypted=$(mktemp -t XXXXXXXXXXXXXXXX)
# If .exclude exists, then the program must be work with it
if [ -f ".exclude" ] ; then
excluded=$(mktemp -t XXXXXXXXXXXXXXXX)
echo >$excluded
for i in $( cat .exclude ); do
find . -name "$i" >>$excluded
done
if [ "$encriptar" = si ]; then
rm -f $encrypted
tar cvX$compresor $excluded . | gpg -o $encrypted --encrypt
else
tar cvXf$compresor $excluded $encrypted .
fi
else
if [ "$encriptar" = si ]; then
rm -f $encrypted
tar cv$compresor . | gpg -o $encrypted --encrypt
else
tar cvf$compresor $encrypted .
fi
fi
# The compressed (and encrypted) file has been created
# The last step is to encapsulate all in a self-extracting style bash-script
comp=$(mktemp -t XXXXXXXXXXXXXXXX)
SIZE=$(cat $encrypted | wc -c)
SALIDA="$1.$extension.sfx"
echo "#!/bin/bash" >$comp
echo "">>$comp
echo "SIZE=\"$SIZE\"">>$comp
echo "compresor=\"$compresor\"">>$comp
echo "filename=\"$(basename "$1")\"">>$comp
echo "extension=\"$extension\"">>$comp
echo "fecha=\"$(date)\"">>$comp
echo "mdf=\"$(cat $encrypted | md5)\"">>$comp
if [ "$encriptar" = si ]; then
echo "encriptado=\"$encriptar\"">>$comp
echo "adjetive=\" encrypted\"">>$comp
fi
# Take care!, the parameter in tail indicates the start of
# the second part of the script, do not modify unless you
# know what you do.
cat "$0" | tail -39 >>$comp
cat $encrypted >>$comp
chmod 755 $comp
# Delete temporary files
rm -f $compressed
rm -f $excluded
rm -f $encrypted
mv $comp "$SALIDA"
echo
echo The file $SALIDA has been created.
echo
} # compress
Para ver el código completo y descargarlo, puede dirigirse a la página oficial, alojada en SourceForge.
-
Recientes
- Los números de 2011
- Un nuevo hogar
- Cómo crear un disco de arranque Linux con una memoria flash
- Compresión y encriptación asimétrica mediante GPG: sfxcompress
- Plop, un gestor de arranque
- Utilizar un disco USB externo arrancable como copia de seguridad con Clonezilla
- Linux Mint 9 liberado
- Compresor que genera ficheros autoextraíbles
- Emulando el comando deltree de DOS
- Curiosa forma de anunciar una impresora
- Muere Michael Jackson
- Nuevo intento de timo
-
Enlaces
-
Archivos
- enero 2012 (1)
- abril 2011 (1)
- noviembre 2010 (2)
- julio 2010 (2)
- mayo 2010 (2)
- marzo 2010 (1)
- noviembre 2009 (1)
- junio 2009 (3)
- abril 2009 (1)
- marzo 2009 (3)
- febrero 2009 (10)
- enero 2009 (6)
-
Categorías
- A la española
- Análisis
- Cultura
- Curiosidades
- Efemérides
- Entretenimiento
- Frases célebres
- Frases patéticas
- Historia
- in-kultura
- Informática e Internet
- Investigación
- Libre pensamiento
- Música
- Noticias
- Noticias académicas
- Noticias y política
- Personal
- programación
- Reflexiones
- Script bash
- Sin categoría
- Telefonía
- Uncategorized
-
RSS
RSS de las entradas
RSS de los Comentarios