openssl中是否有从给定字符串派生密钥的C API

openssl中是否有从给定字符串派生密钥的C API,c,openssl,C,Openssl,我需要openssl库中的一个C API,用于从给定字符串派生密钥。从哪里可以获得此示例的源代码?执行此操作的标准算法是PBKDF2(基于密码的密钥派生函数版本2的首字母缩写)。OpenSSL中有一个PBKDF2的实现,在OpenSSL/evp.h中声明: int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen, unsigned char *salt, int saltlen, in

我需要openssl库中的一个C API,用于从给定字符串派生密钥。从哪里可以获得此示例的源代码?

执行此操作的标准算法是PBKDF2(基于密码的密钥派生函数版本2的首字母缩写)。OpenSSL中有一个PBKDF2的实现,在
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);
生成新密钥时,应使用
openssl/RAND.h
中的
RAND\u bytes()
创建salt
iter
是迭代次数,它应该是预期应用程序所能容忍的最大值-至少大约20000次。

我发现了如何从密码生成密钥。这个例子可以追溯到2008年,据我所知,它仍然没有在OpenSSL中记录。因此,让我发布完整的示例源代码,以帮助所有尝试使用OpenSSL API的可怜人

请注意,这不是我的代码,它来自Marek Marcola!所有的学分都是他应得的

/*
 * 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);
}
/*
*关于如何从密码派生加密密钥的示例程序
*对应于RFC2898/PBKDF2标准。
*在Marek Marcola发布的2008年邮件列表中找到:
* http://www.mail-archive.com/openssl-users@openssl.org/msg54143.html
*/
#包括
#包括
#包括
#包括
int print_hex(无符号字符*buf,int len)
{
int i;
int n;
对于(i=0,n=0;i 7){
printf(“\n”);
n=0;
}
printf(“0x%02x,”,buf[i]);
n++;
}
printf(“\n”);
返回(0);
}
int main()
{
char*pass=“password”;
char*salt=“12340000”;
int ic=1;
无符号字符buf[1024];
ic=1;
PKCS5_PBKDF2_HMAC_SHA1(通行证,strlen(通行证),(未签名字符*)盐,strlen(盐),ic,32+16,buf);
printf(“PKCS5\u PBKDF2\u HMAC\u SHA1(\%s\,\%s\,%d)=\n”,通过,盐,ic);
打印十六进制(buf,32+16);
ic=1;
EVP_BytesToKey(EVP_aes_256_cbc(),EVP_sha1(),(无符号字符*)salt,(无符号字符*)pass,strlen(pass),ic,buf,buf+32);
printf(“执行副总裁BytesToKey(\%s\,\%s\,%d)=\n”、通过、salt、ic);
打印十六进制(buf,32+16);
返回(0);
}

您是指针对C的openssl API吗?我认为OpenSSL是一个具有一些API函数的库。如果我错了,请纠正我你的绳子是什么样子的?你能举个例子吗?什么样的钥匙?是否要基于某些文本密码生成对称加密密钥?例如?如何从中获取IV?@user465139:如果没有,您可以使用另一个调用
RAND_bytes()
来生成IV。@caf依赖RAND_bytes生成IV安全吗?openssl在内部是否有不同之处?@saruftw:是的,它是安全的,RAND_bytes是CSPRNG。用于某些内部组件。以前使用MD5,1.1.0切换到SHA256。请注意,此更改不会影响
EVP\u BytesToKey
openssl enc
等命令。