anterior | índice | siguiente |
Hasta ahora todos nuestros ejemplos de cifrado simétrico han utilizado claves generadas aleatoriamente mediante la librería RAND de OpenSSL. De esta forma, por ejemplo, las envelope encryption routines generan una clave de sesión. Sin embargo, en muchas ocasiones, resulta conveniente cifrar/descifrar una entrada utilizando una password introducida por el usuario, de la cual se derivará una clave mediante una función de derivación de claves.
El tema del Password Based Encryption se aborda en los estándares PKCS#5 y PKCS#12 (éste únicamente describe una función de derivación de claves en el apartado B). Una rápida leida a los mismos ayudará a entender los conceptos que aquí se utilizan. En particular, OpenSSL implementa las recomendaciones del PKCS#5 v. 1.5, PKCS#5 v. 2.0 y PKCS#12. Nosotros nos centraremos en como llevar a cabo las recomendaciones del PKCS#5 v. 2.0. En el apéndice B abordaremos para las otras dos.
Muy bien, entremos en materia. Hasta ahora hemos utilizado la función EVP_EncryptInit() (o EVP_CipherInit() ) para inicializar un contexto de encriptación. Dicha función toma directamente la clave que se utilizará en el proceso de encriptación o desencriptación. Lo evidente sería: ¿por qué no una función que inicialice el contexto utilizando una password ? La evidencia :-P
|
La evidencia deja de serlo cuando vemos los parámetros pbe_obj y param. El primero especifica el algoritmo que se va a utilizar en el cifrado/descifrado y el segundo los parámetros necesarios para la derivación de la clave: salt, iteration count, etc. Ambos parámetros se encapsulan en la estructura de datos X509_ALGOR definida en el header x509.h. Podemos decir que X509_ALGOR es un identificador de algoritmo. Así pues, antes de poder inicializar un contexto debemos iniciailizar un identificador de algoritmo. ¿Cómo? Con la función siguiente.
|
Describamos los parámetros:
Es necesario alimentar el generador de números aleatorios. Puede consultar el tutorial sobre OpenSSL/RAND para ver cómo. Ya está bien de rollos, ¿no?
|
Ejemplo 1. Inicializamos un contexto para encriptación en base al PKCS#5 v. 2.0.
Este ejemplo se limita a inicializar un contexto de encriptación para encriptar. OpenSSL utiliza varias tablas internas de algoritmos (de encriptación y funciones hash). Dicha tabla debe ser inicializada por el programador utilizando la función que estamos tratando. El motivo es muy simple: ciertas funciones de OpenSSL identifican los algoritmos a utilizar por nombre buscando en las tablas. Si no están inicializadas obtendremos un error (un error muy frecuente, por cierto).
Resaltemos dos puntos:
Lo importante del ejemplo anterior es que comprenda cómo obtener los parámetros pbe_obj y param de la función de inicialización EVP_PBE_CipherInit() puesto que, como ya dijimos, el proceso de encriptación es idéntico al caso de cifrado simétrico. Veámoslo con otro ejemplo.
|
Ejemplo 2. Encriptamos una cadena de caracteres.
Fácil, ¿no? ¿Desencriptamos? Vamos allá...
|
Ejemplo 3. Desencriptamos la cadena de caracteres.
anterior | índice | siguiente |