SKS, criptografía de bolsillo

Manual

Resumen

Al ejecutar SKS sin parámetros aparece un breve resumen del manual:

Modo de uso:
 cifrado convencional
   -c claro cifrado  < contraseña
   -C     (compresión previa de datos)
 cifrado de clave pública
   -e claro cifrado [id 1]  [id 2] ... [id n]*
   -E     (compresión previa de datos)
 descifrar (todos los casos)
   -d cifrado claro < contraseña
 firmar/verificar/resumir
   -s claro firma < contraseña
   -S texto < contraseña > texto-firmado
   -v claro firma
   -V texto-firmado >texto
   -r fichero1 fichero2 ... fichero-n > resumen hexadecimal (TIGER)
 -f[operación] [introduce SKS -f para más detalles]
 -b[operación] [introduce SKS -b para más detalles]
 -k[operación] [introduce SKS -k para más detalles]
 (*) Será seleccionada toda clave que contenga cualquier identificador
     La ausencia de identificador selecciona todas las claves
Este resumen aparece también cuando se suministra un número incorrecto de parámetros o si el primer parámetro es incorrecto. Nótese que algunas órdenes admiten un número indefinido de parámetros y que -S, -V son distintos a -s, -v.

Los caracteres [ < ] y [ > ] indican que SKS require datos de la entrada estándar (stdin) y devuelve datos por la salida estándar (stdout). Además, hay diversos mensajes, tanto de error como de advertencia o información, que se ofrecen por la salida de error (stderr); estos mensajes están disponibles en español e inglés, según la versión que descargues.

Cifrado

Para cifrar un fichero hace falta una(s) clave(s) pública(s). En general no será tu propia clave pública, sino la de aquellos a los que se destina el fichero. Si tu clave pública está en tu anillo (que es lo más normal) puedes elegirla también para que puedas ver en el futuro el contenido del fichero, si es que planeas eliminar el original.

Las claves públicas de tus corresponsales te las han de enviar ellos y está en tu mano comprobar que realmente provienen de quien dice. En el apartado Gestión de Claves hay más información al respecto. El fichero de claves que se suministra contiene las siguientes claves:

 [6be386a4]: Hola Mundo /hola mundo/
 [40023a50]: Hello World /hello world/
 [5425be1c]: Jose Luis Torrente <jltorrente@caspa.net> /amiguete/
 [00e14ca8]: Manuel Pancorbo Castro <mpancorbo # wanadoo.es>

Para cifrar el fichero mensaje.txt simplemente teclea:

    sks -e mensaje.txt mensaje.txt.e torrente
donde mensaje.txt.e es el fichero cifrado que creará el programa.

OJO, si ya existiera un fichero con ese nombre, SKS lo sobreescribirá sin advertencia previa. El original NO se borra automáticamente.

torrente es un identificador que coincide, en este caso, sólo con una clave. Como identificador vale cualquier cadena de texto, que se compara con las etiquetas que identifican cada clave, así como con el identificador numérico de éstas.

    sks -e mensaje.txt mensaje.txt.e 5425be1c
también selecciona la misma clave.

Se pueden usar todos los identificadores que se consideren oportunos y las claves que se seleccionan para cifrar son aquellas cuyas etiquetas y/o ids. numéricos contengan alguna de las cadenas introducidas. La comparación es sensible a las mayúsculas.

    sks -e mensaje.txt mensaje.txt.e caspa
    sks -e mensaje.txt mensaje.txt.e @
    sks -e mensaje.txt mensaje.txt.e 5425
    sks -e mensaje.txt mensaje.txt.e "Jose Luis"
seleccionan la misma clave;
    sks -e mensaje.txt mensaje.txt.e s
selecciona la clave anterior y también la clave 00e14ca8. Sin embargo,
    sks -e mensaje.txt mensaje.txt.e sr
no selecciona ninguna (el programa no hace nada y emite un mensaje de advertencia) porque la cadena "sr" no existe en ninguna etiqueta.
    sks -e mensaje.txt mensaje.txt.e Hola Hello
Selecciona las claves 6be386a4 y 40023a50.

Si no se introduce ninguna cadena, el programa selecciona todas las claves del anillo.

Una vez que pulsas 'Intro' (como en el último ejemplo) el programa emite un mensaje:

SKS. Claves seleccionadas:
 [6be386a4]: Hola Mundo /hola mundo/
 [40023a50]: Hello World /hello world/
y en el directorio aparece el fichero mensaje.txt.e

Compresión

Si en lugar de la opción -e seleccionamos la opción -E el programa se comporta exactamente igual, salvo que comprime primero los datos.

    sks -E mensaje.txt mensaje.txt.e torrente
La opción de compresión es interesante para archivos de texto, de procesadores de texto y cualquiera que no esté comprimido por si mismo. Los ficheros jpg, zip, y cualesquiera otros formatos comprimidos se cifran mejor con la opción -e, que ahorra tiempo de proceso.

Cifrado convencional

Las opciones -c y -C cifran el fichero de forma convencional, con una clave generada a partir de una contraseña; por seguridad, contraseñas iguales generan claves distintas según si elegimos cifrado convencional o si generamos claves privadas. La opción en mayúsculas comprime, igual que con el cifrado de clave pública. El programa sólo necesita dos parámetros: el fichero de entrada y el de salida; la contraseña se pide por línea de comandos, sin eco de salida, para garantizar máxima privacidad.

