Está en la página 1de 15

Cifrado simtrico o de clave secreta:

aspectos prcticos (I)


Enviado por gonav en Mi, 18/06/2014 - 5:22pm
Foros:
Tcnico
Por Domingo Gonzlez
En ocasiones nos puede surgir la necesidad de cifrar nuestros datos, ya sea por inters personal
en proteger nuestra informacin privada, por cuestiones de poltica de empresa o simplemente
porque nos obliga la legislacin vigente de proteccin de datos. En cualquier caso, si adems la
informacin va a ser almacenada en la Nube (Cloud Computing), el cifrado se convierte en poco
menos que obligatorio.
Esta serie de artculos pretende mostrar el uso prctico de varias herramientas para el cifrado de
informacin. Aunque se realizar una pequea introduccin a los conceptos sobre criptografa, no
es objetivo del mismo tratar en profundidad los fundamentos tcnicos del cifrado ni describir los
algoritmos criptogrficos, informacin que ya est disponible en este y otros portales
especializados con mayor rigor y profundidad...
Los artculos se van a centrar en el uso del denominado cifrado simtrico o de clave secreta, en
un escenario de uso personal, donde el cifrado y descifrado de la informacin ser realizado por
la misma persona, que tambin es conocedora nica de la contrasea de cifrado.
A lo largo de varias entregas, vamos a describir el uso de determinadas herramientas de cifrado a
nivel de fichero, de directorio, de particin y de volumen virtual, intentando mantener de esta
forma un nivel creciente de dificultad. Tambin hablaremos a lo largo de la serie sobre otros
temas intrnsecamente ligados con un buen uso del cifrado, como son el borrado seguro y la
generacin de contraseas robustas, describiendo adems las herramientas disponibles para tal
fin. Las herramientas de software analizadas aqu no son ni de lejos todas las existentes, tan
solamente una seleccin personal que espero haya sido acertada para el objetivo de esta serie.

1. Algunos conceptos sobre criptografa


Si bien esta serie de artculos est dirigida a un pblico sin conocimientos sobre criptografa, y
puede ser seguida fcilmente sin saber absolutamente nada sobre lo que hay detrs del
"escenario", he credo recomendable repasar brevemente algunos conceptos que van a aparecer

aqu. La descripcin de los mismos pretende proporcionar una visin fcilmente entendible, en
detrimento del rigor tcnico, por lo que un pblico ms versado en criptografa encontrar a
buen seguro simplificaciones excesivas e imprecisiones ms o menos perdonables.
Qu significa en la prctica cifrar informacin? A grandes rasgos, el cifrado de una determinada
informacin usando una determinada contrasea consiste en la transformacin de dicha
informacin, realizando operaciones complejas que dependen de la contrasea proporcionada, de
tal forma que sea prcticamente imposible recuperar la informacin original sin conocer la
contrasea con la que ha sido cifrada. Las operaciones mencionadas, que modifican o alteran la
informacin, se basan en mtodos y tcnicas determinadas, denominadas algoritmos de cifrado.
El cifrado puede ser de tipo simtrico o de tipo asimtrico. El cifrado simtrico, conocido
tambin como cifrado de clave secreta, es aquel en el que se utiliza la misma clave o contrasea
para cifrar y para descifrar la informacin. Este es el tipo de cifrado que vamos a ver en estos
artculos, y nuestro escenario consiste en una nica persona que conoce la contrasea, cifra y
descifra su propia informacin.
Por el contrario, el cifrado asimtrico, tambin llamado cifrado de clave pblica, es un esquema
mucho ms complejo que utiliza un par de claves asociadas, donde cada una de ellas realiza por
separado la tarea de cifrar o descifrar la informacin. Este sistema de cifrado se utiliza para el
intercambio de informacin entre dos interlocutores a travs de un canal seguro, siendo
actualmente incluso ms importante que el cifrado simtrico.
Cmo funciona internamente el proceso de cifrado? Bsicamente, una operacin de cifrado
(simtrico en nuestro caso) se podra definir por tres parmetros: el algoritmo de cifrado a
utilizar, la longitud de la clave de cifrado y la contrasea proporcionada por la persona que
quiere cifrar el fichero.
Durante la operacin de cifrado la informacin se divide en bloques de un determinado tamao
(generalmente 64 o 128 bits). Por otra parte, la contrasea (denominada clave principal) se
procesa a travs de un algoritmo de derivacin de claves, que genera una secuencia de subclaves
de una determinada longitud (generalmente 64, 128 y 256). A partir de aqu, y de acuerdo con el
algoritmo de cifrado seleccionado, se aplican sucesivas y complejas operaciones de cifrado sobre
cada uno de los bloques usando las subclaves generadas. En resumen, la informacin original se
somete a una serie de transformaciones de tal forma que desaparezca cualquier orden o patrn
del que pudiera inducirse conocimiento sobre la estructura o contenido de la informacin
original. Puede decirse por tanto que la informacin cifrada muestra un aspecto totalmente
aleatorio.

Lgicamente, un algoritmo de cifrado es reversible, de tal forma que conociendo la contrasea se


