C MD4 openssl内核转储

C MD4 openssl内核转储,c,openssl,digest,message-digest,C,Openssl,Digest,Message Digest,我最近尝试在C:中使用openssl进行MD4哈希。我想再做一次,但现在使用EVP\u Digest。但是有了这段代码,我的内核被丢弃了——为什么 #include <string.h> #include <stdio.h> #include <openssl/md4.h> int main() { unsigned char digest[MD4_DIGEST_LENGTH]; char string[] = "hello world";

我最近尝试在C:中使用openssl进行MD4哈希。我想再做一次,但现在使用
EVP\u Digest
。但是有了这段代码,我的内核被丢弃了——为什么

#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;
}
#包括
#包括
#包括
int main()
{
无符号字符摘要[MD4_摘要_长度];
字符字符串[]=“hello world”;
EVP_摘要(字符串,strlen(字符串),摘要,NULL,EVP_md4(),NULL);
char mdString[MD4_DIGEST_LENGTH*2+1];
int i;
对于(i=0;i
您正在传递一个指向
EVP_Digest
NULL
指针作为输出长度变量。您需要执行以下操作:

unsigned int digestLen;
EVP_Digest(string, strlen(string), digest, &digestLen, EVP_md4(), NULL);
即使您不使用输出长度(您应该不依赖常量),您仍然需要为
EVP_Digest
函数提供有效的内存位置,以便将大小值写入


此外,您还应该
#include

将NULL传递为
hsize
是否有效?我希望
EVP_Digest
取消引用它,以注意它写入
Digest
@simonc的数据长度:当您查看openssl源代码时,有一段代码他们使用它时与我一样,这就是为什么我使用它与作者相同。但是谢谢,我会检查的。@simonc:是的,就像我写的那样=不幸的是,它没有改变任何东西:(@simonc:有趣的事。我在
valgrind
下运行了它,选项为:
valgrind--tool=memcheck--leak check=yes
,它没有给我任何错误,而且它打印了一个很好的md4哈希!发生了什么事?我的
valgrind
输出:对不起,我不确定。如果你正在运行linux,你可以检查glibc和o之间的不兼容您还可以尝试获取openssl代码,自己构建代码,然后在调试器中单步执行代码,以查看失败的确切位置。