Existe-t-il une API C dans openssl pour dériver une clé d’une chaîne donnée?

J’ai besoin d’une API C dans la bibliothèque openssl pour dériver la clé à partir d’une chaîne donnée. Où puis-je obtenir un exemple de code source pour cela?

Un algorithme standard pour ce faire est PBKDF2 (acronyme de fonction de dérivation de clé basée sur le mot de passe version 2 ). Il existe une implémentation de PBKDF2 dans OpenSSL, déclarée dans 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); 

Lorsque vous générez une nouvelle clé, vous devez utiliser RAND_bytes() partir de openssl/rand.h pour créer le sel. iter est le nombre d’itérations, qui devrait être aussi grand que votre application envisagée peut tolérer – au moins quelque chose comme 20 000.

J’ai trouvé un exemple sur la façon de générer une clé à partir d’un mot de passe. L’exemple date de 2008, pour autant que je sache, cela n’a toujours pas été documenté dans OpenSSL. Alors laissez-moi vous poster la source d’exemple complète pour aider toutes ces pauvres âmes qui essaient d’utiliser l’API OpenSSL.

S’il vous plaît noter que ce n’est pas mon code, il vient de Marek Marcola! Tous les crédits lui sont dus.

 /* * 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/[email protected]/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); }