验证 "PKCS5_PBKDF2_HMAC" 正在生成所需的密钥字节
Verify "PKCS5_PBKDF2_HMAC" is generating required byte of key
“PKCS5_PBKDF2_HMAC”oppenssl api.
生成的密钥长度不正确
我希望密钥的长度为 32(即 32*8 = 256 位)。
我是不是做错了什么或遗漏了什么?
unsigned char key[32];
bzero(key,sizeof(key));
const char * password1 = "locpasswordkey";
size_t plen = strlen(password1);
const char * salt = "fixedsaltlengthsforenc";
size_t slen = strlen(salt);
if(PKCS5_PBKDF2_HMAC(password1, (int)plen, (const unsigned char *)salt, (int)slen,65536, EVP_sha256(), (int)sizeof(key), key) == 0)
{
cout << "PKCS5_PBKDF2_HMAC_KEY() failed" << endl;
}
cout << "KeyLen: " << strlen(key) << endl
我们如何确定“PKCS5_PBKDF2_HMAC”正在生成所需的位密钥。
我正在使用此密钥执行解密,但“EVP_CIPHER_CTX_set_key_length”函数报告以下错误
错误:0607A082:数字信封 routines:EVP_CIPHER_CTX_set_key_length:invalid 密钥 length:evp_enc.c:651:
下面是我的解密函数
std::string decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key, unsigned char *iv ) {
EVP_CIPHER_CTX *ctx;
int len;
int plaintext_len;
unsigned char* plaintext = new unsigned char[ciphertext_len];
bzero(plaintext,ciphertext_len);
if(!(ctx = EVP_CIPHER_CTX_new())) handleOpenSSLErrors();
if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv))
handleOpenSSLErrors();
EVP_CIPHER_CTX_set_key_length(ctx, EVP_MAX_KEY_LENGTH);
if(1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len))
handleOpenSSLErrors();
plaintext_len = len;
if(1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len)) handleOpenSSLErrors();
plaintext_len += len;
plaintext[plaintext_len] = 0;
EVP_CIPHER_CTX_free(ctx);
std::string ret = (char*)plaintext;
delete [] plaintext;
return ret;
}
任何想法都会有所帮助。
是的,您对 PKCS5_PBKDF2_HMAC
的使用是正确的,完全不会导致您的错误。
首先,要使用 _set_key_length
,您需要拆分 Init,以便您可以设置算法,然后是密钥长度,然后是密钥。参见例如 and (请注意,用于 Blowfish,它是可变密钥;OpenSSL EVP 中的 AES 不是)。
但是,如果您使用的是 OpenSSL 1.0.1 或更高版本(您可能正在使用),EVP_MAX_KEY_LENGTH
是 64,并且 64 字节不是 AES 的有效密钥大小,更不用说 EVP_aes_256_cbc
因为你在这里有一个固定大小的实例化,而且 64 也不是你实际密钥的大小,所以即使它以某种方式接受你的调用它也会使用垃圾数据作为密钥并产生完全错误和无用的结果。
不要那样做。
“PKCS5_PBKDF2_HMAC”oppenssl api.
生成的密钥长度不正确我希望密钥的长度为 32(即 32*8 = 256 位)。
我是不是做错了什么或遗漏了什么?
unsigned char key[32];
bzero(key,sizeof(key));
const char * password1 = "locpasswordkey";
size_t plen = strlen(password1);
const char * salt = "fixedsaltlengthsforenc";
size_t slen = strlen(salt);
if(PKCS5_PBKDF2_HMAC(password1, (int)plen, (const unsigned char *)salt, (int)slen,65536, EVP_sha256(), (int)sizeof(key), key) == 0)
{
cout << "PKCS5_PBKDF2_HMAC_KEY() failed" << endl;
}
cout << "KeyLen: " << strlen(key) << endl
我们如何确定“PKCS5_PBKDF2_HMAC”正在生成所需的位密钥。
我正在使用此密钥执行解密,但“EVP_CIPHER_CTX_set_key_length”函数报告以下错误
错误:0607A082:数字信封 routines:EVP_CIPHER_CTX_set_key_length:invalid 密钥 length:evp_enc.c:651:
下面是我的解密函数
std::string decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key, unsigned char *iv ) {
EVP_CIPHER_CTX *ctx;
int len;
int plaintext_len;
unsigned char* plaintext = new unsigned char[ciphertext_len];
bzero(plaintext,ciphertext_len);
if(!(ctx = EVP_CIPHER_CTX_new())) handleOpenSSLErrors();
if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv))
handleOpenSSLErrors();
EVP_CIPHER_CTX_set_key_length(ctx, EVP_MAX_KEY_LENGTH);
if(1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len))
handleOpenSSLErrors();
plaintext_len = len;
if(1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len)) handleOpenSSLErrors();
plaintext_len += len;
plaintext[plaintext_len] = 0;
EVP_CIPHER_CTX_free(ctx);
std::string ret = (char*)plaintext;
delete [] plaintext;
return ret;
}
任何想法都会有所帮助。
是的,您对 PKCS5_PBKDF2_HMAC
的使用是正确的,完全不会导致您的错误。
首先,要使用 _set_key_length
,您需要拆分 Init,以便您可以设置算法,然后是密钥长度,然后是密钥。参见例如
但是,如果您使用的是 OpenSSL 1.0.1 或更高版本(您可能正在使用),EVP_MAX_KEY_LENGTH
是 64,并且 64 字节不是 AES 的有效密钥大小,更不用说 EVP_aes_256_cbc
因为你在这里有一个固定大小的实例化,而且 64 也不是你实际密钥的大小,所以即使它以某种方式接受你的调用它也会使用垃圾数据作为密钥并产生完全错误和无用的结果。
不要那样做。