<!-- $Id$ -->

<!DOCTYPE ARTICLE PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!--ArborText, Inc., 1988-1995, v.4001-->
<!NOTATION drw SYSTEM "DRW">
<!ENTITY gpg "<application>gpg</application>">
<!ENTITY gnupg "GnuPG">
<!ENTITY Gnupg "GnuPG">
<!ENTITY pgp "PGP 2.x">
<!ENTITY vg "v.g.">
<!ENTITY ie "o sea,">
<!ENTITY laquo "«">
<!ENTITY raquo "»">
<!ENTITY dquo '"'>
<!ENTITY lquo "`">
<!ENTITY rquo "'">
<!ENTITY ldquo "``">
<!ENTITY rdquo "''">
<!ENTITY license SYSTEM "license.sgml">
]> 

<article lang="es">
<artheader>
<title>Substituir &pgp; por &gnupg;</title>
<!--
<authorgroup>
<author><firstname>Kyle</><surname>Hasselbacher</>
<affiliation>
<address><email>kyle@toehold.com</email></address>
</affiliation>
</author>
<author><firstname>Michael</><surname>Fischer v. Mollard</>
<affiliation>
<address><email></email>mfvm@gmx.de</email></address> 
</affiliation>
</author>
<author><firstname>Mike</><surname>Ashley</>
<affiliation>
<address><email></email>jashley@acm.org</email></address>
</affiliation> 
</author>
</authorgroup>
-->
<copyright>
<year>1999</year>
<holder>Kyle Hasselbacher</holder>
</copyright>
</artheader>

<abstract>
<para>
</para>

<para>
Este documento está basado en una 
<ulink url="http://www.toehold.com/~kyle/pgp-compat.html">guía de
compatibilidad &pgp;/&gnupg;</ulink> anterior, desarrollada por Kyle 
Hasselbacher (<email>kyle@toehold.com</email>).
La guía fue reeditada y ampliada por Mike Ashley
(<email>jashley@acm.org</email>).
Michael Fischer v. Mollard (<email>mfvm@gmx.de</email>) transformó el código
HTML a DocBook SGML, y también añadió algunos datos.
Algunos de los temas aquí tratados tienen su origen en las listas de correo
de <literal>gnupg-devel</literal> y <literal>gnupg-user</literal>.
La solución dada al problema de firmar y cifrar a un tiempo con una clave RSA
fue tomada del <ulink
url="http://muppet.faveve.uni-stuttgart.de/~gero/gpg-2comp/changes.html">guión
de compatibilidad</ulink> de Gero Treuner.
Para cualquier duda, error, o sugerencia sobre este manual, diríjase al
mantenedor de este documento, Mike Ashley (<email>jashley@acm.org</email>).
Para cualquier duda, corrección, o sugerencia sobre la versión en castellano,
diríjase al traductor, Horacio (<email>homega@ciberia.es</email>).
</para>

<para>
Este manual puede ser redistribuido de acuerdo con los términos de la
<ulink url="http://www.gnu.org/copyleft/gpl.html">GNU General Public
License</ulink>;  se puede encontrar una traducción de esta licencia al
castellano en:
<ulink url="http://visar.csustan.edu/~carlos/gpl-es.html">Licencia Pública
GNU</ulink>
</para>
</abstract>

<sect1>
<title>
Introducción
</title>

<para>
Este documento describe cómo comunicarse con otras personas que todavía estén
usando viejas versiones de &pgp;.
&gnupg; puede usarse como un substituto completo de &pgp;.
Con &gnupg; es posible cifrar y descifrar mensajes &pgp;, importando primero
las claves viejas, pero no se pueden generar claves de &pgp;.
En este documento se demuestra cómo ampliar la distribución normal de &gnupg;
para que funcione con claves &pgp;, y muestra qué opciones deben ser usadas 
para asegurar la interoperabilidad con los usuarios de &pgp;.
También se avisa de anomalías en la interoperabilidad entre &pgp; y 
&gnupg;.
</para>
	  
<para>
<emphasis>Nota:</emphasis> El uso de los módulos de extensión
<filename>idea.c</filename> y <filename>rsa.c</filename> sin las
correspondientes licencias de estos algoritmos puede ser ilegal.
En este documento no se recomienda que se usen dichos módulos.
Si Vd. dispone de claves &pgp;, el autor sugiere que las revoque en favor 
de otras nuevas y que anime a las personas con las que mantenga 
correspondencia y que continúen usando claves &pgp;, a que hagan lo mismo.
</para>
</sect1>

<sect1>
<title>
Ampliar &gnupg; para su funcionamiento con claves &pgp;
</title>

<para>
La distribución normal de &gnupg; no funciona con claves &pgp; debido a que
&pgp; hace uso de IDEA como algoritmo de cifrado simétrico, y de RSA como
algoritmo de clave pública.
Estos dos algoritmos están patentados<footnote><para>
La patente de RSA finaliza en Septiembre de 2000.
La patente de IDEA finaliza en el año 2011.
</para></footnote>y sólo pueden ser usados bajo ciertas condiciones
restrictivas.
La política de GNU es la de no hacer uso de algoritmos patentados, dado que
éstas son una contradicción con el espíritu del &dquo;software&dquo; libre.
La utilización de estos algoritmos representa una barrera para el uso libre
de &gnupg;.
</para>

<para>
El uso de RSA e IDEA sin una licencia sobre éstos puede ser o no legal
dependiendo de varias cuestiones.
RSA sólo está patentado en los Estados Unidos, por lo tanto sí que es lícito
desarrollar versiones de RSA fuera de los EE.UU.
El módulo de extensión de RSA para &gnupg; es una de estas versiones, y en
consecuencia sí que puede ser usado legalmente fuera de los Estados Unidos,
aunque sería ilegal si lo usara dentro de este país.
En los Estados Unidos existe una implementación de referencia para RSA,
llamada RSAREF, y que se encuentra disponible por ftp en <ulink url="ftp://ftp.funet.fi/pub/crypt/cryptography/asymmetric/rsa/rsaref2.tar.gz">funet.fi</ulink>, 
o en <ulink url="ftp://non-us.debian.org/debian-non-US/dists/stable/non-US/source/rsaref_19930105.orig.tar.gz">debian.org</ulink>, y que puede usarse 
legalmente en los EE.UU. sin cargo alguno para el uso con fines no
lucrativos.
Debido a leyes que restringen la exportación de este código de los EE.UU., no
puede ser distribuido fuera de este país, y por tanto existen dos modos de
integrar RSA en &gnupg;: uno para los EE.UU. y Canadá, y otro para el resto
del mundo.
</para>

<para>
La situación de IDEA es más simple.
IDEA está patentado en Europa y en los EE.UU., y queda pendiente una patente
para Japón.
El propietario de la patente, Ascom, concede una 
<ulink url="http://www.ascom.ch/infosec/idea/licensing.html">licencia</ulink>
con fines no lucrativos gratuita, pero la definición de fines no lucrativos
es bastante estricta.
Si desea utilizar IDEA para fines comerciales necesita adquirir una licencia.
</para>

<!--
<para>
Looking at this situation one might conclude that patents on software
are not a good idea, and this is true. 
Let me say it again: Revoke
your old &pgp; keys and try to convince your communication partners to
use newer OpenPGP ones, and you will not have any problems with
patents.
</para>
-->

<para>
Para poder usar los módulos de extensión primero hay que obtener el código
fuente de éstos, <filename>idea.c</filename> y <filename>rsa.c</filename>, o
<filename>rsaref.c</filename>, del directorio de 
<ulink url="ftp://ftp.gnupg.org/pub/gcrypt/contrib/">cotribución</ulink> de
código a &gnupg;.
Una vez se tenga el código, éste debe ser compilado.
Si se usa <application>gcc</application>, la compilación será como sigue:
</para>

<screen width=80>
<prompt>alice%</prompt> <userinput>gcc -Wall -O2 -shared -fPIC -o idea idea.c</userinput>  
[...]  
<prompt>alice%</prompt> <userinput>gcc -Wall -O2 -shared -fPIC -o rsa rsa.c</userinput>  
[...] # ó
<prompt>alice%</prompt> <userinput>gcc -Wall -O2 -shared -fPIC -o rsa rsaref.c /usr/lib/rsaref.a</userinput>
 </screen>

<para>
El último argumento <filename>/usr/lib/rsaref.a</filename> se debe substituir
con el camino real de la biblioteca RSAREF en el sistema.
</para>

<para>
Una vez compilado, &gnupg; debe recibir las instrucciones para cargarlos.
Esto se puede hacer usando la opción <option>load-extension</option>, bien
desde la línea de órdenes, o bien desde el fichero de opciones, aunque por 
regla general se hará desde el fichero de opciones.
Por ejemplo, si se ha puesto los binarios compilados
<filename>idea</filename> y <filename>rsa</filename> en el directorio 
<filename>~/.gnupg</filename>, en el fichero de opciones se debe añadir
</para>

<screen width=80>
load-extension ~/.gnupg/idea  
load-extension ~/.gnupg/rsa      
</screen>

<para>
Si no se especifica un camino de modo explícito, &gnupg; busca los módulos de
extensión en el directorio de módulos de &gnupg; por definición, el cual es
<filename>/usr/local/lib/gnupg</filename>.
Si se ha compilado &gnupg; con prefijo distinto para el directorio de
instalación, usando <option>--prefix PREFIX</option> durante la configuración
del código fuente de &gnupg;, entonces el directorio de módulos será
<filename>PREFIX/lib/gnupg</filename>.
En tal caso, copiar los dos ficheros &lquo;rsa&rquo; e &lquo;idea&rquo; en el
directorio de módulos descrito arriba.
Asegúrese de que estos ficheros tienen los permisos correctos.
No es necesario hacer los ficheros ejecutables, ya que estos ficheros no son
programas sino módulos compartidos, y por tanto deben tener permiso de
lectura para todos.
</para>
</sect1>

<sect1>
<title>
Importar claves &pgp;
</title>

<para>
Una vez que las extensiones han sido cargadas, el importar un par de claves
de &pgp; es una tarea fácil usando la opción <option>import</option>.
Aun así se debe tener cuidado con un par de detalles.
</para>

<para>
<itemizedlist>
<listitem>
<para>
No se debe exportar una clave privada desde &pgp; en forma de fichero en
armadura ASCII.
Ya que &pgp; es anterior a la especificación OpenPGP, la cabecera del
mensaje en armadura que usa &pgp; no es conforme con OpenPGP.
Debido a que la exportación de una clave privada es un caso poco común,
&gnupg; no comprueba que el fichero en armadura ASCII sea una clave privada.
</para>
</listitem>

<listitem> 
<para>
&Gnupg; presupone que las claves públicas importadas van autofirmadas por sus
correspondientes claves públicas.
Esta es una precaución bastante prudente, y tanto &gnupg; como las nuevas
versiones de PGP autofirman las claves públicas durante el proceso de su
generación.
Sin embargo, &pgp; no lo hace.
Para solventarlo, se puede autofirmar la clave pública antes de exportarla
desde &pgp;.
De modo alternativo, se puede usar la opción
<option>allow-non-selfsigned-uid</option> para forzar a &gnupg; a aceptar la
clave.
Se recomienda que la clave sea autofirmada antes de ser exportada, o incluso
después de haber sido importada usando la opción anterior, ya que el uso de
una clave no autofirmada es un riesgo para la seguridad.
</para>
</listitem>
</itemizedlist>
</para>

<screen width=80>
<prompt>alice%</prompt><userinput> pgp -kx alice public.pgp</userinput> 
Pretty Good Privacy(tm) 2.6.2 - Public-key encryption for the masses. 
[...]
Extracting from key ring: '/u/alice/.pgp/pubring.pgp', userid "alice". 
Key for user ID: Alice &lt;alice@cyb.org&gt; 
1024-bit key, Key ID 24E2C409, created 1999/09/18

Key extracted to file 'public.pgp'. 

<prompt>alice%</prompt> <userinput>pgp -kx alice private.pgp .pgp/secring.pgp</userinput>
Pretty Good Privacy(tm) 2.6.2 - Public-key encryption for the masses.
[...] 

Extracting from key ring: '.pgp/secring.pgp', userid "alice".
Key for user ID: Alice &lt;alice@cyb.org&gt; 
1024-bit key, Key ID 24E2C409, created 1999/09/18 

Key extracted to file 'private.pgp'.

<prompt>alice%</prompt> <userinput>&gpg; --import public.pgp</userinput>
gpg: key 24E2C409: public key imported 
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1) 

<prompt>alice%</prompt><userinput>&gpg; --import private.pgp</userinput> 
gpg: key 24E2C409: secret key imported 
gpg: Total number processed: 1 
gpg:       secret keys read: 1 
gpg:   secret keys imported: 1
</screen>
</sect1>

<sect1>
<title>
Usar claves &pgp;
</title>

<para>
Una clave pública importada se puede usar para cifrar documentos para un
usuario de &pgp; y para verificar firmas que hayan sido generadas con una
clave privada &pgp;
<emphasis>
Es importante comprender que no es posible usar una nueva clave OpenPGP para
comunicarse con un usuario &pgp;, por tanto es necesario importar una clave
vieja &pgp; para esta tarea.
</emphasis> 
</para>

<sect2>
<title>
Cifrar un documento para un usuario de &pgp;
</title>
	  
<para>
Para cifrar un documento se usan varias opciones en la línea de órdenes, 
y el documento que se va a cifrar debe ser especificado como un fichero.
</para>

<screen width=80>
<prompt>alice%</prompt> <userinput>&gpg; --rfc1991 --cipher-algo idea --compress-algo 1 --encrypt --recipient alice secret</userinput> 
gpg:
RSA keys are deprecated; please consider creating a new key and use this key in the future 
gpg: this cipher algorithm is depreciated; please use a more standard one!
</screen>

<para>
Cada una de las opciones en la línea de órdenes son necesarias.
</para>

<itemizedlist>
<listitem>
<para>
La opción <option>rfc1991</option> se usa para forzar &gnupg; a que sea más
conforme con RFC 1991, que es la antigua especificación PGP implementada en
&pgp;.
Si se omite esta opción, la salida de &gnupg; estará malformada e
inutilizable por &pgp;.
</para>
</listitem>

<listitem>
<para>
La opción <option>cipher-algo</option> especifica el algoritmo de cifrado
simétrico con el que el documento será cifrado.
En el caso especial de cifrar un documento para una clave pública de &pgp;,
el algoritmo de cifrado que se especifique debe ser IDEA.
Si se omitiera esta opción, el documento se cifrará generalmente con 3DES, un
algoritmo que no está implementado en &pgp;.
</para>
</listitem>

<listitem> 
<para>
El algoritmo de compresión indica cómo se formará el resto de la orden.
La opción <option>compress-algo</option> especifica a &gnupg; que debe usar
el viejo algoritmo de compresión zlib, que es el usado por &pgp;.
A pesar de esto, &gnupg; usa cabeceras de longitud parcial cuando cifra una
cadena de tamaño desconocido, y esto no está implementado en &pgp;.
El documento que se vaya a cifrar debe estar por lo tanto, en un fichero de
modo que &gnupg; sepa el tamaño total del documento a cifrar antes de
comenzar.
Por consiguiente, no es posible usar tuberías al utilizar claves &pgp;.
</para>
</listitem>
</itemizedlist>
</sect2>

<sect2>
<title>
Firmar un documento para un usuario de &pgp;
</title>

<para>
Firmar un documento con una clave vieja no es diferente a hacerlo con una
clave nueva.
</para>

<!-- sign from gpg to pgp -->
<screen width=80>
<prompt>alice%</prompt> <userinput>&gpg; --local-user 0x24E2C409 --sign document</userinput> 
You need a passphrase to unlock the secret key for 
user: "Alice &lt;alice@cyb.com&gt;" 
1024-bit RSA key, ID 24E2C409, created 1999-09-18 

gpg: RSA keys are deprecated; please consider creating a new key and use this 
key in the future 
</screen>

<para>
En este ejemplo, la opción <option>local-user</option> se usa para
especificar qué clave privada se utilizará para firmar.
El fichero de salida es de la forma <filename>document.gpg</filename>.
Si la firma va a ser verificada usando &pgp;, se debe renombrar a un nombre
de fichero con la extensión <filename>.pgp</filename>.
</para>
</sect2>

<sect2>
<title>
Firmar y cifrar un documento para un usuario de &pgp;
</title>

<para>
&Gnupg; no posee una implementación nativa para firmar un documento con una
clave RSA y al mismo tiempo cifrarlo con una clave RSA.
Sin embargo es posible usar una solución que requiere que se lleven a cabo
unos cuantos pasos anteriormente.
El proceso implica la creación de una firma acompañante y a continuación el
uso de ésta para crear un fichero cifrado que pueda ser descifrado y
verificado usando &pgp;.
</para>

<para>
Hay cuatro pasos.
El primer paso genera una firma acompañante.
</para>

<screen width=80>
<prompt>alice%</prompt> <userinput>gpg --detach-signature --recipient alice --local-user 0x24E2C409 document</userinput> 

You need a passphrase to unlock the secret key for
user: "Alice &lt;alice@cyb.com&gt;"
1024-bit RSA key, ID 24E2C409, created 1999-09-18

gpg: RSA keys are deprecated; please consider creating a new key and use this
key in the future
</screen>

<para>
El segundo paso convierte el documento a un formato interno, literal, que va
descifrado.
</para>

<screen width=80>
<prompt>alice%</prompt> <userinput>gpg --store -z 0 --output document.lit document</userinput> 
</screen>

<para>
El tercer paso combina la firma acompañante con el documento literal.
Es esto lo que &pgp; usa para verificar la firma después de descifrarlo.
</para>

<screen width=80>
<prompt>alice%</prompt> <userinput>cat Notes.sig Notes.lit | gpg --no-options --no-literal --store --compress-algo 1 --output document.z</userinput> 
gpg: NOTE: --no-literal is not for normal use!
</screen>

<para>
El cuarto y último paso implica el uso de &gnupg; para descifrar el texto
plano y la firma con el objeto de producir un documento firmado y cifrado que
pueda ser descifrado y verificado por &pgp;.
</para>

<screen width=80>
<prompt>alice%</prompt> <userinput>gpg --rfc1991 --cipher-algo idea --no-literal --encrypt --recipient alice --output document.pgp document.z</userinput> 
gpg: NOTE: --no-literal is not for normal use!
gpg: RSA keys are deprecated; please consider creating a new key and use this
key in the future
gpg: this cipher algorithm is depreciated; please use a more standard one!
</screen>

<para>
El documento firmado y cifrado también puede ir en armadura ASCII mediante el
uso de las opciones de rigor.
</para>

<screen width=80>
<prompt>alice%</prompt> <userinput>gpg --rfc1991 --cipher-algo idea --no-literal --encrypt --recipient alice --output document.asc --armor document.z</userinput> 
gpg: NOTE: --no-literal is not for normal use!
gpg: RSA keys are deprecated; please consider creating a new key and use this
key in the future
gpg: this cipher algorithm is depreciated; please use a more standard one!
</screen>
</sect2>

<sect2>
<title>
Descifrar un documento &gpg;
</title>

<para>
Una clave privada importada se puede usar para descifrar documentos cifrados
para esa clave, así como generar firmas mediante el uso de esa clave.
Descifrar un mensaje no es, en este caso, más difícil que cuando se usa
cualquier otra clave.
</para>

<!-- decrypt from pgp to gpg -->
<screen width=80>
<prompt>alice%</prompt> <userinput>&gpg; secret.pgp</userinput> 

You need a passphrase to unlock the secret key for 
user: "Alice &lt;alice@cyb.org&gt;" 
1024-bit RSA key, ID 24E2C409, created 1999-09-18

gpg: NOTE: cipher algorithm 1 not found in preferences 
gpg: secret.pgp: unknown suffix 
Enter new filename [secret]: 
</screen>

<para>
De nuevo, en este caso, se puede evitar el aviso de error renombrando el 
fichero de entrada con una extensión <filename>.gpg</filename>.
Si se ve un aviso de &gnupg; del tipo &ldquo;cipher algorithm 1 not found in
preferences&rdquo;, se puede ignorar sin problemas.
</para>
</sect2>

<sect2>
<title>
Verificar una firma de &pgp;
</title>

<para>
Verificar una firma usando generada con una clave &pgp; es sencillo.
</para>

<screen width=80>
<prompt>alice%</prompt> <userinput>&gpg; document.pgp</userinput> 
gpg: document.pgp: unknown suffix
Enter new filename [document]:  
File `document' exists. Overwrite (y/N)? y 
gpg: old style (PGP 2.x) signature
gpg: Signature made Sat Sep 18 17:55:30 1999 EST using RSA key ID 24E2C409 
gpg: Good signature from "Alice &lt;alice@cyb.org&gt;"
</screen>

<para>
El diálogo para renombrar el fichero puede ser evitado si el documento que se
quiere verificar ha sido renombrado con una extensión
<filename>.gpg</filename> antes de invocar &gpg;.
</para>

</sect2>
</sect1>

<sect1 id="clearText">
<title>
Trabajar con firmas sobre texto
</title>

<para>
Desde la aparición de la versión 1.0 de &gnupg;, existe un problema con el
intercambio de documentos con firma sobre el texto entre &gnupg; y todas las
versiones de PGP.
Parece ser que las dificultades se deben a desviaciones en la implementación
de la especificación OpenPGP.
Respecto a &pgp;, las firmas generadas por éste se pueden verificar usando
&gnupg;, y las firmas generadas con &gnupg; se pueden verificar usando &pgp;.
El documento resultante del proceso de verificación será, en ambos casos,
diferente del documento original.
Estas diferencias se limitan a espacios en blanco, y por tanto no deberían
afectar la legibilidad de los documentos firmados.
En caso de que mantener la completa integridad del documento fuera de
importancia, se recomienda evitar el uso de firmas sobre texto.
En cualquier caso, se insiste una vez más en la recomendación de usar y
recomendar el uso, siempre que sea posible, de las nuevas claves OpenPGP
generadas por &gnupg;.
</para>
</sect1>

&license
</article>

