lunes, 4 de febrero de 2008

Pretty Good Privacy (PGP)

JKS [jksware@gmail.com]

"Whatever you do will be insignificant, but it is very important that you do it."
"Lo sea que hagas será insignificante, pero es muy importante que lo hagas."

—Mahatma Gandhi

"Cuando Julio César enviaba mensajes a sus generales, el no confiaba en sus mensajeros. Así que reemplazaba cada A en sus mensajes con una D, cada B con una E, y así sucedía con todo el alfabeto. Sólo alguno que conociera el "desplazamiento de 3" podía descifrar el mensaje."

Con estas palabras de Mahatma Gandhi y el relato del cayo comienza el manual que trae consigo el instalador de PGP, aplicación y protocolo para el e-mail seguro y la encriptación de ficheros, de PGP Enterprise, titulado Intro to Crypto.

Pero evidentemente el César, en nuestros días, hubiera perdido por completo su tiempo en el jueguito de cambiar cada letra por una que venga tres posiciones más atrás en el alfabeto, ya que si el mensaje codificado hubiera caído en nuestras manos, todo lo que teníamos que hacer era un bucle que probara una a una las posibles combinaciones en las que se podía codificar un mensaje, si de a 3, de a 4, 5, 6, hasta agotar el número de símbolos del alfabeto y mostrar los resultados. Para el ambiente computacional moderno, este "alfabeto" a menudo es el ASCII (un byte ó 256 valores), y si se hiciera lo mismo obtendríamos 255 resultados inválidos para el mensaje del Cayo y sólo 1 verdadero, mensaje que se podría procesar por criptoanálisis, entero, en milisegundos, aunque haya sido todo un discurso.

Y es que la criptografía, ciencia que usa la matemática para encriptar y decriptar – codificar y decodificar – datos, ha avanzado mucho pareja del criptoanálisis desde la época del Imperio Romano. Ahora en vez de sustituir una letra por el que viene tres posiciones detrás, se sustituye por otro que tiene una relación matemática complejísima, y – prácticamente – indescifrable, con el original, pero que si se conoce el algoritmo matemático que da pie a esta relación, entonces se es capaz con facilidad de trasladar el código a un término entendible o viceversa.

PGP – Pretty Good Privacy traducido al cubano significa "ya no vas a poder tocar mis cosas" – es un programa de computadora que usa algoritmos bien conocidos y respetados para proteger los ficheros y correos electrónicos de ser, primeramente, leídos o decodificados por intrusos, y segundo, se haga uso de un nombre o e-mail falso o una persona se haga pasar por otra para firmar determinado contenido digital – de la cual se deriva la técnica de suplantación de identidad denominada phising.

Phil Zimmermann creó el PGP en la década del 90 del pasado siglo para darle un uso comercial a la misma, pero decidió liberar el programa escrito en C++ que hacía uso del susodicho protocolo, cuando las agencias del gobierno comenzaron a investigarlo por violar una ley que prohibía la exportación de armamento militar – ya que los algoritmos de encriptación con claves de 64, 128 y 168 bits como las que usa PGP se consideraban secreto de estado – para que dicho formato de codificación y encriptación no se hiciera público.

El PGP protege la confidencialidad de los datos personales o empresariales mediante el uso de una ingeniosa combinación de sistemas de encriptación de probada seguridad, donde, usando el sistema de clave pública, se dota al usuario de una llamada clave privada con la cual este podrá decodificar un archivo enviado para un determinado grupo de personas, además de una clave pública sin la cual no se podría codificar una información para determinado grupo de personas.

CLAVES, ALGORITMOS Y NÚMEROS PRIMOS

Cuando se habla en el argot informático de encriptar determinado fichero, probablemente un documento, se está hablando de hacer lo más difícil posible – matemáticamente hablando – de poder tener acceso al texto plano original sin que se cuente con una clave para decodificarlo. El texto en plano – aunque no es necesariamente texto del que se guarda en un txt – no es más que un conjunto de datos determinados que poseen valor numérico al que se le pueda atribuir un símbolo fijo. Por ejemplo, en código ASCII – y vale aclarar que ASCII no es un código ni un algoritmo de encriptación, sino el formato de representación de símbolos más común en las PCs – A es siempre representación de 65, B de 66, C de 67, y así sucesivamente pasando por los dígitos del 0 al 9 y todos los símbolos que aparecen en un teclado QWERTY – de nuevo aclarar que esto no es un tipo especial de teclado :D.

Sin embargo, si se fuera a hacer un desplazamiento de 3, como también se conoce a la codificación del César, A sería representada por 68, B por 69 y C por 70. Este método es muy fácil de aprender y usar por su simplicidad algorítmica y matemática, que consiste para codificar en:

F(x) = x + 3, donde X es el símbolo a codificar.