invierten las operaciones realizadas recuperando la informacin original.
Cabe sealar adems que en las operaciones de cifrado descritas radica la importancia de
seleccionar una contrasea robusta, ya que cuanto mejor sea esta contrasea (de la que se
derivan las subclaves), mayor robustez y aleatoriedad tendr el cifrado obtenido.
Ahora vamos a dar un repaso a los algoritmos de cifrado simtrico ms importantes actualmente.
El primer algoritmo importante de la criptografa moderna es el denominado DES (Data
Encryption Standard), que ha sido el algoritmo estndar en criptografa hasta hace una dcada.
Utiliza un tamao de bloque de 64 bits y una longitud de clave de 56 bits. Actualmente est
considerado como inseguro debido a la escasa longitud de clave. Una variante de DES, conocida
como Triple DES o 3DES, ha mejorado sensiblemente la seguridad proporcionando una longitud
efectiva de clave de 112 bits, por lo que es ampliamente utilizado.
A raz de la inseguridad descubierta en DES, se propuso la adopcin de un nuevo algoritmo de
cifrado estndar, que se llamara AES (Advanced Encryption Standard). Para el proceso de
seleccin se propusieron 15 algoritmos de cifrado, siendo Rijndael el algoritmo ganador. Rijndael
utiliza un tamao de bloque de 128 bits, y permite una longitud de clave de 128, 160, 192, 224 y
256 bits. No obstante, cuando Rijndael se utiliza como estndar AES, las longitudes de clave
permitidas se reducen a 128, 192 o 256 bits (en este caso la denominacin Rijndael y AES se
utilizan indistintamente).
Aunque AES (Rijndael) es actualmente el algoritmo ms utilizado, existen muchos otros
ampliamente extendidos, entre ellos alguno de los otros candidatos a AES, como son CAST-256
(conocido tambin como CAST6), Serpent y Twofish, que usan bloques de 128 bits y claves de
hasta 256 bits. Otros algoritmos populares son CAST-128 (o CAST5), con bloques de 64 bits y
tamaos de clave entre 40 y 128 bits; Blowfish, con bloques de 64 bits y claves de hasta 448 bits;
e IDEA, con bloques de 64 bits y claves de 128 bits. Para una relacin ms detallada de algoritmos
de cifrado se puede consultar este enlace.
Ya finalizando, a modo informativo, cabe mencionar que los algoritmos pueden usarse aplicando
diversos modos de cifrados, entre los que se encuentran ECB, CBC, CFB y OFB. De todos ellos, el
ms utilizado es el CBC (Cipher Block Chaining).
Finalizada la descripcin, queda en el aire una pregunta inevitable: qu algoritmo utilizar? La
decisin ms simple, sin duda, es elegir el estndar AES, que ofrece tres versiones (AES-128, AES192 y AES-256) en funcin de su longitud de clave. A priori, una mayor longitud ofrece una mayor

seguridad. Sin embargo, autoridades en la materia como Bruce Schneier recomiendan utilizar
mejor AES-128 en vez de AES-256.
Tambin existe la alternativa de utilizar el algoritmo por defecto que nos sugiera la herramienta
de cifrado utilizada, como veremos ms adelante.
En cualquier caso, los principales algoritmos de cifrado que hemos mencionado ofrecen una
seguridad ms que suficiente, y la mayora de las herramientas que vamos a ver permiten
seleccionar entre una amplia lista de algoritmos, teniendo por tanto libertad para cifrar los
ficheros a gusto del usuario.
Finalmente, dado un fichero cifrado cuya contrasea desconocemos, puede ser atacado
principalmente mediante dos mtodos, denominados ataque mediante criptoanlisis y ataque por
fuerza bruta. El criptoanlisis intenta buscar debilidades en los algoritmos de cifrado que puedan
ser aprovechadas para facilitar la obtencin de la contrasea o la informacin original. Debido a
su diseo robusto, la mayora de los algoritmos descritos han demostrado ser resistentes al
criptoanlisis, si bien estn apareciendo nuevos y sofisticados ataques que sin duda obligarn a
reforzar dichos algoritmos. A efectos prcticos, en el mbito de este serie, podemos asumir con
relativa confianza que el criptoanlisis no va a ser nuestra principal amenaza.
Caso distinto es el ataque por fuerza bruta (incluyendo la variante denominada ataque por
diccionario), que consiste en la prueba sucesiva de contraseas contra el fichero cifrado, hasta
encontrar la contrasea utilizada. Este ataque tiene tericamente un xito del 100%, si bien el
espacio de claves posibles y la fortaleza de la contrasea seleccionada pueden convertir este
ataque en una operacin excesivamente costosa desde el punto de vista computacional. La
eleccin de la contrasea adecuada, que depende de nosotros, puede suponer unas pocas horas o
bien millones de aos para que el ataque tenga xito. De aqu la importancia de construir una
contrasea robusta, tema al que dedicaremos una parte de esta serie.

Cifrado simtrico o de clave secreta:


aspectos prcticos (II)
Enviado por gonav en Mi, 02/07/2014 - 10:26pm
Foros:
Tcnico
Por Domingo Gonzlez
El mtodo ms simple para cifrar la informacin es actuar sobre el propio fichero que contiene
los datos. La operacin de cifrado se realiza sobre nuestro fichero de trabajo (del tipo que sea),
proceso que habr que invertir para trabajar de nuevo sobre el fichero. En esta primera entrega
sobre cifrado a nivel de ficheros (tendremos al menos dos ms) analizamos dos programas muy
fciles de utilizar...

2.- Cifrado a nivel de fichero: ccrypt y mcrypt


La primera herramienta que vamos a ver es ccrypt, cuya utilizacin es extremadamente sencilla.
A modo de informacin, ccrypt es una veterana herramienta de Linux diseada como reemplazo
del antiguo crypt de Unix, y utiliza como nica alternativa una variante del algoritmo de cifrado
Rijndael con tamao de bloque y longitud de clave de 256-bits.
Para cifrar un fichero se debe especificar la opcin -e (o --encrypt), creando ccrypt un nuevo
fichero cifrado cuyo nombre es el del fichero original aadiendo la extensin .cpt,
sobreescribiendo el fichero original. Para descifrar, se especifica la opcin -d (--decrypt),
reconstruyendo el fichero original. Vamos a ver un ejemplo con un documento cualquiera de
OpenOffice:
$ ls
misdatos.odt
$ ccrypt -e misdatos.odt
Enter encryption key:
Enter encryption key: (repeat)
Encrypting misdatos.odt
$ ls
misdatos.odt.cpt
$ ccrypt -d misdatos.odt
Enter decryption key:
Decrypting misdatos.odt.cpt
$ ls
misdatos.odt

ccrypt proporciona tambin el comando ccat, que permite descifrar un fichero y volcar su
contenido a la salida estndar (terminal), muy til si trabajamos con ficheros en texto plano y
solamente necesitamos visualizar su contenido.
Es importante destacar que ccrypt destruye el fichero original, sobrescribindolo de forma
destructiva, al contrario que el resto de herramientas que vamos a ver. En este ltimo caso,
donde se mantiene el fichero original despus del cifrado, es necesario realizar posteriormente
un borrado seguro del mismo tal y como veremos ms adelante.
A modo ilustrativo, vamos a mostrar las modificaciones realizadas por el algoritmo de cifrado
sobre el texto original. Supongamos que disponemos de un fichero en texto plano, al que
llamaremos misdatos.txt, cuyo contenido en ASCII es el siguiente:
$ hexdump
00000000
00000010
00000020
00000023

-C
4d
20
72

misdatos.txt
65 6e 73 61 6a 65 20
63 6c 61 72 6f 20 73
2e 0a

65 6e 20 74 65 78 74 6f
69 6e 20 63 69 66 72 61

|Mensaje en texto|
| claro sin cifra|
|r..|

Una vez cifrado dicho documento usando ccrypt con la legendaria contrasea "12345", su
contenido aparece de esta forma:
$ hexdump
00000000
00000010
00000020
00000030
00000040
00000043

-C
36
2a
ab
b1
84

misdatos.txt.cpt
1e bc d1 48 86 0c
ab 75 e2 0d 91 24
d1 fb c2 04 3d 4b
69 36 3c ba c8 8d
ac 6b

c6
4b
c6
c4

c7
f2
53
04

f6
df
86
ba

5a
62
2a
f7

a0
ba
f0
e7

72
d0
e7
ad

49
0b
32
9a

35
8c
10
c2

33
49
fc
87

|6...H.....Z.rI53|
|*.u...$K..b....I|
|.....=K.S.*..2..|
|.i6<............|
|..k|

donde podemos observar que el texto original ha sufrido una serie de alteraciones que impiden
identificar cualquier informacin sobre el mismo.
La segunda herramienta de cifrado que vamos a analizar es mcrypt, tambin aparecida como
reemplazo del crypt de Unix. mcrypt utiliza la biblioteca libmcrypt, que implementa los
algoritmos simtricos disponibles. Usando la opcin --list, mcrypt muestra la lista de algoritmos y
los modos de cifrado que puede utilizar, la mayora de los cuales ahora nos resultarn familiares.
Entre parntesis se muestra la longitud de clave por defecto (en bytes) para cada algoritmo.
$ mcrypt --list
cast-128 (16): cbc cfb ctr ecb ncfb nofb ofb
gost (32): cbc cfb ctr ecb ncfb nofb ofb
rijndael-128 (32): cbc cfb ctr ecb ncfb nofb ofb
twofish (32): cbc cfb ctr ecb ncfb nofb ofb
arcfour (256): stream
cast-256 (32): cbc cfb ctr ecb ncfb nofb ofb
loki97 (32): cbc cfb ctr ecb ncfb nofb ofb
rijndael-192 (32): cbc cfb ctr ecb ncfb nofb ofb
saferplus (32): cbc cfb ctr ecb ncfb nofb ofb
wake (32): stream
blowfish-compat (56): cbc cfb ctr ecb ncfb nofb ofb
des (8): cbc cfb ctr ecb ncfb nofb ofb
rijndael-256 (32): cbc cfb ctr ecb ncfb nofb ofb
serpent (32): cbc cfb ctr ecb ncfb nofb ofb

