anterior índice siguiente

Apéndice A. La obsoleta EVP_BytesToKey()

Lo primero de todo: EVP_BytesToKey() está obsoleta. Esta función se implementó en SSLeay para derivar claves a partir de passwords introducidas por el usuario. Pese a que la función sigue formando parte de las distribuciones de la librería (incluso muchas de las aplicaciones del intérprete la utilizan) las PBE routines deben utilizarse en su lugar.

Veamos el prototipo:

  • int EVP_BytesToKey (const EVP_CIPHER *type, EVP_MD *md, const unsigned char *salt, const unsigned char *data, int datal, int count, unsigned char *key, unsigned char *iv)

Esta función está basada en el PKCS#5 (Password-Based Cryptography Standard). Si se siente con fuerzas puede pegarle una leída, pero tampoco es esencial para comprender el funcionamiento de la función.

La idea es generar una clave (key) y un vector de inicialización (iv) si procede, a partir de unos datos de entrada (data), de una función hash (md) y, opcionalmente, de un salt (un vector de 8 bytes).

EVP_BytesToKey() devuelve siempre la longitud de la clave correspondiente al algoritmo especificado en type. Además, si data es NULL, devuelve este valor sin realizar ninguna otra operación. Por otro lado, el parámetro salt es opcional. Veamo, a nivel de curiosidad, el algoritmo de la función. Pero antes un inciso sobre la notación empleada:


md_buf = H (data + salt)

MIENTRAS cierto HACER

   PARA i = 1 HASTA count-1 HACER
      md_buf = H (md_buf)
   FINPARA

   SI key no completa ENTONCES
      key = bytes de md_buf
   FINSI

   SI iv no completo ENTONCES
      iv = bytes de md_buf
   FINSI

   SI iv Y key completos ENTONCES
      SALIR del MIENTRAS
   SINO
      md_buf = H (md_buf + data + salt)
   FINSI

FIN MIENTRAS

Algoritmo 1. Algoritmo de la función EPV_BytesToKey().

A la vista del algoritmo uno puede entender perfectamente los parámetros que se pasan a la función. Como se puede apreciar, la clave y el vector de inicialización se crean calculando repetidas veces la función hash que se especifica como parámetro de entrada hasta que tenemos el número de bytes suficientes tanto en key como en iv. Obviamente si el parámetro salt es NULL, no se tiene en cuenta, siendo el parámetro data fundamental para la función.


<!--#include file="ejemplos/apendice_a/EVP_apendice_a_e1.c" -->

Ejemplo 1. Generamos clave y vector de inicialización para triple DES.

Este ejemplo genera una clave y un vector de inicialización para el algoritmo triple DES en modo ofb. Si recuperara el valor devuelto por EVP_BytesToKey() comprobará que la longitud de dicha clave es de 24 bytes. Con esto queremos decir que no va a ser necesario realizar tres llamadas a EVP_BytesToKey() para obtener las tres claves utilizadas por el algoritmo puesto que estas ya se han introducido en el buffer clave.

Lo que hemos visto únicamente nos va a permitir derivar claves para algoritmos con longitud de clave fija y para los algoritmos de clave variable únicamente para las longitudes de clave por defecto.


anterior índice siguiente