Descifrado

Para descifrar un mensaje —no importa de qué manera se halla cifrado, convencionalmente o con clave pública, con o sin compresión— se usa la opción -d:

    sks -d mensaje.txt.e mensaje.txt
donde mensaje.txt.e es el fichero cifrado y mensaje.txt el fichero que creará el programa ya descifrado (la misma advertencia acerca del peligro de sobreescribir un fichero ya existente). Se pide una contraseña por línea de comandos que corresponde bien a alguna clave pública con la que se halla cifrado el original (opciones -e y -E), bien a la contraseña usada en el cifrado convencional (opciones -c y -C).

Si se usó cifrado de clave pública, se muestran los identificadores que se encuentren en la cabecera del fichero. Sólo identificadores, sin la etiqueta, porque el programa asume que NO todas las claves que se usaron para cifrar están en el anillo de claves del receptor (¡puede que ninguna, si se trata de un espía!) y por tanto elude comparar las claves que encuentra con las que hay en el anillo, que es donde residen las etiquetas.

Si la contraseña introducida corresponde a alguna de las claves públicas presentes, entonces su identificador aparece señalado:

    [6be386a4]: *
    [40023a50]: 
    [5425be1c]: 
    [00e14ca8]: 
Si se ha usado cifrado convencional y la contraseña es correcta, no se emite mensaje alguno. Si la contraseña es incorrecta entonces se da una alarma de fallo de autentificación, pero se crea el nuevo fichero lleno de, previsiblemente, basura.

Firma

Para firmar un fichero se usa la clave privada. Se genera un trozo de código que identifica unívocamente al creador de la clave, al contenido del archivo (por medio de una función resumen o hash) y a la fecha en que fue generada la firma, la cual también figura en la cabecera del trozo de código (que llamaremos "firma"). Cualquier intento por parte de un interventor —malicioso o accidental— de cambiar alguno de estos tres elementos impide verificar correctamente la firma. Esto permite identificarte como emisor del fichero y dificulta la suplantación en el anónimo mundo digital.

Se procede así:

    sks -s mensaje.txt mensaje.sig
donde mensaje.txt es el fichero que se pretende firmar y mensaje.sig el fichero que se creará con la firma (un par de líneas de armadura en base 64). A continuación se introduce la contraseña y se comprueba si la clave publica correspondiente se encuentra en el anillo, informando de ello al usuario pero procediendo con la firma en cualquier caso. La información puede ser útil si el firmante tiene su clave en el anillo, como comprobación que ha introducido la contraseña correctamente.

El receptor obtiene tanto el fichero original como el fichero de firma. Para verificar la firma hay que teclear:

    sks -v mensaje.txt mensaje.sig
El programa localiza por sí mismo la clave pública del firmante en el anillo de claves del receptor (si no estuviera, daría una advertencia) y procede a ejecutar el algoritmo de verificación. Si todo está en orden, emite un mensaje como el siguiente:
   [5425be1c]: Jose Luis Torrente <jltorrente@caspa.net> /amiguete/
  SKS. Firma correcta realizada en: 2004-06-24, 13:49 

Firma incrustada

Si se pretende firmar un mensaje de texto claro, es posible que queramos incrustar la firma al final del mismo, de forma que el receptor reciba un único fichero. Para eso hacemos:

    sks -S mensaje.txt
que nos preguntará la contraseña y emitirá el mensaje (con una cabecera de identificación) y la firma incrustada al final, por la salida estándar. Para conservar el fichero no tenemos más que redirigir la salida:
    sks -S mensaje.txt > mensaje.txt.signed
que el receptor confirma mediante la orden -V:
    sks -V mensaje.txt.signed
El mensaje original, sin la cabecera y sin los códigos de firma, sale por la salida estándar, que podemos redirigir, mientras que el mensaje de verificación se emite por la salida de error. Si sólo nos interesa la verificación, podemos redirigir la salida hacia la papelera o, en Linux-Unix, hacia /dev/null:
    sks -V mensaje.txt.signed > /dev/null
La firma con -S está pensada para ficheros de texto, de forma que los códigos de fin de línea son excluídos del cálculo de la función resumen. Esto se hace para garantizar que las firmas realizadas en un determinado entorno operativo sean verificables en otro, por la falta de uniformidad que existe en códigos de fin de línea.

Función resumen

SKS proporciona un comando para obtener un resumen (hash) de 192 bits ( algoritmo TIGER), de una manera muy similar a cómo la aplicación md5sum genera resúmenes de 128 bits mediante el algoritmo MD5. Esto se hace mediante la orden -r:

    sks -r mensaje.txt
que da como resultado algo similar a:
    b98ef1b942071187176585271b4008722ebb96d550b1279d  mensaje.txt
Se pueden especificar varios ficheros o usar comodines:
    sks -r *.txt
	
    b98ef1b942071187176585271b4008722ebb96d550b1279d  mensaje.txt
    a7ea8f6641da42ef35cf6b359ea790a25de29a65978977b5  test.txt
que es equivalente a
    sks -r mensaje.txt test.txt