xtea (16): cbc cfb ctr ecb ncfb nofb ofb


blowfish (56): cbc cfb ctr ecb ncfb nofb ofb
enigma (13): stream
rc2 (128): cbc cfb ctr ecb ncfb nofb ofb
tripledes (24): cbc cfb ctr ecb ncfb nofb ofb
Para cifrar un fichero no es necesario especificar opcin alguna, mientras que para descifrar se
especifica la opcin -d (--decrypt). Tras el cifrado se crea un nuevo fichero aadiendo la
extensin .nc. El algoritmo por defecto es Rijndael-128, con 256 bits (32x8) y CBC como modo de
cifrado. Los detalles del cifrado se muestran utilizando la opcin -V (verbose mode).
$ mcrypt -V misdatos.odt
Enter the passphrase (maximum of 512 characters)
Please use a combination of upper and lower case letters and numbers.
Enter passphrase:
Enter passphrase:
Algorithm: rijndael-128
Keysize: 32
Mode: cbc
Keyword mode: mcrypt-sha1
File format: mcrypt
Input File: misdatos.odt
Output File: misdatos.odt.nc
File misdatos.odt was encrypted.
En el proceso de descifrado, mcrypt recupera el fichero original en un nuevo fichero con el
nombre original y sin la extensin .nc.
$ mcrypt -d misdatos.odt.nc
Enter passphrase:
File misdatos.odt.nc was decrypted.
mcrypt incrusta en el fichero cifrado informacin sobre la herramienta y el algoritmo utilizado,
tal y como se muestra dando un vistazo al contenido del fichero generado:
$ file misdatos.odt.nc
misdatos.odt.nc: mcrypt 2.5 encrypted data, algorithm: rijndael-128, keysize: 32 bytes,
mode: cbc,
$ hexdump
00000000
00000010
00000020

-C
00
00
61

misdatos.odt.nc |
6d 03 40 72 69 6a
20 00 63 62 63 00
31 00 15 44 ac dc

head -n 3
6e 64 61 65 6c 2d 31 32 38
6d 63 72 79 70 74 2d 73 68
c7 a4 70 ce 22 61 25 09 b9

|<a href="mailto:.m.@rijndael">.m.@rijndael</a>-128|
|. .cbc.mcrypt-sh|
|a1..D....p."a%..|

Tambin se puede seleccionar el tipo de cifrado a utilizar, mediante la opcin -a (algoritmo), -m


(modo), -s (key size) y -o (key mode). Por ejemplo, podemos cifrar usando el algoritmo Blowfish
de esta forma:
$ mcrypt -V -a blowfish misdatos.odt
Enter the passphrase (maximum of 512 characters)
Please use a combination of upper and lower case letters and numbers.
Enter passphrase:
Enter passphrase:
Algorithm: blowfish
Keysize: 56
Mode: cbc
Keyword mode: mcrypt-sha1

File format: mcrypt


Input File: misdatos.odt
Output File: misdatos.odt.nc
File misdatos.odt was encrypted.
Al igual que antes, podemos ver que la informacin incrustada en el fichero describe ahora las
nuevas caractersticas del cifrado:
$ file misdatos.odt.nc
misdatos.odt.nc: mcrypt 2.5 encrypted data, algorithm: blowfish, keysize:
56 bytes, mode: cbc,
$ hexdump
00000000
00000010
00000020

-C
00
62
29

misdatos.odt.nc |
6d 03 40 62 6c 6f
63 00 6d 63 72 79
dd 20 a5 02 95 48

head -n 3
77 66 69 73 68 00 38 00 63
70 74 2d 73 68 61 31 00 15
0a f9 b9 3a 72 40 82 50 6b

|<a href="mailto:.m.@blowfish">.m.@blowfish</a>.8.c|
|bc.mcrypt-sha1..|
|). ...H...:r@.Pk|

Por ltimo, es interesante comentar la opcin -g (--openpgp) de mcrypt. Una pregunta que nos
estaremos haciendo a estas alturas es si las herramientas de cifrado de ficheros
son interoperables. Es decir, si cifro mis datos con un software determinado, puedo descifrarlos
usando una herramienta distinta? La respuesta es que en teora s. Y aqu es donde entra en
escena el estndar OpenPGP.
Con la opcin -g, mcrypt usa el formato OpenPGP (RFC2440) para el fichero cifrado, permitiendo
que cualquier otra herramienta que utilice dicho estndar pueda acceder a los datos
correctamente. Para ms informacin se puede consultar este enlace. Con este nuevo
planteamiento, nuestro proceso de cifrado queda de la siguiente forma:
$ mcrypt -V -g test.txt
Enter the passphrase (maximum of 512 characters)
Please use a combination of upper and lower case letters and numbers.
Enter passphrase:
Enter passphrase:
Algorithm: rijndael-128
Keysize: 32
Mode: ncfb
Keyword mode: s2k-isalted-sha1
File format: openpgp
Input File: test.txt
Output File: test.txt.nc
donde podemos observar que 'Keyword mode' es ahora s2k-isalted-sha1, y el formato de fichero
(File format) es openpgp, de acuerdo con el estndar.
De igual forma, la informacin incrustada en el fichero durante el proceso de cifrado tambin es
diferente en este caso:
$ file test.txt.nc
test.txt.nc: data
$ hexdump
00000000
00000010
00000020

