2013-08-13 4 views
1

Недавно я попытался сделать хеширование MD4 с помощью openssl в C: MD4 hash with openssl, save result into char array. Я хотел бы сделать это снова, но теперь использую EVP_Digest. Но с этим кодом Im получает ядро ​​сбрасывает - почему?MD4 openssl core dumped

#include <string.h> 
#include <stdio.h> 
#include <openssl/md4.h> 

int main() 
{ 
    unsigned char digest[MD4_DIGEST_LENGTH]; 
    char string[] = "hello world"; 

    EVP_Digest(string, strlen(string), digest, NULL, EVP_md4(), NULL); 

    char mdString[MD4_DIGEST_LENGTH*2+1]; 
    int i; 
    for(i = 0; i < MD4_DIGEST_LENGTH; i++) 
     sprintf(&mdString[i*2], "%02x", (unsigned int)digest[i]); 
    printf("md4 digest: %s\n", mdString); 

    return 0; 
} 
+0

Действительно ли пропускать NULL как 'hsize'? Я ожидал бы, что 'EVP_Digest' будет разыменовывать это, чтобы отметить длину данных, которые он пишет, на' digest' – simonc

+0

@simonc: Когда вы посмотрите на источник openssl, есть фрагмент кода, где они используют его, как я, поэтому Я использовал его так же, как и авторы. Но спасибо, проверит. – yak

+0

@simonc: yup, его вроде я написал = он ничего не изменил к сожалению :( – yak

ответ

2

Вы передаете NULL указатель EVP_Digest в качестве переменной длины вывода. Вам нужно сделать следующее:

unsigned int digestLen; 
EVP_Digest(string, strlen(string), digest, &digestLen, EVP_md4(), NULL); 

Даже если вы не используете длину выходной (вы должны, а не полагаться на постоянной), вам все равно нужно дать действительное место в памяти для функции EVP_Digest писать значение размера.

Кроме того, вы должны #include <openssl/evp.h>.