Entre muchas otros temas, el cifrado y la criptografía en general siempre me han resultado fascinantes; y más allá de sus consideraciones matemáticas por la vertiente práctica del asunto: tratar con información que sólo sea “visible” entre emisor y receptor. Como en tantas otras cosas, ¡el framework de Xojo lo pone realmente fácil!
Todos los métodos relacionados con cifrado y criptografía están recogidos en el módulo Crypto de Xojo, para los cuales se utilza de hecho la librería Crypto++ 5.6.3. A efectos prácticos esto nos permite utilizar cifrado de clave pública RSA, así como el empleo de diversos algoritmos capaces de calcular huellas únicas para la serie de datos dada, tales como Hash, MD5 o SHA.
Entre los métodos relacionados con RSA encontramos el que nos pemrite crear el par de clave Privada/Pública, comprobar la validez de una clave pública, firmar un conjunto de datos y comprobar también la validez de dicha firma y, por supuesto, cifrar y volver a “claro” (descifrar) un conjunto de datos.
Como probablemente ya sepas, en RSA la clave privada es la que se ha de mantener de forma privada (tal y como indica su nombre; es decir, a buen recaudo), mientras que pasaremos la clave pública a todas aquellas personas con las que deseemos intercambiar información de forma segura. Así, dichos usuarios podrán emplear nuestra clave pública para cifrar la información que deseen compartir con nosotros, mientras que nosotros emplearemos la clave privada para desifrar dicha informacón y que vuelva a ser legible.
RSA: Generar e intercambiar claves
Generar dicho par de claves en Xojo no puede ser más sencillo, utilizando para ello un fragmento de código como el siguiente:
Dim clavePublica As String Dim clavePrivada As String If Crypto.RSAGenerateKeyPair( 1024, clavePrivada, clavePublica ) Then msgBox “Claves generadas con éxito"
Como puedes ver, en el método RSAGenerateKeyPair pasamos como primer parámetro un número de tipo Integer (entero) con el que indicaremos la longitud (fortaleza) de la clave generada, siguiendo con los parámetros pasados por referencia correspondientes a las variables que, de tipo String, contendrán la clave Privada y Pública generadas.
(El paso de variables en las funciones por Valor o por Referencia suponen uno de los múltiples temas tratados y explicados en mi libro electrónico sobre el lenguaje de programación multiplataforma Xojo.)
Ahora bien, es más que probable que quieras utilizar dichas claves más allá del entorno de desarrollo Xojo; por ejemplo, para enviar y/o recibir información cifrada con un servidor remoto. En este caso, has de tener en cuenta que las claves generadas por Xojo están codificadas en formato hexadecimal.
¿Qué significa esto? Bien, una clave pública generada por Xojo tendrá un aspecto como el siguiente:
30819D300D06092A864886F70D010101050003818B0030818702818100B4B531D3402C250D8640E739601F01FBE8ABB39635BE1778A7F4E55C49419C0595EF5A5824EA8E7A1871FB63B8960EDBB97B08C2E7EA43229903AEBCB45B9FD9E24780B15BCADB5E026849592CC1FA9B399EBD8457CC4E7A686CF53E9146E1D867ACEB675728E8821DEDA4C2F807FD668A81601F551484C5D1334B62D5E90E33020111
Mientras que en otras librerías externas (léase por ejemplo las utilizadas mayoritariamente en entornos web), esperan encontrarse con otro formato debidamente codificada en Base64. Es decir, un formato como el siguiente:
-----BEGIN PUBLIC KEY----- MIGHAoGBALS1MdNALCUNhkDnOWAfAfvoq7OWNb4XeKf05VxJQZwFle9aWCTqjnoYcftjuJYO27l7 CMLn6kMimQOuvLRbn9niR4CxW8rbXgJoSVkswfqbOZ69hFfMTnpobPU+kUbh2Ges62dXKOiCHe2k wvgH/WaKgWAfVRSExdEzS2LV6Q4zAgER -----END PUBLIC KEY-----
Ahora bien, el paso previo a codificar la clave (ya sea pública o privada) como Base64 es convertir la codificación hexadecimal de la clave a codificación DER (Distinguished Encoding Rules), y aquí es precisamente donde han de emplearse los métodos DEREncodePrivateKey y DEREncodePublicKey en función de que deseemos codificar la clave privada o pública, respectivamente. Una vez realizado dicho paso, ya podremos codificar el resultado como Base64 sin olvidarnos de incluir la cabecera “—–BEGIN PUBLIC KEY—–“ y el pie “—–END PUBLIC KEY—–“, con sus correspondientes saltos de línea o bien “—–BEGIN CERTIFICATE—–” y “—–END CERTIFICATE—–“, siempre que se trate de una clave pública (para las claves privadas, el texto de cabecera cambia a “—–BEGIN RSA PRIVATE KEY—–” con el correspondiente “—–END RSA PRIVATE KEY—–“.
A partir de aquí, te diré que en mis pruebas con OpenSSL en combinación con PHP no he tenido mucho éxito al intentar de utilizar (léase, intercambiar) las claves pública/privada generadas por Xojo; pero sí que ha ido como la seda en cambio cuando se utiliza la librería de PHPSecLib, intercambiando en este caso las claves sin mayor problema, así como cifrando o descifrando la información entre una app cliente Xojo y el correspondiente guión PHP en remoto y viceversa.
Por último, si te interesa la criptografía en general, algunos buenos libros son Applied Cryptography y Cryptography Engineering.