-C
c3
3d
25

test.txt.nc
0d 04 09 03
a9 96 fa e8
25 90 84 5a

| head -n
02 78 a6
04 f0 b6
11 56 64

3
62 1f 6b 55 ba fe 60 c9
81 69 59 6c d2 af 6b 55
0f c5 e8 82 c5 e1 07 46

|......x.b.kU..`.|
|=........iYl..kU|
|%%..Z.Vd.......F|

Cifrado simtrico o de clave secreta:


aspectos prcticos (III)
Enviado por gonav en Mar, 19/08/2014 - 6:39pm
Foros:
Tcnico
Por Domingo Gonzlez
En esta tercera entrega sobre cifrado simtrico a nivel de fichero vamos a analizar dos nuevas
herramientas bastante ms populares que las vistas anteriormente: GNU Privacy Guard (ms
conocida como GnuPG) y OpenSSL.

3.- Cifrado a nivel de fichero: GnuPG y OpenSSL


La primera herramienta a analizar es GNU Privacy Guard (ms conocida como GnuPG o gpg), y
que se ha convertido en la alternativa de cdigo abierto de la conocida suite PGP. Aunque GnuPG
es ampliamente utilizada para cifrado simtrico, es ms conocida sin embargo por su contribucin
a la criptografa asimtrica o de clave pblica. Constituye una implementacin del estndar
OpenPGP que ya comentamos en la entrega anterior, y utiliza una variante de CFB para el cifrado
simtrico. GnuPG dispone de una amplia lista de opciones y puede convertirse en una
herramienta compleja cuando se utiliza para cifrado de clave pblica. No obstante, para cifrado
simtrico su uso es bastante sencillo.
Los algoritmos de cifrado simtrico disponibles en gpg (GnuPG) se muestran usando la opcin -version, bajo la denominacin de "Cifrado". En las ltimas versiones (posteriores a la utilizada en
este artculo) incluye tambin el algoritmo IDEA.
$ gpg --version
gpg (GnuPG) 1.4.12
[...]
Algoritmos disponibles:
Clave pblica: RSA, RSA-E, RSA-S, ELG-E, DSA
Cifrado: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
CAMELLIA128,
CAMELLIA192, CAMELLIA256
Resumen: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compresin: Sin comprimir, ZIP, ZLIB, BZIP2
Para cifrar un fichero se especifica la opcin -c (--symmetric), creando un nuevo fichero cifrado
aadiendo la extensin .gpg. Para el proceso de descifrado se especifica la opcin -d (--decrypt),
que por defecto volcar el contenido en consola. Si se desea obtener como salida un fichero, es
necesario especificar la opcin -o (--output) con el nombre del fichero de salida.
$ gpg -c -v misdatos.odt
Introduzca frase contrasea:

Repita frase contrasea:


gpg: usando cifrado CAST5
gpg: escribiendo en `misdatos.odt.gpg'
$ gpg -v -o original.odt -d misdatos.odt.gpg
gpg: datos cifrados CAST5
Introduzca frase contrasea:
gpg: cifrado con 1 frase contrasea
gpg: nombre fichero original='misdatos.odt'
No obstante, puede resultar ms simple invocar gpg sin opciones, cuya configuracin por defecto
descifra el fichero pasado como parmetro y genera un fichero de salida con el nombre del
fichero original, cuya informacin almacena internamente (se muestra con la opcin -v, como
hemos visto).
$ gpg -v misdatos.odt.gpg
gpg: datos cifrados CAST5
gpg: cifrado con 1 frase contrasea
gpg: nombre fichero original='misdatos.odt'
Sin intencin de entrar en detalles tcnicos, cabe mencionar que usando determinados algoritmos
(por ejemplo CAST5 o BLOWFISH) aparece un aviso durante el proceso de descifrado sin mayor
repercusin ms all de lo meramente molesto. El mensaje es del tipo "ATENCIN: la integridad
del mensaje no est protegida" ("WARNING: message was not integrity protected" en su variente
en ingls), y alerta de que dichos algoritmos no implementan proteccin de la integridad del
mensaje (MDC integrity protection). Se puede desactivar dicho aviso usando la opcin --no-mdcwarning.
Como ya hemos visto, por defecto gpg utiliza CAST5, aunque puede seleccionarse el algoritmo
deseado con la opcin --cipher-algo. Por ejemplo, para cifrar y descifrar usando el algoritmo AES256 se procede del siguiente modo:
$ gpg -c -v --cipher-algo AES256 misdatos.odt
gpg: usando cifrado AES256
gpg: `misdatos.odt' ya est comprimido
gpg: escribiendo en `misdatos.odt.gpg'
$ gpg -v misdatos.odt.gpg
gpg: datos cifrados AES256
gpg: cifrado con 1 frase contrasea
gpg: nombre fichero original='misdatos.odt'
Si damos un vistazo al contenido del fichero cifrado, podemos observar que no aparece
informacin explcita sobre el algoritmo que hemos utilizado. Para consultar dicha informacin
tenemos que usar la opcin --list-only de gpg:
$ file misdatos.odt.gpg
misdatos.odt.gpg: DOS executable (COM)
$ hexdump -C misdatos.odt.gpg | head -n 3
00000000 8c 0d 04 09 03 02 11 4d ca d0 f4 5f 97 17 60 d2
|.......M..._..`.|

00000010 ff 00 00 23 39 01 8f 20
.y..Qme.|
00000020 2e 02 32 b5 5a b3 1c dc
|..2.Z....n|.h2h.|

b2 79 f3 b6 51 6d 65 9b

|...#9..

b6 6e 7c ad 68 32 68 13

$ gpg --list-only misdatos.odt.gpg


gpg: datos cifrados AES256
gpg: cifrado con 1 frase contrasea
Para finalizar con gpg, vamos a comprobar la interoperabilidad entre herramientas usando el
modo --openpgp (-g) de mcrypt que ya comentamos en el artculo anterior. Considerando que gpg
es una implementacin del estndar OpenPGP, debera abrir sin problemas un fichero cifrado
desde mcrypt que sea compatible con OpenPGP. Creamos el fichero cifrado:
$ cat test.txt
Mensaje en texto claro sin cifrar.
$ mcrypt -V -g test.txt
Enter the passphrase (maximum of 512 characters)
Please use a combination of upper and lower case letters and numbers.
Enter passphrase:
Enter passphrase:
File test.txt was encrypted.
gpg requiere que el fichero a descifrar tenga extensin .gpg, por lo que cambiaremos la extensin
.nc antes de procesar el fichero.
$ cp test.txt.nc test.txt.gpg
$ gpg -v -o original.txt -d test.txt.gpg
gpg: datos cifrados AES256
gpg: cifrado con 1 frase contrasea
gpg: nombre fichero original=''
$ cat original.txt
Mensaje en texto claro sin cifrar.
Se comprueba por lo tanto que gpg descifra correctamente ficheros cifrados compatibles con
OpenPGP. Comprobamos ahora si desde mcrypt se puede descifrar un fichero cifrado con gpg.
Creamos para ello el fichero cifrado, que por defecto es compatible con el estndar OpenPGP,
cambiamos la extensin a .nc y procesamos con mcrypt.
$ gpg -c -v test.txt
gpg: usando cifrado CAST5
gpg: escribiendo en `test.txt.gpg'
$ cp test.txt.gpg test.txt.nc
$ mcrypt -d test.txt.nc
An OpenPGP encrypted file has been detected.
Enter passphrase:
File test.txt.nc was decrypted.
$ cat test.txt
Mensaje en texto claro sin cifrar.

