miércoles, 15 de febrero de 2017

Desencriptando archivos con clave simétrica de GnuPG con BouncyCastle (OpenPGP)

Si se tiene un archivo ".gpg", es decir, encriptado con GnuPG con la opción --symetric (encriptado simétrico), y se lo quiere desencriptar utilizando BouncyCastle for Java, aquí se presentará un set de herramientas/programas, y el procedimiento para instalarlos y ejecutarlos.

Se requiere Java 8 Development Kit, Maven y conexión a Internet, o en su defecto, a una Intranet donde sea accesible un repositorio Maven local que contenga los artefactos de BouncyCastle y sus dependencias.

El package Bouncy Castle para Java implementa el estándar OpenPGP, al cual la herramienta GnuPG adhiere. Por lo tanto, ambos programas, GnuPG y BouncyCastle, pueden cualquiera de ellas encriptar y desencriptar un archivo que haya sido creado con la otra herramienta.

El package de BouncyCastle Viene con ejemplos de clases stand alone (con el método main()), y son muy simples de invocar desde la línea de comandos, pudiendo ver en el mismo código fuente los parámetros que hay que pasarle según la operación que se quiere realizar. En nuestro caso, la clase de ejemplo a invocar será com.example.PBEFileProcessor, y los parámetros serán (sin comillas) "-d" para desencriptar, el nombre del archivo encriptado con la opción --symetric de gpg, y la contraseña simétrica.

Además, hay otro package que separa estos ejemplos y los empaqueta en un artefacto de Maven. Mientras que el package original (BouncyCastle) está pensado para usarse como librería en un programa que la incluya, este nuevo artefacto Maven sirve para ejecutarse directamente desde línea de comando. Obviamente va a depender de la librería BouncyCastle, ya que mientras que este artefacto es un front end de línea de comando, es la librería quien resuelve la "parte pesada" del trabajo criptográfico.

Maven por su parte, puede pensarse de alguna manera como un asistente para instalar aplicaciones Java.

Los pasos a seguir serían:

Bajar el package openpgp-bc-examples, simplemente buscar la opción para descargarse un .zip. Descomprimirlo.
También descargarse un .zip de BouncyCastle para Java. Descomprimirlo.
En la página de openpgp-bc-examples explica cómo se hizo para extraer los ejemplos en un package separado, en el párrafo titulado "How this repository was created". Siguiendo de esa explicación el criterio de renombrar la declaración del "package" de Java, hay que pasar de BouncyCastle, todos los archivos que están en pg/src/main/java/org/bouncycastle/openpgp/examples a la carpeta com/examples de openpgp-bc-examples.

Ya se puede instalar y ejecutar la aplicación, siguiendo los pasos que se explican en la misma página openpgp-bc-examples, con la particularidad de que si se desconoce cómo direccionar, estando bajo Windows, el archivo "classpath.txt" ahí mostrado, se puede abrir con un notepad y copiar su contenido en la línea de comando de la ejecución.

Si el sistema tiene otras versiones de Java Development Kit además de la 8, y esta no es la predeterminada, bastará con setear, solamente en la sesión de línea de comando abierta, las variables JAVA_HOME y PATH con los valores apropiados. La forma bajo Windows sería: set JAVA_HOME=path a Java 8, y set PATH=path a Java8/bin;%PATH%

La invocación tendrá esta forma:
java -classpath <path openpgp-bc-examples>/target/<jar open-bc-examples> com.example.PBEFileProcessor -d archivo_encriptado.gpg Contraseña

Para no tener que pasar la contraseña por línea de comando, habría que modificar el programa Java para que use un método más seguro para la lectura de contraseñas. El apéndice D de la especificación de Java Cryptographic Architecture tiene un programa de ejemplo de lectura de contraseñas que se podría utilizar para tal fin. Habría que incorporarlo de alguna forma dentro de los programas del package com.example. Dentro de la misma especificación de Java Crtptographic Architecture, hay ejemplos de cómo usarlo, en la sección Example Codes, subsección Using Password-Based Encryption.

Espero que sirva.