Есть ли C API в openssl для получения ключа из заданной строки - PullRequest
6 голосов
/ 21 июля 2011

Мне нужен C API в библиотеке openssl для получения ключа из заданной строки.Где я могу получить образец исходного кода для этого?

Ответы [ 2 ]

5 голосов
/ 28 июля 2011

Стандартным алгоритмом для этого является PBKDF2 (сокращение от Функция определения ключа на основе пароля версии 2 ).Существует реализация PBKDF2 в OpenSSL, объявленная в 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);

Когда вы генерируете новый ключ, вы должны использовать RAND_bytes() из openssl/rand.h для создания соли.iter - это число итераций, которое должно быть настолько большим, насколько допустимо для вашего предполагаемого приложения - по крайней мере, примерно 20 000.

0 голосов
/ 14 июня 2013

Я нашел пример о том, как сгенерировать ключ из пароля.Пример датируется 2008 годом, насколько я могу судить, это все еще не документировано в OpenSSL.Итак, позвольте мне опубликовать полный пример исходного кода, чтобы помочь всем тем беднягам, которые пытаются использовать API OpenSSL.

Обратите внимание, что это НЕ мой код, он исходит от Марека Марколы!Все кредиты причитаются ему.

/*
 * 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 <string.h>

#include <openssl/x509.h>
#include <openssl/evp.h>
#include <openssl/hmac.h>

int print_hex(unsigned char *buf, int len)
{
    int i;
    int n;

    for(i=0,n=0;i<len;i++){
        if(n > 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...