De nuevo el descifrado se realiza de forma correcta. Es necesario indicar que el proceso


solamente funciona de forma adecuada utilizando los valores por defecto de mcrypt y gpg, tal y
como lo hemos hecho en el ejemplo. Cuando he intentado especificar un algoritmo de cifrado
determinado, tanto en el cifrado como en el descifrado del fichero, la operacin ha arrojado
errores al intentar descifrar el fichero.
Tambin es posible usar OpenSSL para cifrar simtricamente ficheros, aunque al igual de GnuPG
es una herramienta con muchas ms funcionalidades (principalmente enfocada a los protocolos
SSL y TLS). Los algoritmos de cifrado pueden consultarse por medio de la opcin list-cipheralgorithms de openssl o en la pgina de manual del comando enc (man enc). La lista es extensa,
con numerosas combinaciones de algoritmos, modos y longitud de clave. Las configuraciones
correspondientes a AES se muestran a continuacin:
aes-[128|192|256]-cbc 128/192/256 bit AES in CBC mode
aes-[128|192|256]
Alias for aes-[128|192|256]-cbc
aes-[128|192|256]-cfb 128/192/256 bit AES in 128 bit CFB mode
aes-[128|192|256]-cfb1 128/192/256 bit AES in 1 bit CFB mode
aes-[128|192|256]-cfb8 128/192/256 bit AES in 8 bit CFB mode
aes-[128|192|256]-ecb 128/192/256 bit AES in ECB mode
aes-[128|192|256]-ofb 128/192/256 bit AES in OFB mode
openssl utiliza la opcin -e para cifrar y -d para descifrar un fichero. Tambin es necesario
especificar el fichero de entrada (opcin -in) y de salida (opcin -out), que sern el fichero
original y el fichero cifrado respectivamente en el caso de cifrado, y viceversa para el caso de
descifrado. Para el cifrado se puede pasar directamente como parmetro el nombre del algoritmo
de cifrado (ciphername) o anteponiendo al mismo la opcin enc -ciphername, tal y como se
muestra a continuacin:
$ openssl <ciphername> -in inputfile -out otuputfile
$ openssl enc -ciphername <ciphername> -in inputfile -out otuputfile
Si se desea cifrar nuestro fichero de ejemplo usando el algoritmo AES en modo CBC y longitud de
clave 256, y descifrarlo posteriormente, los comandos correspondientes son los siguientes:
$ openssl aes-256-cbc -e -in misdatos.odt -out misdatos.odt.aes
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
$ openssl aes-256-cbc -d -in misdatos.odt.aes -out misdatos.odt
enter aes-256-cbc decryption password:
Si consultamos el contenido de un fichero cifrado con openssl podemos observar que aparece el
trmino "Salted". Esto es debido a que openssl usa por defecto la opcin -salt, que utiliza un
conjunto de caracteres aleatorios combinados con la contrasea de usuario para generar las
claves del algoritmo de cifrado. Esta opcin refuerza la robustez de la contrasea y dificulta los
ataques por fuerza bruta. Para ms informacin sobre Salt se puede consultar la norma RFC2440 y
la entrada en Wikipedia.