Con algo muy parecido a eso, ya estamos haciéndole perder el sueño a más de una persona, pero no aquella que conozca de criptoanálisis, ya que con hacer para decodificar

F(x) = x – 3

ya tenemos de nuevo el texto en plano. No hay que ser un genio del álgebra para darse cuenta de que lo mismo sucederá si sustituimos ése 3 que aparece en la fórmula por otro cualquiera, ya que el número de combinaciones que este método puede dar de resultado es igual al alfabeto con que se cuente.

La tarea se complica de prisa si hacemos algo igual a – discúlpenme a los que no sepan Pascal, lo voy a tratar de hacer lo más entendible posible – :

function Codifica(plaintext: string): string;
var
  i: integer;
  paso: byte;
begin
  SetLength(result, length(plaintext));
  for i := 0 to Length(plaintext) do
    begin
    Paso := i mod high(byte);
    Result[i] := chr( ( ord(Plaintext[i]) + Paso ) mod high(byte) );
  end;
end;

Esto significa más o menos que en vez de sumar una cantidad fija – en los ejemplos anteriores 3 al valor del símbolo – se suma una cantidad que está en dependencia del valor de la posición del carácter en el texto y del valor que se le quiera agregar a la variable Paso por cada una de las iteraciones, en este ejemplo, el resto de la división de la posición del carácter Plaintext[i] con el valor máximo de un byte, 256. A decir verdad, este algoritmo que parece súper sofisticado no da muchas más combinaciones que el anterior.

Una vez introducidos en lo que sería la base de cualquier algoritmo de encriptación, cambiar un símbolo por otro en dependencia del valor de la llave, y de cualquier otra variable matemática que pueda hacer más compleja la desencriptación, decodificación, o como quiera que se le quiera llamar, nos queda averiguar qué es una clave pública.

SISTEMA DE CLAVE PÚBLICA

Con los algoritmos clásicos de encriptación podemos encriptar y desencriptar usando la misma clave, es decir, el mismo número esencial que nos permite convertir un texto plano en uno codificado mediante un algoritmo. Pero tener una misma clave para ambos procesos compromete mucho la calidad y seguridad de la información que se este transmitiendo, dado que la seguridad con que podamos contar en un sistema de este tipo es directamente proporcional a lo secreta que sea esta clave.

Por tanto si se quiere transmitir un mensaje de una persona a otra, no hay más que hacer llegar la clave a la otra persona y ya se estará estableciendo una comunicación. Pero aquí es donde está la vulnerabilidad del proceso, ¿cómo transmitir una clave por un medio que se sabe que es inseguro?

Pero las ecuaciones matemáticas hacen maravillas del sistema, y establecen que no es necesario encriptar y desencriptar usando la misma clave, ya que se usan dos algoritmos totalmente distintos para los dos procesos. En un sistema de clave pública, como se le llama a este tipo de algoritmos de encriptación, se usa dos claves, como se explicaba en los párrafos anteriores.

Cada clave responde a una ecuación determinada, y la clave pública, por ejemplo, que sirve para encriptar los contenidos que se le enviarán a cierta persona, no se podrá usar para desencriptarlos.

Cada usuario tiene un par de claves, una privada y otra pública. La pública, tal cual su nombre lo indica, se transfiere por lo general a un servidor de claves públicas que se encarga de ponerla "al aire libre" para que cualquier persona que requiera enviar información clasificada al propietario de la misma, se haga de ella y envíe determinado contenido de manera segura. A su vez, el receptor de la información, está en la necesidad de usar su clave privada para desencriptar la información que otro envió a su nombre. Por supuesto esta última clave debe permanecer en el más absoluto secreto.

Si bien toda estas palabras puedan resultar crípticas en un momento dado, resulta muy fácil de entender cuando se analizan este par de gráficos – horriblemente saqueados de Intro to Crypto – que ilustran muy bien el proceso de encriptación y desencriptación, usando ambos sistemas, el clásico de una sola clave, y el de clave pública.

Si desea descargar PGP, visite la página: www.pgpi.com.
Página de Philip Zimmermann de la MIT en español: http://www.mit.edu/~prz/ES/index.html

En próximos artículos se hablará acerca de los algoritmo que usa PGP para encriptar los archivos, que por lo general son muy grandes para codificarlos en su totalidad usando el mismo sistema, de cómo estos dos sistemas – clásico y de clave pública – se combinan y de la utilidad que tiene esto en nuestros servidores de correos no solo para que nuestros mensajes de e-mail no sean leídos por quien no deben, sino de cómo se utiliza esto como una muy eficaz técnica antispam, actualmente utilizada por Gmail y por Yahoo!.

Sistema clásico

Sistema de clave pública



Artículos relacionados


No hay comentarios: