C++ C++;PBKDF2问题

C++ C++;PBKDF2问题,c++,hash,pbkdf2,C++,Hash,Pbkdf2,我有以下功能: void PBKDF2_HMAC_SHA_512_string(const char* pass, const char* salt, int32_t iterations, uint32_t HashLength, char* out) { unsigned int i; HashLength = HashLength / 2; unsigned char* digest = new unsigned char[HashLength]; PKCS

我有以下功能:

void PBKDF2_HMAC_SHA_512_string(const char* pass, const char* salt, int32_t iterations, uint32_t HashLength, char* out) {
    unsigned int i;
    HashLength = HashLength / 2;
    unsigned char* digest = new unsigned char[HashLength];
    PKCS5_PBKDF2_HMAC(pass, strlen(pass), (const unsigned char*)salt, strlen(salt), iterations, EVP_sha512(), HashLength, digest);
    for (i = 0; i < sizeof(digest); i++) {
        sprintf(out + (i * 2), "%02x", 255 & digest[i]);
    }
}

由于
摘要
是一个
指针
sizeof(摘要)
不会给出数组的长度。根据不同的平台,
sizeof(digest)
可能会为您提供4或8,这不是您想要的。也许您应该使用
for(i=0;i


另一个与代码无关的问题是,
摘要
未在
PBKDF2_HMAC_SHA_512_字符串
中删除,这会导致
内存泄漏
,因为
摘要
是一个
指针
sizeof(摘要)
不会给出数组的长度。根据不同的平台,
sizeof(digest)
可能会为您提供4或8,这不是您想要的。也许您应该使用
for(i=0;i



另一个与代码无关的问题是,
digest
没有在
PBKDF2_HMAC_SHA_512_string
中删除,这会导致
内存泄漏

我想你对PBKDF2的工作原理有误解,我建议你先研究一下。@Mgetz,在我看来,我知道它是如何工作的。我让它返回1024长度的字符串,但是我切换到MSVC,现在它继续返回16长度的字符串?那么这是怎么发生的呢?我对PBKDF2有什么误解?“派生密钥将被写入out。out缓冲区的大小是通过keylen指定的”缓冲区的大小不是基于哈希的结果密钥的大小。不同之处在于,在大多数情况下,当使用
new
和数组语法时,windows会将内存归零,或者您碰巧得到一个以前归零过的页面。旁注:这始终是一个变量,因为散列可以返回空字节,您不能对它们使用
strlen
。@Mgetz,对。那么我该如何解决这个问题呢?我确实更改了摘要初始化,以便使用MSVC从
unsigned char*digest[HashLength]编译
into
unsigned char*digest=新的unsigned char[HashLength]
。这就是导致我出现这种意外行为的原因吗?我想你对PBKDF2的工作原理有误解,我建议你先研究一下。@Mgetz,我认为我知道它是如何工作的。我让它返回1024长度的字符串,但是我切换到MSVC,现在它继续返回16长度的字符串?那么这是怎么发生的呢?我对PBKDF2有什么误解?“派生密钥将被写入out。out缓冲区的大小是通过keylen指定的”缓冲区的大小不是基于哈希的结果密钥的大小。不同之处在于,在大多数情况下,当使用
new
和数组语法时,windows会将内存归零,或者您碰巧得到一个以前归零过的页面。旁注:这始终是一个变量,因为散列可以返回空字节,您不能对它们使用
strlen
。@Mgetz,对。那么我该如何解决这个问题呢?我确实更改了摘要初始化,以便使用MSVC从
unsigned char*digest[HashLength]编译
into
unsigned char*digest=新的unsigned char[HashLength]
。这就是我做出这种意想不到的行为的原因吗?@TVAvanHesteren,我不明白。你所说的变化摘要[i]是什么意思,我看不出它在循环中发生了变化。@TVAvanHesteren,我想你不需要改变其他任何东西。但我不是100%肯定,因为我不完全理解你想要达到的目标。@TVAvanHesteren,你在说什么范围?这个范围意味着什么?摘要的长度是HashLength,out的长度是2*HashLength。这有什么问题吗?@TVAvanHesteren,你有没有在我的建议后尝试过你的代码,输出结果是否符合你的预期?@TVAvanHesteren,“HashLength outranges digest[i]”是什么意思?你为什么还要比较它们呢。HashLength是摘要的长度,摘要[i]只是数组的一个元素。@TVAvanHesteren,我不懂。你所说的变化摘要[i]是什么意思,我看不出它在循环中发生了变化。@TVAvanHesteren,我想你不需要改变其他任何东西。但我不是100%肯定,因为我不完全理解你想要达到的目标。@TVAvanHesteren,你在说什么范围?这个范围意味着什么?摘要的长度是HashLength,out的长度是2*HashLength。这有什么问题吗?@TVAvanHesteren,你有没有在我的建议后尝试过你的代码,输出结果是否符合你的预期?@TVAvanHesteren,“HashLength outranges digest[i]”是什么意思?你为什么还要比较它们呢。HashLength是摘要的长度,摘要[i]只是数组的一个元素。
char PBKDF2Hash[1025]; //\0 terminating space?
memset(PBKDF2Hash, 0, sizeof(PBKDF2Hash));
PBKDF2_HMAC_SHA_512_string("Password", "0123456789123456", 3500, 1024, PBKDF2Hash);
//PBKDF2Hash is now always 16 long -> strlen(PBKDF2Hash),
//while I expect it to be 2400 long?
//How is this possible and why is this happening?
//I can't figure it out