¿Hay alguna API de C en openssl para derivar una clave de una cadena dada?

Necesito una API de C en la biblioteca openssl para derivar la clave de una cadena dada. ¿Dónde puedo obtener código fuente de ejemplo para esto?

Un algoritmo estándar para hacer esto es PBKDF2 (un acrónimo de la función de derivación de clave basada en contraseña, versión 2 ). Hay una implementación de PBKDF2 en OpenSSL, declarada en openssl/evp.h :

 int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen, unsigned char *salt, int saltlen, int iter, int keylen, unsigned char *out); 

Cuando está generando una nueva clave, debe usar RAND_bytes() de openssl/rand.h para crear el salt. iter es el recuento de iteraciones, que debe ser tan grande como su aplicación intencional pueda tolerar, al menos algo así como 20,000.

Encontré un ejemplo sobre cómo generar una clave a partir de una contraseña. El ejemplo data de 2008, por lo que puedo decir, esto aún no está documentado en OpenSSL. Así que permítame publicar la fuente de ejemplo completa para ayudar a todas esas almas pobres que intentan usar la API de OpenSSL.

Tenga en cuenta que este NO es mi código, ¡viene de Marek Marcola! Todos los créditos son para él.

 /* * Example program on how to derive an encryption key from a password * corresponding to the RFC2898 / PBKDF2 standard. * Found in a 2008 mailing list posted by Marek Marcola: * http://www.mail-archive.com/openssl-users@openssl.org/msg54143.html */ #include  #include  #include  #include  int print_hex(unsigned char *buf, int len) { int i; int n; for(i=0,n=0;i 7){ printf("\n"); n = 0; } printf("0x%02x, ",buf[i]); n++; } printf("\n"); return(0); } int main() { char *pass = "password"; char *salt = "12340000"; int ic = 1; unsigned char buf[1024]; ic = 1; PKCS5_PBKDF2_HMAC_SHA1(pass, strlen(pass), (unsigned char*)salt, strlen(salt), ic, 32+16, buf); printf("PKCS5_PBKDF2_HMAC_SHA1(\"%s\", \"%s\", %d)=\n", pass, salt, ic); print_hex(buf, 32+16); ic = 1; EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), (unsigned char*)salt, (unsigned char*)pass, strlen(pass), ic, buf, buf+32); printf("EVP_BytesToKey(\"%s\", \"%s\", %d)=\n", pass, salt, ic); print_hex(buf, 32+16); return(0); }