$ file misdatos.odt.aes
misdatos.odt.aes: data
$ hexdump
00000000
00000010
00000020

-C
53
c1
c6

misdatos.odt.aes
61 6c 74 65 64 5f 5f
85 c9 38 cd c7 42 e5
ce b6 b3 1c ec 36 93

b0 58 e3 ab ed ed f1 b4
2b df 27 21 5a e5 3f 34
68 93 7c d7 a6 7f 30 56

|Salted__.X......|
|...8..B.+.'!Z.?4|
|......6.h.|...0V|

Para finalizar este artculo vamos a hablar de un algoritmo de cifrado que implementan tanto gpg
como openssl. Se trata del algoritmo CAMELLIA, de reciente creacin, y que pretende ofrecer una
alternativa al estndar AES. Actualmente ha sido seleccionado para su uso por parte de los
proyectos NESSIE (New European Schemes for Signatures, Integrity and Encryption) que establece
el esquema europeo de cifrado, y CRYPTREC (Cryptography Research and Evaluation Committees)
del gobierno japons. CAMELLIA est disponible libre de royalties, lo que le ha permitido formar
parte del proyecto OpenSSL y del mdulo (Network Security Services) de Mozilla. Para una
descripcin ms detallada se puede consultar la norma RFC 3713 que define el algoritmo.
Segn hemos visto anteriormente, gpg implementa CAMELLIA128, CAMELLIA192 y CAMELLIA256.
Por su parte, openssl dispone de una lista de opciones ms amplia para dicho algoritmo,
combinando tamao de clave y modo de cifrado. Para el modo CBC podemos seleccionar las
siguientes configuraciones:
$ openssl list-cipher-algorithms | grep CAMELLIA
[...]
CAMELLIA128 => CAMELLIA-128-CBC
CAMELLIA192 => CAMELLIA-192-CBC
CAMELLIA256 => CAMELLIA-256-CBC
De esta forma, si utilizamos gpg y openssl para cifrar un documento usando el algoritmo
CAMELLIA con longitud de clave de 128 bits, se procede de la siguiente forma:
$ gpg -c -v --cipher-algo CAMELLIA128 misdatos.odt
gpg: usando cifrado CAMELLIA128
gpg: `misdatos.odt' ya est comprimido
gpg: escribiendo en `misdatos.odt.gpg'
$ openssl CAMELLIA128 -e -in misdatos.odt -out misdatos.odt.aes
enter camellia-128-cbc encryption password:
Verifying - enter camellia-128-cbc encryption password:
Y con esto finalizamos la parte sobre herramientas especficas de cifrado a nivel de fichero.
Aunque existen otras muchas, creo que con las herramientas descritas se cubren ampliamente las
necesidades que nos puedan surgir. Para los amantes de las interfaces grficas, por ejemplo
tenemos disponibles frontends de GnuPG como GPA. Para plataforma Windows, merece la pena
destacar la suite Gpg4win que es la distribucin oficial de GnuPG para Windows, as como el
software AxCrypt bajo licencia GPL y que implementa AES con clave de 128 bits.

AUTOCIFRADO HOWTO
==================
Cifrar implica normalmente ingresar una contrasea de forma interactiva pero, si necesito
almacenar informacin de forma segura en servidores remotos cuyo compromiso debe ser
asumido gestionando adecuadamente su inseguridad; o si necesito que alguien me enve un
archivo cifrado mediante una clave slo conocida por m que requiere proporcionrsela de
manera segura; etc. combinar la criptografa simtrica con la asimtrica suele ser una muy buena
opcin.
Para ello, de un par de claves generadas al efecto, puedo almacenar la clave pblica de cifrado
asimtrico en un servidor remoto o envirsela a alguien directamente sin preocuparme de que
sea conocida por extraos porque, con su correspondiente clave privada slo por m conocida y
bien resguardada, slo yo podra descifrar con normalidad una clave simtrica en este caso de
1024 bits, generada pseudoaleatoriamente en hexadecimal y previamente cifrada con la
correspondiente clave pblica de cifrado asimtrico con la que poder cifrar de forma simtrica
los datos sensibles cuya inseguridad deseo gestionar adecuadamente.

#
#
#
#
#
#

Primero genero mi par de claves RSA 4096-bit y lo guardo


perfectamente bien; tanto para que nadie ms que yo pueda
tener acceso a mi clave privada, como para no perderla. Una
buena medida preventiva es, por ejemplo, cifrarlo utilizando un
mtodo estndar y guardar a buen recaudo al menos dos copias
de seguridad del mismo:

openssl genrsa -out private.key 4096

# Luego extraigo la clave pblica:

openssl rsa -pubout -in private.key -out public.key


Y envo a un servidor remoto por cualquier medio eficaz sin preocuparme de su inseguridad
dado que puede ser conocida mi clave pblica y, ya con ella en el servidor remoto, utilizo los
comandos descritos a continuacin para cifrar los datos sensibles contenidos en un archivo al que,
en este ejemplo, llamo "file.dat":

#
#
#
#
#
#

Genero cadenas aleatorias de octetos --random byte streams-de 4Kb mediante openssl y /dev/urandom previendo posibles
debilidades de uno de ellos y, concatenados, los paso a travs
de sha512 para obtener una clave aleatoria de 1024 bits (128
bytes u octetos) en formato hexadecimal que ser mi clave de
cifrado simtrico:

echo "$(openssl rand 4096)$(dd if=/dev/urandom bs=4096 count=1


2>/dev/null)" | openssl sha512 -r | head -c 128 > aes.key

# Cifro con AES192 el fichero en cuestion "file.dat" utilizando


# "aes.key" como clave de cifrado simtrico:

openssl aes-192-cbc -in file.dat -out file.dat.crypt -pass file:aes.key

# Cifro ahora la clave "aes.key" con RSA utilizando la clave pblica que
# previamente haba almacenado en el servidor remoto por si, con ella,
# necesito que alguien --o yo mismo desde otro sitio-- me enve un
archivo
# cifrado mediante una clave de cifrado simtrico que slo yo pueda
descifrar
# con mi clave privada:
openssl rsautl -encrypt -pubin -inkey public.key -in aes.key -out
aes.key.rsa

# Borro "aes.key" porque ya no la necesito:


rm aes.key

# Opcionalmente, tambin borro "file.dat"


rm file.dat

#
#
#
#

Empaqueto y comprimo el fichero "file.dat.crypt" previamente cifrado


mediante AES192 junto con la clave simtrica "aes.key.rsa" utilizada
para ello y tambin cifrada, pero con mi par de claves RSA de cifrado
asimtrico RSA:

tar cfz file.tar.gz file.dat.crypt aes.key.rsa

# Borro lo que qued:


rm file.dat.crypt aes.key.rsa
Y envo el archivo resultante "file.tar.gz" por cualquier medio de comunicacin a cualquier
destino habiendo gestionado de esta forma su inseguridad adecuadamente dado que, sin la clave
privada de cifrado asimtrico por m guardada a buen recaudo, no es trivial descifrar los datos
que contiene.
Ahora bien, para automatizar verdaderamente todo el proceso habra que confeccionar un fichero
ejecutable o shell script con los comandos descritos arriba que, por ejemplo, haga la copia de
seguridad en local peridicamente y que, luego, la enve al servidor rutinariamente; para ello se
deben combinar las posibilidades de un lenguaje shell como Bash, por ejemplo con las de
OpenSSL, lo que no es objeto de este breve comentario.
Si un da necesito recuperar los datos, realizo el proceso descrito anteriormente en orden
inverso:

# Abro el archivo "file.tar.gz":


tar xfz file.tar.gz

# Descifro la clave simtrica "aes.key.rsa" utilizando la clave privada


de
# cifrado asimtrico RSA por m custodiada y guardada a buen recaudo:

openssl rsautl -decrypt -inkey private.key -in aes.key.rsa -out aes.key

# Y, por ltimo, descifro con AES192 el archivo original "file.dat.crypt"


# utilizando para ello la clave de cifrado simtrico recien descifrada:
openssl aes-192-cbc -d -in file.dat.crypt -out file.dat -pass
file:aes.key
Basado en el excelente comentario enviado a Kriptpolis por Anonimo (no verificado) el 2014-0831, domingo a las 12:38; muchas gracias a ambos y sendos saludos.
P.S. He actualizado los comentarios porque me he dado cuenta de que contenan algunas
imprecisiones o adolecan de una explicacin deficiente mis disculpas, pero el cdigo no ha
sufrido cambio alguno. Si bien he puesto aes-192-cbc por coherencia con mi anterior comentario
ya que es la implementacin por defecto del software SKS que a m me resulta familiar y til,
estoy de acuerdo con que, en Europa, cada vez son ms los sitios y las personas que usan el
algoritmo estndar CAMELLIA; basta con sustituir aes-192-cbc con camellia-192-cbc y, si se quiere
aunque no es necesario, aes.key con camellia.key.