SKS, criptografía de bolsillo
Keywords: criptografía, curva elíptica, clave pública, PGP, GPG

# SKS

## criptografía de bolsillo

### 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 haya 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

Los creadores de TIGER desarrollaron una segunda versión del algoritmo, que afecta sólo en la forma de rellenar el último segmento parcial de texto antes de obtener el resumen final. SKS usa la primera versión, por lo que los resúmenes obtenidos para un mismo ficher pueden diferir de otra aplicación que use TIGER-2.

▲

### Modo de filtro

SKS se puede utilizar como un filtro dentro de una cadena de proceso de archivos de texto. En este caso, el texto que va a ser procesado entra siempre por la entrada estándar (`stdin`) y el resultado se emite por la salida estándar. Si la operación solicitada es el cifrado, entonces el resultado se codifica en `base64` para transformarlo en cadenas texto que se pueden imprimir o editar.

También se pueden filtrar archivos binarios (opción `-b`), pero en este caso no se aplica codificación `base64`.

En este modo de funcionamiento los identificadores y contraseñas se introducen como parámetros del programa. Esto hace "visible" la contraseña si se usa directamente la línea de comandos para hacer uso de este modo. En realidad, el modo de filtro está pensado para usarlo dentro de guiones de comandos (scripts) de más alto nivel, donde las contraseñas se deben introducir mediante formularios con eco de estrella apropiados o similares.

Sin embargo, los ejemplos que se proporcionan aquí están escritos directamente en línea de comandos para mostrar con más claridad el funcionamiento. También se asumirá que se pretende filtro de texto (ASCII); el filtro binario es mucho más sencillo de entender a partir del filtro de texto.

Mediante la orden `sks -f` o `sks -b` obtenemos un breve resumen del manual del modo de filtro:

    Modo de uso [filtrado]:
     cifrado convencional
       -fc "contraseña" <claro >cifrado-ascii
       -fC       (compresión previa de datos)
     cifrado de clave pública
       -fe [id 1]  [id 2] ... [id n]*  <claro >cifrado-ascii
       -fE       (compresión previa de datos)
     descifrar (todos casos)
       -fd "contraseña" <cifrado-ascii >claro
     firmar/verificar
       -fS "contraseña" <texto >texto-firmado
       -fV <texto-firmado >texto
    [filtrado binario]:
     cifrado convencional
       -bc "contraseña" <claro >cifrado
       -bC       (compresión previa de datos)
     cifrado de clave pública
       -be [id 1]  [id 2] ... [id n]*  <claro >cifrado
       -bE       (compresión previa de datos)
     descifrar (todos casos)
       -bd "contraseña" <cifrado >claro
     (*) Será seleccionada toda clave que contenga cualquier identificador
         La ausencia de identificador selecciona todas las claves

La segunda letra tras la `f` elige la función del programa que actúa de forma muy similar a la orden en modo de no filtrado. Por ejemplo, para cifrar un flujo de texto con destino al usuario `Torrente`:

        ...(flujo de texto).. | sks -fE Torrente

Un ejemplo más concreto usando la línea de comandos de Linux-Unix:

        cat mensaje.txt | sks -fE Torrente > cifrado.txt

donde en lugar de `cifrado.txt` se puede "enchufar" (pipe) otro programa, por ejemplo, de correo eléctrónico:

        cat mensaje.txt | sks -fE Torrente           \\
        | mail jltorrente@caspa.net -s "Lee esto"

El receptor usa la orden `-fd` para descifrarlo:

        cat cifrado.txt | sks -fd amiguete

Si la contraseña está formada por palabras separadas por espacios, se pueden usar comillas:

        cat cifrado.txt | sks -fd "hola mundo"

Si el flujo de entrada contiene varios bloques de texto cifrado, el programa intentará descifrar todos con la clave propuesta. Los bloques se identifican con indicadores de comienzo y fin de armadura que incluyen los símbolos `###`. La salida contiene sólo el texto descifrado; cualquier texto fuera de la armadura no se considera.

Para firmar se procede con `-fS` y el resultado es la entrada que se proporciona, junto con la cabecera de identificación, y con el código de firma incrustado al final. Por ejemplo, el usuario `Hola Mundo` firma un mensaje que envía al usuario `Torrente`:

        cat mensaje.txt | sks -fS "hola mundo"        \\
        | mail jltorrente@caspa.net -s "Lee esto"

y el receptor lo verifica mediante:

        cat mensaje.txt | sks -fV

y obiene el mensaje "limpio" a la salida, más una confirmación por la salida de error (`stderr`).

Por su filosofía minimalista, el programa no contempla una orden para firmar y cifrar. Se puede invocar al programa dos veces y "enchufar" las salidas:

        cat mensaje.txt | sks -fS "hola mundo"          \\
        | sks -fE Torrente hola > mensaje.sks

que el receptor puede verificar mediante:

        cat mensaje.sks | sks -fd amiguete | sks -fV > mensaje.txt

▲